Чи можу я замаскувати вхідний текст у 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 без «реклами» Майкрософт, так що єдиний вихідний рядок - це пароль (з 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.
Джої

Цікаво, що він повинен бути доступний з XP далі. Я підозрюю, що Win7 ще не зовсім закінчений, якщо він там не працює (або вам доведеться зробити ще одну хитрість, щоб змусити його працювати). Трохи досліджень показує, чому: дивіться моє оновлення.
paxdiablo

2
Приємно. Також добре зазначити, що ви можете замінити файл VBS на будь-яку еквівалентну мову, яку можна викликати з командного рядка. Наприклад, ви можете замінити розділ cscript на: "python -c" з getpass імпорту getpass; pwd = getpass (); print pwd; "'
Cerin

1
Колись це питання я використовував, коли це питання було новим - я відповів нижче, як це зробити без зайвих сценаріїв.
нечисте м'ясо

1
@Bill: Отже, мій розділ починається з "Зараз, на жаль, ..." :-) Однак я додав більше варіантів відповіді, щоб сподіватися, що вона стане кращою. Зокрема, скоріше використання повноважень scriptpw.dll.
paxdiablo

153

Так - я запізнився на 4 роки.

Але я знайшов спосіб зробити це в одному рядку без необхідності створювати зовнішній скрипт; за допомогою виклику команд powershell з пакетного файлу.

Завдяки TessellatingHeckler - без виведення в текстовий файл (я встановив команду powerhell в змінну, тому що вона досить безладна в одному довгому рядку для циклу 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%

Ця стаття пояснює, що роблять команди команд оболонки; По суті, він отримує введення за допомогою Read-Host -AsSecureString- наступні два рядки перетворюють цей захищений рядок у звичайний текст, а вихідний текст (пароль простого тексту) надсилається до текстового файлу за допомогою >.tmp.txt. Потім цей файл читається в змінну та видаляється.


5
Оригінальна відповідь була чудовою, але я думаю, це зараз має бути остаточним
Джеймс Вісман,

30
Це геніально. Але спосіб збереження простого текстового пароля на диску робить мене незручним. Уникайте цього, роблячи це замість цього: 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" та до кінця ")" є дві підставки, але має бути одна зворотна скринька.
TesselilingHeckler

1
@TessellatingHeckler Хороша ідея, я оновив свою відповідь. Трохи модифікована версія вашої пропозиції. Дякую.
нечисте м'ясо

Чи можна запобігти тому, щоб цей метод не лунав "*" (зірка) для кожного натискання клавіші? тобто я не хочу, щоб спостерігач знав, як довго триває пароль.
Сем Хаслер

1
@RegieBaguio Ні, вам знадобиться Powershell. Подивіться чистий Batch розчин npocmaka нижче. Це набагато складніше, але має працювати для вас.
нечисте м'ясо

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 Інший спосіб, заснований на команді заміни

@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 . Це гібридний файл .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 гібрид. Again слід зберегти як. .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
Моє гакітне відчуття поколювання, особливо у гібриду!
Марк К Коуан

2
Перше рішення дуже розумне - приємний +1.
нечисте

Метод 2.1, заснований на команді замінити, пропустить натискання клавіш, якщо ви швидко введете
Сем Хаслер

@SamHasler - так. Я спробую це виправити. Хоча не вдалося відтворити проблему з 2.1. Я також оновив HTA, щоб перевірити, чи натиснуто Enter.
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 - неправильний інструмент для роботи.
Марк К Коуан

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

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

9

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

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

Ця підпрограма написана на чистому Batch тому він не вимагає яких - небудь додаткових програм, і це дозволяє кілька відформатованих операцій введення, як читати тільки цифри, букви конвертовано в верхній регістр, і т.д. Ви можете завантажити ReadFormattedLine підпрограмою з прочитану рядок з форматом конкретного .


EDIT 2018-08-18 : Новий метод введення пароля "невидимий"

У команди FINDSTR є дивна помилка, яка трапляється, коли ця команда використовується для показу символів у кольорі І вихід такої команди перенаправляється на пристрій CON. Детальніше про те, як використовувати команду FINDSTR для відображення тексту кольором, див. У цій темі .

Коли висновок цієї форми команди FINDSTR перенаправляється на CON, після виведення тексту в потрібному кольорі відбувається щось дивне: весь текст після нього виводиться як "невидимі" символи, хоча більш точним описом є те, що текст є вивести у вигляді чорного тексту на чорному тлі. Оригінальний текст з’явиться, якщо ви скористаєтесь командою COLOR для скидання кольорів переднього плану та фону всього екрану. Однак, коли текст "невидимий", ми могли б виконати команду 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
James Jithin

Примітка: Утиліти 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

Я використав вищевказане рішення Блоргберда, яке, на мій погляд, насправді чудово. Потім я вдосконалив її наступним чином:

  1. Google for ansicon
  2. Завантажте zip-файл та зразок текстового файлу.
  3. Встановити (це означає скопіювати 2 файли в system32)

Використовуйте його так:

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

Це перемикає консоль на сірий на сірий колір для введення пароля і повертається назад, коли ви закінчите. ESC насправді повинен бути недрукованим символом, який ви можете скопіювати з завантаженого зразкового текстового файлу (з'являється як стрілка ліворуч у Блокноті) у свій пакетний файл. Ви можете використовувати зразок текстового файлу, щоб знайти коди для всіх комбінацій кольорів.

Якщо ви не адміністратор машини, ви, ймовірно, зможете встановити файли в несистемний каталог, тоді вам доведеться додати каталог до PATH у вашому сценарії перед тим, як викликати програму та використовувати послідовності запуску. Це, мабуть, може бути поточний каталог, якщо вам потрібен пакет, що не передається адміністратором, з декількох файлів.


Я не можу перевірити це, але очікую, що введений пароль з'явиться в історії cmd після цього.
Марк К Коуан

@MarkKCowan Саме так і відбувається.
sjngm

1

створити пакетний файл, який викликає потрібний для невидимих ​​символів, а потім створити ярлик для виклику пакетного файлу.

клацніть правою кнопкою миші

властивості

кольори

текст == чорний

фон == чорний

застосувати

гаразд

сподіваюся, таким чином допоможе вам !!!!!!!!


приємний підхід в сторону мислення, навіть якщо це не завжди практично в партійній ситуації через необхідність налаштування навколишнього середовища достроково. Про почекай, може бути , це буде працювати: stackoverflow.com/a/14447306/14420 або , можливо , stackoverflow.com/questions/4339649 / ...
матові Уїлкі

1

ОНОВЛЕННЯ:
Я додав два нові методи, які замість використання cls для приховування входу створюють нове спливаюче вікно лише одним рядком.

Недоліками є те, що один метод (метод 2) залишає сміття в реєстрі - "Якщо запустити без належних прав", а інший (метод три) додає до скрипту певну небажаність. Зайве говорити, що його можна легко записати на будь-який файл 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.

Оновлення: Я вважав, що повідомлення Sachadee є ідеальним, і я просто додав до нього свою "спливаючу" химерність.

@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 є для мене). (Я б додав як коментар, але сайт не дозволить мені.)
nimbell

Це не гарна відповідь. Ви не маскуєте і не ховаєте пароль. Будь ласка, коментуйте, коли у вас є хороше рішення або відповідь.
Anic17

-3

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

По-перше, дозвольте пояснити моє використання. У мене є близько 20 робочих станцій, які автоматично входять у Windows. У них є один ярлик на робочому столі - до клінічного застосування. Машини заблоковані, вони не можуть клацнути правою кнопкою миші, вони не можуть зробити нічого, крім доступу до однієї ярлика на робочому столі. Іноді для фахівця необхідно запустити деякі програми налагодження, переглядати Провідник Windows і переглядати файли журналів, не виходячи з облікового запису автологічного користувача.

Отже ось що я зробив.

Зробіть це як завгодно, але я розміщую два пакетні файли на загальній мережі, до якої має доступ заблокований комп'ютер.

Моє рішення використовує 1 основний компонент Windows - runas. Поставте ярлик для клієнтів до runas.bat, який ви збираєтеся створити. FYI, на своїх клієнтах я перейменував ярлик для кращого перегляду та змінив значок.

Вам потрібно буде створити два пакетні файли.

Я назвав пакетні файли 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.