Могу ли я замаскировать вводимый текст в bat-файле?


102

Я пишу командный файл для выполнения некоторых других программ. В этом случае мне нужно запросить пароль. Есть ли у меня способ замаскировать вводимый текст? Мне не нужно печатать символы ******* вместо вводимых символов. Достаточно поведения запроса пароля Linux (ничего не печатать при вводе).

@echo off
SET /P variable=Password : 
echo %variable%
Pause

Это прочитает ввод, но я не могу замаскировать текст, используя этот подход.


Ответы:


50

Вплоть до XP и Server 2003 вы можете использовать другой встроенный инструмент (VBScript) - следующие два скрипта выполняют нужную вам работу.

Во-первых getpwd.cmd:

@echo off
<nul: set /p passwd=Password: 
for /f "delims=" %%i in ('cscript /nologo getpwd.vbs') do set passwd=%%i
echo.

Тогда getpwd.vbs:

Set oScriptPW = CreateObject("ScriptPW.Password")
strPassword = oScriptPW.GetPassword()
Wscript.StdOut.WriteLine strPassword

getpwd.vbsПросто использует объект пароля для ввода пароля от пользователя , а затем распечатать его на стандартный вывод (в следующем параграфе будет объяснить , почему не появляется в терминале).

getpwd.cmdСценарий команды немного сложнее , но он в основном работает следующим образом .

Результатом этой "<nul: set /p passwd=Password: "команды является вывод приглашения без символа новой строки в конце - это хитрый способ эмулировать "echo -n"команду из bashоболочки. Он устанавливает passwdпустую строку в качестве несущественного побочного эффекта и не ждет ввода, поскольку принимает ввод с nul:устройства.

"for /f "delims=" %%i in ('cscript /nologo getpwd.vbs') do set passwd=%%i"Утверждение хитрая бит. Он запускает VBScript без «рекламы» Microsoft, поэтому единственная строка вывода - это пароль (из VBscript "Wscript.StdOut.WriteLine strPassword".

Установка разделителей на нулевое значение требуется для захвата всей строки ввода с пробелами, иначе вы получите только первое слово. В "for ... do set ..."битовых наборах passwdбыть фактическим выходным пароль от VBScript.

Затем мы выводим пустую строку (чтобы завершить "Password: "строку), и пароль будет в passwdпеременной среды после выполнения кода.


Теперь, как уже упоминалось, scriptpw.dllдоступен только до XP / 2003. Чтобы исправить это, вы можете просто скопировать scriptpw.dllфайл из Windows\System32папки системы XP / 2003 в папку Winnt\System32или Windows\System32в вашей собственной системе. После того, как DLL будет скопирована, вам нужно будет зарегистрировать ее, запустив:

regsvr32 scriptpw.dll

Чтобы успешно зарегистрировать DLL в Vista и более поздних версиях, вам потребуются права администратора. Я не проверял законность такого шага, так пещерный лектор.


Если вы не слишком заинтересованы в поиске и регистрации старых DLL-файлов (для удобства или по юридическим причинам), есть другой способ. Более поздние версии Windows (те, в которых нет необходимой DLL) должны иметь доступный Powershell.

И, на самом деле, вам действительно следует подумать об обновлении ваших скриптов, чтобы использовать его в полной мере, поскольку это гораздо более функциональный язык сценариев, чем cmd.exe. Однако, если вы хотите сохранить основную часть кода в виде cmd.exeсценариев (например, если у вас много кода, который вы не хотите преобразовывать), вы можете использовать тот же прием.

Во-первых, измените cmdскрипт так, чтобы он вызывал Powershell, а не CScript:

@echo off
for /f "delims=" %%i in ('powershell -file getpwd.ps1') do set passwd=%%i

Скрипт Powershell столь же прост:

$password = Read-Host "Enter password" -AsSecureString
$password = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($password)
$password = [Runtime.InteropServices.Marshal]::PtrToStringAuto($password)
echo $password

хотя с некоторым упорядочением, чтобы получить фактический текст пароля.

Помните, что для запуска локальных неподписанных сценариев Powershell на вашем компьютере вам может потребоваться изменить политику выполнения с (драконовского, хотя и очень безопасного) значения по умолчанию, примерно таким:

set-executionpolicy remotesigned

изнутри самого Powershell.


2
Ого, это <nul: set / p действительно круто. Пока не знал :-). Но VBScript у меня не работает: ошибка времени выполнения Microsoft VBScript: компонент ActiveX не может создать объект: 'ScriptPW.Password'. Windows 7 Beta x64 здесь.
Joey

Интересно, что это должно быть доступно с XP. Я подозреваю, что Win7 еще не доработан, если он там не работает (или вам нужно проделать еще один трюк, чтобы заставить его работать). Небольшое исследование показывает, почему: см. Мое обновление.
paxdiablo

2
Ницца. Также полезно отметить, что вы можете заменить файл VBS на любой эквивалентный язык, который можно вызвать из командной строки. Например, вы можете заменить раздел cscript на: 'python -c "from getpass import getpass; pwd = getpass (); print pwd;"'
Cerin

1
Я использовал этот способ назад, когда этот вопрос был новым - я ответил ниже, как сделать это без дополнительных скриптов.
unclemeat 03

1
@Bill: Следовательно, мой раздел начинается с «Теперь, к сожалению, ...» :-) Однако я добавил больше вариантов ответа, чтобы, надеюсь, сделать его лучше. В частности, использование powershell, а не scriptpw.dll.
paxdiablo

154

Да, я опоздал на 4 года.

Но я нашел способ сделать это одной строкой, не создавая внешний скрипт; вызывая команды PowerShell из командного файла.

Благодаря TessellatingHeckler - без вывода в текстовый файл (я установил команду powershell в переменной, потому что одна длинная строка внутри цикла for довольно беспорядочная).

@echo off
set "psCommand=powershell -Command "$pword = read-host 'Enter Password' -AsSecureString ; ^
    $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword); ^
        [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)""
for /f "usebackq delims=" %%p in (`%psCommand%`) do set password=%%p
echo %password%

Первоначально я писал его для вывода в текстовый файл, а затем читал из этого текстового файла. Но вышеописанный способ лучше. В одной очень длинной, почти непонятной строке:

@echo off
powershell -Command $pword = read-host "Enter password" -AsSecureString ; $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword) ; [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR) > .tmp.txt & set /p password=<.tmp.txt & del .tmp.txt
echo %password%

Я разобью это - вы можете разделить его на несколько строк с помощью каретки ^, что намного приятнее ...

@echo off
powershell -Command $pword = read-host "Enter password" -AsSecureString ; ^
    $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword) ; ^
        [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR) > .tmp.txt 
set /p password=<.tmp.txt & del .tmp.txt
echo %password%

В этой статье объясняется, что делают команды PowerShell; по сути, он получает ввод с помощью Read-Host -AsSecureString- следующие две строки конвертируют эту защищенную строку обратно в простой текст, вывод (пароль в виде обычного текста) затем отправляется в текстовый файл с использованием >.tmp.txt. Затем этот файл считывается в переменную и удаляется.


6
Первоначальный ответ был отличным, но я думаю, что теперь он должен быть окончательным
Джеймс Уайзман,

31
Это великолепно. Но то, как он сохраняет простой текстовый пароль на диск, меня не устраивает. Избегайте этого, сделав вместо этого: for /f "usebackq tokens=*" %%p in (``powershell -Command "$pword = read-host 'Enter Password' -AsSecureString ; $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword); [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)"``) do set password=%%pа затем echo %password%. NB. Я не могу заставить этот комментарий правильно экранировать обратные кавычки - перед "powershell" и перед концом ")" два обратных кавычки, но должно быть одно обратное.
TessellatingHeckler

2
@TessellatingHeckler Хорошая идея, я обновил свой ответ. Немного измененная версия вашего предложения. Спасибо.
unclemeat

Можно ли запретить этому методу повторять эхо "*" (звездочка) при каждом нажатии клавиши? т.е. я не хочу, чтобы наблюдатель знал, как долго пароль.
Сэм Хаслер,

1
@RegieBaguio Нет, вам понадобится Powershell. Взгляните на чистый пакетный раствор npocmaka ниже. Это намного сложнее, но должно работать на вас.
unclemeat 07

26

1. Чистое пакетное решение, в котором (ab) используется XCOPYкоманда и ее /P /Lпереключатели, которые можно найти здесь (некоторые улучшения можно найти здесь ):

:: Hidden.cmd
::Tom Lavedas, 02/05/2013, 02/20/2013
::Carlos, 02/22/2013
::https://groups.google.com/forum/#!topic/alt.msdos.batch.nt/f7mb_f99lYI


@Echo Off
:HInput
SetLocal EnableExtensions EnableDelayedExpansion
Set "FILE=%Temp%.\T"
Set "FILE=.\T"
Keys List >"%File%"
Set /P "=Hidden text ending with Ctrl-C?: " <Nul
Echo.
Set "HInput="
:HInput_
For /F "tokens=1* delims=?" %%A In (
 '"Xcopy /P /L "%FILE%" "%FILE%" 2>Nul"'
) Do (
  Set "Text=%%B"
  If Defined Text (
    Set "Char=!Text:~1,1!"
    Set "Intro=1"
    For /F delims^=^ eol^= %%Z in ("!Char!") Do Set "Intro=0"
    Rem If press Intro
    If 1 Equ !Intro! Goto :HInput#
    Set "HInput=!HInput!!Char!"
  )
)
Goto :HInput_
:HInput#
Echo(!HInput!
Goto :Eof 

1.2 Другой способ, основанный на команде replace

@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion

Set /P "=Enter a Password:" < Nul
Call :PasswordInput
Echo(Your input was:!Line!

Goto :Eof

:PasswordInput
::Author: Carlos Montiers Aguilera
::Last updated: 20150401. Created: 20150401.
::Set in variable Line a input password
For /F skip^=1^ delims^=^ eol^= %%# in (
'"Echo(|Replace.exe "%~f0" . /U /W"') Do Set "CR=%%#"
For /F %%# In (
'"Prompt $H &For %%_ In (_) Do Rem"') Do Set "BS=%%#"
Set "Line="
:_PasswordInput_Kbd
Set "CHR=" & For /F skip^=1^ delims^=^ eol^= %%# in (
'Replace.exe "%~f0" . /U /W') Do Set "CHR=%%#"
If !CHR!==!CR! Echo(&Goto :Eof
If !CHR!==!BS! (If Defined Line (Set /P "=!BS! !BS!" <Nul
Set "Line=!Line:~0,-1!"
)
) Else (Set /P "=*" <Nul
If !CHR!==! (Set "Line=!Line!^!"
) Else Set "Line=!Line!!CHR!"
)
Goto :_PasswordInput_Kbd

2. Средство отправки пароля, которое использует всплывающее окно HTA . Это файл Hybrit .bat / jscript / mshta, который следует сохранить как .bat :

<!-- :
:: PasswordSubmitter.bat
@echo off
for /f "tokens=* delims=" %%p in ('mshta.exe "%~f0"') do (
    set "pass=%%p"
)

echo your password is %pass%
exit /b
-->

<html>
<head><title>Password submitter</title></head>
<body>

    <script language='javascript' >
        window.resizeTo(300,150);
        function entperPressed(e){
                if (e.keyCode == 13) {
                    pipePass();
                }
        }
        function pipePass() {
            var pass=document.getElementById('pass').value;
            var fso= new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1);
            close(fso.Write(pass));

        }
    </script>

    <input type='password' name='pass' size='15' onkeypress="return entperPressed(event)" ></input>
    <hr>
    <button onclick='pipePass()'>Submit</button>

</body>
</html>

3. Самостоятельно скомпилированный гибрид .net. Снова следует сохранить как. .batВ отличие от других решений, он создаст / скомпилирует небольшой файл .exe, который будет вызываться (при желании его можно удалить). Также требуется установленный .net framework, но это не проблема:

@if (@X)==(@Y) @end /* JScript comment
@echo off
setlocal enableDelayedExpansion

for /f "tokens=* delims=" %%v in ('dir /b /s /a:-d  /o:-n "%SystemRoot%\Microsoft.NET\Framework\*jsc.exe"') do (
   set "jsc=%%v"
)

if not exist "%~n0.exe" (
    "%jsc%" /nologo /out:"%~n0.exe" "%~dpsfnx0"
)

for /f "tokens=* delims=" %%p in ('"%~n0.exe"') do (
    set "pass=%%p"
)

echo your password is !pass!

endlocal & exit /b %errorlevel%

*/



import System;



var pwd = "";
var key;

Console.Error.Write("Enter password: ");

        do {
           key = Console.ReadKey(true);

           if ( (key.KeyChar.ToString().charCodeAt(0)) >= 20 && (key.KeyChar.ToString().charCodeAt(0) <= 126) ) {
              pwd=pwd+(key.KeyChar.ToString());
              Console.Error.Write("*");
           }

           if ( key.Key == ConsoleKey.Backspace && pwd.Length > 0 ) {
               pwd=pwd.Remove(pwd.Length-1);
               Console.Error.Write("\b \b");
           }


        } while (key.Key != ConsoleKey.Enter);
        Console.Error.WriteLine();
        Console.WriteLine(pwd);

6
Мое хакерское чутье покалывает, особенно в отношении гибрида!
Mark K Cowan

2
Это первое решение очень умное - хорошее +1.
unclemeat

Метод 2.1, основанный на команде replace, пропустит нажатия клавиш, если вы набираете быстро
Сэм Хаслер,

@SamHasler - да, я постараюсь исправить это, хотя воспроизвести проблему с 2.1 не удалось. Я также обновил HTA, чтобы проверить, нажата ли клавиша ввода.
npocmaka

1
@npocmaka последняя версия метода 1.2 (последнее обновление: 20150405) находится здесь: consolesoft.com/batch/password_input/password_input.cmd
carlos

16

Я бы, наверное, просто сделал:

..
echo Before you enter your password, make sure no-one is looking!
set /P password=Password:  
cls
echo Thanks, got that.
.. 

Таким образом, вы получаете приглашение, а затем экран очищается после ввода.

Обратите внимание, что введенный пароль будет сохранен в истории CMD, если командный файл запускается из командной строки (спасибо @Mark K Cowan ).

Если этого было недостаточно, я бы либо переключился на python, либо написал исполняемый файл вместо скрипта.

Я знаю, что ни один из этих рецептов не идеален, но, возможно, вам подойдет один :)


4
Обратите внимание, что введенный пароль будет сохранен в истории CMD, если командный файл запускается из командной строки. Никаких отрицательных голосов, поскольку вы уже почти сказали, что cmd - неподходящий инструмент для работы.
Mark K Cowan

Вы можете запустить doskey /reinstallочистку буфера предыдущей команды сразу после этого cls, если история команд в консоли для вас не важна.
RuntimeException

1
если вы не хотите использовать doskey / переустановить и очистить историю команд, другой вариант - запустить указанный выше код в отдельном окне терминала и немедленно выйти из него. Обратите внимание, что он по-прежнему не заменяет введенную вами строку со звездочками. Вышеупомянутое решение - вариант, если вы не хотите запускать powershell. C:\>start "console" cmd /c ireadconsole.bat
RuntimeException

9

Вы можете использовать подпрограмму ReadFormattedLine для всех видов форматированного ввода. Например, приведенная ниже команда считывает пароль из 8 символов, отображает звездочки на экране и автоматически продолжает работу без необходимости нажимать Enter:

call :ReadFormattedLine password="********" /M "Enter password (8 chars): "

Эта подпрограмма написана в чистом пакетном режиме, поэтому она не требует какой-либо дополнительной программы и позволяет выполнять несколько операций форматированного ввода, таких как чтение только чисел, преобразование букв в верхний регистр и т. Д. Вы можете загрузить подпрограмму ReadFormattedLine из Прочитать строку в определенном формате .


РЕДАКТИРОВАТЬ 2018-08-18 : Новый метод для ввода «невидимого» пароля

У команды FINDSTR есть странная ошибка, которая происходит, когда эта команда используется для отображения символов в цвете, И вывод такой команды перенаправляется на устройство CON. Подробнее о том, как использовать команду FINDSTR для отображения текста в цвете, см. В этом разделе .

Когда вывод этой формы команды FINDSTR перенаправляется на CON, после вывода текста желаемого цвета происходит что-то странное: весь текст после него выводится как "невидимые" символы, хотя более точное описание состоит в том, что текст является выводить как черный текст на черном фоне. Исходный текст появится, если вы используете команду ЦВЕТ для сброса цветов переднего плана и фона всего экрана. Однако, когда текст «невидим», мы можем выполнить команду SET / P, поэтому все введенные символы не будут отображаться на экране.

@echo off
setlocal

set /P "=_" < NUL > "Enter password"
findstr /A:1E /V "^$" "Enter password" NUL > CON
del "Enter password"
set /P "password="
cls
color 07
echo The password read is: "%password%"

5

другой альтернативой являются мои инструменты командной строки EditV32 (x86) или EditV64 (x64). Например:

editv32 -m -p "Password: " PWD

-m означает «маскированный ввод», а -p - приглашение. Ввод пользователя сохраняется в переменной среды PWD. Вы можете получить его здесь:

https://westmesatech.com/?page_id=19


5
Это не единственное решение с закрытым исходным кодом (Windows является закрытым исходным кодом!). Конечно, вы можете не использовать его ...
Bill_Stewart

Если вас беспокоит отсутствие исходного кода, посмотрите мой другой ответ, касающийся ReadLine.exe .
Bill_Stewart

Хороший! Лицензия позволяет вам его использовать. Более того, легко интегрируется. Просто для обработки кода выхода 1. Ошибка в командной строке, 2 Строка ввода пуста, 3 Переменная среды не была изменена, 4 Программа прервана с помощью Ctrl-C
Джеймс Джитин

Примечание. Утилиты editenv32 / editenv64 и readline были заменены утилитой editenv с открытым исходным кодом.
Bill_Stewart,

4

Если вас беспокоит отсутствие исходного кода, у меня есть другая альтернатива.

@echo off
for /f "delims=" %%p in ('ReadLine -h -p "Enter password: "') do set PWD=%%p
echo You entered: %PWD%

Вы можете получить его на https://westmesatech.com/?page_id=49 . Исходный код прилагается.


Примечание. Утилиты editenv32 / editenv64 и readline были заменены утилитой editenv с открытым исходным кодом.
Bill_Stewart

3

Если у вас установлен Python, вы можете использовать:

for /f "delims=" %%A in ('python -c "import getpass; print(getpass.getpass('Enter the CVS password: '));"') do @set CVSPASS=%%A
echo PASS: %CVSPASS%

выход:

Enter the CVS password:
PASS: 123

2

Я использовал вышеуказанное решение Blorgbeard, которое, на мой взгляд, действительно здорово. Затем я улучшил его следующим образом:

  1. Google для ansicon
  2. Загрузите zip-файл и образец текстового файла.
  3. Установить (то есть скопировать 2 файла в system32)

Используйте это так:

@echo off
ansicon -p
set /p pwd=Password:ESC[0;37;47m
echo ESC[0m

При этом консоль становится серой на серый цвет для ввода пароля и переключается обратно, когда вы закончите. На самом деле ESC должен быть непечатаемым символом, который вы можете скопировать из загруженного образца текстового файла (отображается как стрелка влево в Блокноте) в свой командный файл. Вы можете использовать образец текстового файла, чтобы найти коды для всех цветовых комбинаций.

Если вы не являетесь администратором компьютера, вы, вероятно, сможете установить файлы в несистемный каталог, тогда вам нужно добавить каталог в PATH в вашем сценарии перед вызовом программы и использованием escape-последовательностей. Возможно, это может быть даже текущий каталог, если вам нужен не-администраторский распространяемый пакет всего из нескольких файлов.


Я не могу это проверить, но ожидаю, что набранный пароль появится в истории команд позже.
Mark K Cowan

@MarkKCowan Именно это и происходит.
sjngm

1

создайте пакетный файл, который вызывает тот, который нужен для невидимых символов, затем создайте ярлык для вызываемого пакетного файла.

щелкните правой кнопкой мыши

свойства

цвета

текст == черный

фон == черный

подать заявление

хорошо

надеюсь таким образом поможет вам !!!!!!!!


хороший подход бокового мышления, даже если он не всегда практичен в пакетной ситуации из-за необходимости заранее настроить среду. Ой,
подождите

1

ОБНОВЛЕНИЕ:
я добавил два новых метода, которые вместо использования cls для скрытия ввода создают новое всплывающее окно только с одной строкой.

Недостатки в том, что один метод (метод 2) оставляет в реестре мусор - «При запуске без соответствующих прав», а другой (метод 3) добавляет в скрипт мусор. Излишне говорить, что его можно легко записать в любой файл tmp и удалить, я просто попытался придумать альтернативу.

Ограничение: пароль может быть только буквенно-цифровым - никаких других символов!

@echo off
if "%1"=="method%choice%" goto :method%choice%
::::::::::::::::::
::Your code here::
::::::::::::::::::
cls
echo :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
echo ::::                   Batch script to prompt for password!                 :::
echo :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:choice
echo.
echo 1. First method
echo.
echo 2. Second method
echo.
echo 3. Third method
echo.
set/p choice=Choose a method: 
if "%choice%" gtr "3" echo. & echo invalid option & echo. & pause & goto choice

call :vars
    set options= %num%%smAlph%%cpAlph%
    set pwdLen=6

if "%choice%" == "1" (
    set /p=Password: <nul 
    for /l %%i in (1,1,%pwdLen%) do call :password
) else (
    start /wait cmd /c call "%~f0" method%choice%
    )

call :result%choice%


::just to see if it worked!
echo.
echo The Password you entered is: "%pwd%"&pause>nul

::::::::::::::::::
::More code here::
::::::::::::::::::
exit /b





:vars
set num=1234567890
set smAlph=abcdefghijklmnopqrstuvwxyz
set cpAlph=ABCDEFGHIJKLMNOPQRSTUVWXYZ
    set pwd=
goto :EOF


:method2
call :popUp
setx result %pwd% >nul
goto :EOF

:method3
call :popUp
    >> "%~f0" echo.
    >> "%~f0" echo :result%choice%
    >> "%~f0" echo set pwd=%pwd%
goto :EOF

:popUp
title Password
mode con lines=1 cols=30
color 5a
set /p=Password: <nul
for /l %%i in (1,1,%pwdLen%) do call :password
goto :EOF

:password
:: If you don't want case sensative remove "/cs" but remember to remove %cpAlph% from the %options%
choice /c %options% /n /cs >nul
    call SET pwd=%pwd%%%options:~%errorlevel%,1%%
    set /p =*<nul
GOTO :EOF


:result2
for /f "tokens=3" %%a in ('reg query hkcu\environment /v result') do set pwd=%%a
    setx result "" >nul
    reg delete hkcu\environment /v result /f >nul 2>&1
:result1
goto :EOF   
::You can delete from here whenever you want.

Обновление: я нашел сообщение Сашади идеальным, и я просто добавил к нему свою «всплывающую» причуду.

@Echo Off  
  SetLocal EnableDelayedExpansion
  if "%1"==":HInput" goto :HInput
  set r=r%random%
  start /wait cmd /c call "%~f0" :HInput

For /f "tokens=2,13 delims=, " %%a in (
    'tasklist /v /fo csv /fi "imagename eq cmd.exe"
    ^|findstr /v "Windows\\system32\\cmd.exe"
    ^|findstr "set /p=%r%"'
     ) do (
        set pid=%%a
        set Line=%%b
        set Line=!Line:%r%=!
        set Line=!Line:~,-2!
        )       
taskkill /pid %pid:"=%>nul
  goto :HIEnd


  :HInput
  SetLocal DisableDelayedExpansion
  title Password
  mode con lines=2 cols=30

Echo Enter your Code :
   Set "Line="
   For /F %%# In (
   '"Prompt;$H&For %%# in (1) Do Rem"'
   ) Do Set "BS=%%#"

  :HILoop
   Set "Key="
   For /F "delims=" %%# In (
   'Xcopy /W "%~f0" "%~f0" 2^>Nul'
   ) Do If Not Defined Key Set "Key=%%#"
   Set "Key=%Key:~-1%"
   SetLocal EnableDelayedExpansion
   If Not Defined Key start /min cmd /k mode con lines=1 cols=14 ^&set/p %r%!Line!=&exit
  If %BS%==^%Key% (Set /P "=%BS% %BS%" <Nul
   Set "Key="
   If Defined Line Set "Line=!Line:~0,-1!"
   ) Else Set /P "=*" <Nul
   If Not Defined Line (EndLocal &Set "Line=%Key%"
   ) Else For /F delims^=^ eol^= %%# In (
   "!Line!") Do EndLocal &Set "Line=%%#%Key%"
  Goto :HILoop

  :HIEnd
   Echo(
Echo Your code is :  "!Line!"
   Pause
   Goto :Eof

1

Я написал программу с открытым исходным кодом, editenvкоторая заменяет мои старые editv32/ editv64утилиты:

https://github.com/Bill-Stewart/editenv

Параметр --maskinput( -m) [*] позволяет скрыть (замаскировать) введенный ввод и имеет настраиваемый символ (символ по умолчанию *); например:

editenv -m -p "Password: " PWD

Параметр --prompt( -p) позволяет указать приглашение для ввода. Приведенное выше отобразит Password:подсказку и будет ждать, пока вы что-то введете. Введенные символы будут отображаться как *. Нажатие Ctrl+ Cзавершит программу с кодом выхода 1223.

Скачать здесь:

https://github.com/Bill-Stewart/editenv/releases

[*] Обратите внимание, что опция --maskinput( -m) небезопасна - введенная строка вводится в среде как обычный текст. Эта функция предназначена только для удобства.



-1
@echo off
color 0f
MODE CON COLS=132 LINES=50
:start
cls
choice /C ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!?.# /N /CS /M Please enter your password to continue. (Valid characters include all letters, numbers, and ! ? .) Press # to submit: 
SET ecode=%ERRORLEVEL%
IF %ecode% EQU 66 goto submit
IF %ecode% EQU 1 SET out=A
IF %ecode% EQU 2 SET out=B
IF %ecode% EQU 3 SET out=C
IF %ecode% EQU 4 SET out=D
IF %ecode% EQU 5 SET out=E
IF %ecode% EQU 6 SET out=F
IF %ecode% EQU 7 SET out=G
IF %ecode% EQU 8 SET out=H
IF %ecode% EQU 9 SET out=I
IF %ecode% EQU 10 SET out=J
IF %ecode% EQU 11 SET out=K
IF %ecode% EQU 12 SET out=L
IF %ecode% EQU 13 SET out=M
IF %ecode% EQU 14 SET out=N
IF %ecode% EQU 15 SET out=O
IF %ecode% EQU 16 SET out=P
IF %ecode% EQU 17 SET out=Q
IF %ecode% EQU 18 SET out=R
IF %ecode% EQU 19 SET out=S
IF %ecode% EQU 20 SET out=T
IF %ecode% EQU 21 SET out=U
IF %ecode% EQU 22 SET out=V
IF %ecode% EQU 23 SET out=W
IF %ecode% EQU 24 SET out=X
IF %ecode% EQU 25 SET out=Y
IF %ecode% EQU 26 SET out=Z
IF %ecode% EQU 27 SET out=a
IF %ecode% EQU 28 SET out=b
IF %ecode% EQU 29 SET out=c
IF %ecode% EQU 30 SET out=d
IF %ecode% EQU 31 SET out=e
IF %ecode% EQU 32 SET out=f
IF %ecode% EQU 33 SET out=g
IF %ecode% EQU 34 SET out=h
IF %ecode% EQU 35 SET out=i
IF %ecode% EQU 36 SET out=j
IF %ecode% EQU 37 SET out=k
IF %ecode% EQU 38 SET out=l
IF %ecode% EQU 39 SET out=m
IF %ecode% EQU 40 SET out=n
IF %ecode% EQU 41 SET out=o
IF %ecode% EQU 42 SET out=p
IF %ecode% EQU 43 SET out=q
IF %ecode% EQU 44 SET out=r
IF %ecode% EQU 45 SET out=s
IF %ecode% EQU 46 SET out=t
IF %ecode% EQU 47 SET out=u
IF %ecode% EQU 48 SET out=v
IF %ecode% EQU 49 SET out=w
IF %ecode% EQU 50 SET out=x
IF %ecode% EQU 51 SET out=y
IF %ecode% EQU 52 SET out=z
IF %ecode% EQU 53 SET out=0
IF %ecode% EQU 54 SET out=1
IF %ecode% EQU 55 SET out=2
IF %ecode% EQU 56 SET out=3
IF %ecode% EQU 57 SET out=4
IF %ecode% EQU 58 SET out=5
IF %ecode% EQU 59 SET out=6
IF %ecode% EQU 60 SET out=7
IF %ecode% EQU 61 SET out=8
IF %ecode% EQU 62 SET out=9
IF %ecode% EQU 63 SET out=!
IF %ecode% EQU 64 SET out=?
IF %ecode% EQU 65 SET out=.
SET code=%out%
SET show=*
:loop
cls
choice /C ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!?.# /N /CS /M Please enter your password to continue. (Valid characters include all letters, numbers, and ! ? .) Press # to submit: %code%
SET ecode=%ERRORLEVEL%
IF %ecode% EQU 66 goto submit
IF %ecode% EQU 1 SET out=A
IF %ecode% EQU 2 SET out=B
IF %ecode% EQU 3 SET out=C
IF %ecode% EQU 4 SET out=D
IF %ecode% EQU 5 SET out=E
IF %ecode% EQU 6 SET out=F
IF %ecode% EQU 7 SET out=G
IF %ecode% EQU 8 SET out=H
IF %ecode% EQU 9 SET out=I
IF %ecode% EQU 10 SET out=J
IF %ecode% EQU 11 SET out=K
IF %ecode% EQU 12 SET out=L
IF %ecode% EQU 13 SET out=M
IF %ecode% EQU 14 SET out=N
IF %ecode% EQU 15 SET out=O
IF %ecode% EQU 16 SET out=P
IF %ecode% EQU 17 SET out=Q
IF %ecode% EQU 18 SET out=R
IF %ecode% EQU 19 SET out=S
IF %ecode% EQU 20 SET out=T
IF %ecode% EQU 21 SET out=U
IF %ecode% EQU 22 SET out=V
IF %ecode% EQU 23 SET out=W
IF %ecode% EQU 24 SET out=X
IF %ecode% EQU 25 SET out=Y
IF %ecode% EQU 26 SET out=Z
IF %ecode% EQU 27 SET out=a
IF %ecode% EQU 28 SET out=b
IF %ecode% EQU 29 SET out=c
IF %ecode% EQU 30 SET out=d
IF %ecode% EQU 31 SET out=e
IF %ecode% EQU 32 SET out=f
IF %ecode% EQU 33 SET out=g
IF %ecode% EQU 34 SET out=h
IF %ecode% EQU 35 SET out=i
IF %ecode% EQU 36 SET out=j
IF %ecode% EQU 37 SET out=k
IF %ecode% EQU 38 SET out=l
IF %ecode% EQU 39 SET out=m
IF %ecode% EQU 40 SET out=n
IF %ecode% EQU 41 SET out=o
IF %ecode% EQU 42 SET out=p
IF %ecode% EQU 43 SET out=q
IF %ecode% EQU 44 SET out=r
IF %ecode% EQU 45 SET out=s
IF %ecode% EQU 46 SET out=t
IF %ecode% EQU 47 SET out=u
IF %ecode% EQU 48 SET out=v
IF %ecode% EQU 49 SET out=w
IF %ecode% EQU 50 SET out=x
IF %ecode% EQU 51 SET out=y
IF %ecode% EQU 52 SET out=z
IF %ecode% EQU 53 SET out=0
IF %ecode% EQU 54 SET out=1
IF %ecode% EQU 55 SET out=2
IF %ecode% EQU 56 SET out=3
IF %ecode% EQU 57 SET out=4
IF %ecode% EQU 58 SET out=5
IF %ecode% EQU 59 SET out=6
IF %ecode% EQU 60 SET out=7
IF %ecode% EQU 61 SET out=8
IF %ecode% EQU 62 SET out=9
IF %ecode% EQU 63 SET out=!
IF %ecode% EQU 64 SET out=?
IF %ecode% EQU 65 SET out=.
SET code=%code%%out%
SET show=%show%*
goto loop
:submit
cls
SET password=%code%
IF %password% EQU 0cZrocks! SET result=1
IF ELSE SET result=2
IF %result% EQU 1 echo password correct
IF %result% EQU 2 echo password incorrect
timeout /T 2 /NOBREAK >nul
cls
IF %result% EQU 1 goto end
IF ELSE goto start
:end

Вы не объяснили код, а просто скопировали этот код. Это не лучший способ сделать это, так как вам нужно обновить экран, а пароль должен быть длиной x символов.
Anic17,

-1

Другой вариант, аналогичный тому, что отсутствует у Blorgbeard , - это использовать что-то вроде:

SET /P pw=C:\^>

Это ^экранирует, >так что запрос пароля будет выглядеть как стандартное приглашение консоли cmd.


1
Вопрос не в том, как скрыть / замаскировать запрос пароля, а в том, чтобы предотвратить отображение пароля при наборе текста. Так что это не (пытаюсь) ответить на вопрос.
Стефан

Нет и ответа, на который я ссылался (на момент написания которого было 13 голосов). Мой ответ просто расширяется, так как это может быть полезной альтернативой для некоторых (поскольку Blogbeard отсутствует для меня). (Я бы добавил в качестве комментария, но сайт мне не разрешает.)
Нимбелл

Это не лучший ответ. Вы не маскируете и не скрываете пароль. Прокомментируйте, если у вас будет хорошее решение или ответ.
Anic17

-3

Я читал все неуклюжие решения в сети о том, как маскировать пароли в пакетном файле, те, которые используются с помощью решения hide.com, и даже те, которые делают текст и фон одинаковым цветом. Решение hide.com работает прилично, не очень безопасно и не работает в 64-битной Windows. Так или иначе, используя 100% утилиты Microsoft, выход есть!

Во-первых, позвольте мне объяснить, как я использую. У меня около 20 рабочих станций с автоматическим входом в Windows. У них на рабочем столе есть один ярлык - к клиническому приложению. Машины заблокированы, они не могут щелкнуть правой кнопкой мыши, они не могут ничего делать, кроме доступа к одному ярлыку на своем рабочем столе. Иногда техническому специалисту необходимо запустить некоторые отладочные приложения, просмотреть проводник Windows и просмотреть файлы журнала без выхода из учетной записи пользователя autolog.

Итак, вот что я сделал.

Делайте это, как хотите, но я поместил два своих командных файла в общий сетевой ресурс, к которому у заблокированного компьютера есть доступ.

В моем решении используется 1 основной компонент Windows - runas. Разместите на клиентах ярлык для runas.bat, который вы собираетесь создать. К вашему сведению, на своих клиентах я переименовал ярлык для лучшего просмотра и изменил значок.

Вам нужно будет создать два командных файла.

Я назвал командные файлы runas.bat и Debug Support.bat.

runas.bat содержит следующий код:

cls
@echo off
TITLE CHECK CREDENTIALS 
goto menu

:menu
cls
echo.
echo           ....................................
echo            ~Written by Cajun Wonder 4/1/2010~
echo           ....................................
echo.
@set /p un=What is your domain username? 
if "%un%"=="PUT-YOUR-DOMAIN-USERNAME-HERE" goto debugsupport
if not "%un%"=="PUT-YOUR-DOMAIN-USERNAME-HERE" goto noaccess
echo.
:debugsupport
"%SYSTEMROOT%\system32\runas" /netonly /user:PUT-YOUR-DOMAIN-NAME-HERE\%un% "\\PUT-YOUR-NETWORK-SHARE-PATH-HERE\Debug Support.bat"
@echo ACCESS GRANTED! LAUNCHING THE DEBUG UTILITIES....
@ping -n 4 127.0.0.1 > NUL
goto quit
:noaccess
cls
@echo.
@echo.
@echo.
@echo.
@echo   \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
@echo   \\                                   \\
@echo   \\    Insufficient privileges         \\  
@echo   \\                                    \\
@echo   \\      Call Cajun Wonder             \\
@echo   \\                                    \\
@echo   \\              At                    \\
@echo   \\                                    \\
@echo   \\        555-555-5555                \\
@echo   \\                                    \\
@echo   \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
@ping -n 4 127.0.0.1 > NUL
goto quit
@pause
:quit
@exit

Вы можете добавить столько, если «% un%», а если не «% un%», для всех пользователей, которым вы хотите предоставить доступ. @Ping - это мой способ создания секундного таймера.

Итак, это касается первого командного файла - довольно просто, а?

Вот код для Debug Support.bat:

cls
@echo off
TITLE SUPPORT UTILITIES
goto menu

:menu
cls
@echo %username%
echo.
echo           .....................................
echo            ~Written by Cajun Wonder 4/1/2010~
echo           .....................................
echo.
echo What do you want to do? 
echo.
echo [1]  Launch notepad
echo.

:choice
set /P C=[Option]? 
if "%C%"=="1" goto notepad
goto choice

:notepad
echo.
@echo starting notepad....
@ping -n 3 127.0.0.1 > NUL
start notepad
cls
goto menu

Я не программист и действительно только начал заниматься пакетным скриптингом около года назад, и этот раунд способа, который я обнаружил для маскировки пароля в пакетном файле, довольно крутой!

Я надеюсь услышать, что кто-то другой, кроме меня, сможет извлечь из этого пользу!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.