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"문은 까다로운 비트입니다. Microsoft "광고"없이 VBScript를 실행하므로 유일한 줄 출력은 암호 (VBscript "Wscript.StdOut.WriteLine strPassword".

공백이있는 전체 입력 행을 캡처하려면 구분 기호를 아무것도 설정하지 않아도됩니다. 그렇지 않으면 첫 번째 단어 만 표시됩니다. "for ... do set ..."비트 세트 passwdVBScript를 실제의 패스워드 출력한다.

그런 다음 빈 줄을 에코하고 (줄을 종료하기 위해 "Password: ") passwd코드가 실행 된 후 암호가 환경 변수에 있습니다.


이제 언급했듯이 scriptpw.dllXP / 2003까지만 사용할 수 있습니다. 이를 수정하기 위해 XP / 2003 시스템의 폴더에서 사용자 시스템 의 또는 폴더로 scriptpw.dll파일을 복사하면 됩니다 . DLL이 복사되면 다음을 실행하여 등록해야합니다.Windows\System32Winnt\System32Windows\System32

regsvr32 scriptpw.dll

Vista 이상에서 DLL을 성공적으로 등록하려면 관리자 권한이 필요합니다. 나는 그런 이동의 합법성을 조사하지 않았기 때문에 동굴 강사.


편의 또는 법적 이유로 오래된 DLL 파일을 추적하고 등록하는 데 지나치게 관심 이 없다면 다른 방법이 있습니다. 최신 버전의 Windows ( 필수 DLL 이없는 버전 )에는 Powershell을 사용할 수 있어야합니다.

그리고 실제로 스크립트를 완전히 사용하기 위해 스크립트를 업그레이드하는 것을 고려해야합니다 cmd.exe.. 그러나 코드의 대부분을 cmd.exe스크립트 로 유지하려는 경우 (예 : 변환하고 싶지 않은 코드가 많은 경우 ) 동일한 트릭을 사용할 수 있습니다.

먼저 cmdCScript가 아닌 Powershell을 호출하도록 스크립트를 수정합니다 .

@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 베타 x64가 있습니다.
Joey

흥미롭게도 XP에서 사용할 수 있어야합니다. 나는 Win7이 거기에서 작동하지 않으면 아직 완성되지 않았을 것이라고 생각합니다 (또는 작동하도록 다른 트릭을해야합니다). 약간의 조사를 통해 그 이유를 알 수 있습니다.
paxdiablo

2
좋은. 또한 명령 줄에서 호출 할 수있는 동등한 언어를 VBS 파일로 대체 할 수 있습니다. 예를 들어, cscript 섹션을 'python -c "from getpass import getpass; pwd = getpass (); print pwd;"'로
바꿀 수 있습니다

1
나는이 질문이 새로운 것이었을 때이 방법을 사용했다. 나는 추가 스크립트없이 그것을하는 방법을 아래 에 대답했다 .
unclemeat

1
@Bill : 따라서 "지금, 불행히도, ..."로 시작하는 섹션 :-) 그러나 더 나은 답변을 위해 더 많은 옵션을 추가했습니다. 특히 scriptpw.dll.
paxdiablo

153

예-4 년 늦었습니다.

하지만 외부 스크립트를 만들지 않고도 한 줄로이 작업을 수행 할 수있는 방법을 찾았습니다. 배치 파일에서 powershell 명령을 호출하여.

TessellatingHeckler 덕분에-텍스트 파일로 출력하지 않고 (for 루프 내에서 한 줄로 매우 지저분하기 때문에 powershell 명령을 변수에 설정했습니다).

@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%

저는 이것을 분해 할 ^것입니다. caret를 사용하여 몇 줄로 나눌 수 있습니다. 훨씬 더 좋습니다 .

@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. 그런 다음 해당 파일을 변수로 읽어서 삭제합니다.


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"앞과 ")"앞은 두 개의 백틱이지만 하나의 백틱이어야합니다.
TessellatingHeckler

1
@TessellatingHeckler 좋은 생각, 내 답변을 업데이트했습니다. 제안 사항을 약간 수정 한 버전입니다. 감사.
unclemeat 2014 년

이 메서드가 각 키를 누를 때마다 "*"(별표)를 에코하지 못하도록 할 수 있습니까? 즉, 관찰자가 암호의 길이를 알기를 원하지 않습니다.
Sam Hasler 2015

1
@RegieBaguio 아니요, Powershell을 활성화해야합니다. 아래에서 npocmaka의 순수 배치 솔루션을 살펴보십시오. 훨씬 더 복잡하지만 당신을 위해 작동합니다.
unclemeat

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 팝업을 사용하는 비밀번호 제출자 . 이것은 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 프레임 워크가 필요하지만 이는 문제가되지 않습니다.

@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 2014

2
첫 번째 솔루션은 매우 영리합니다-좋은 +1입니다.
unclemeat

빠르게 입력 할 경우 교체 명령을 기반으로 2.1 방법은 키 누름을 그리워합니다
샘 슬러에게

@SamHasler-예.이 문제를 해결하려고합니다. 2.1에서 문제를 재현 할 수는 없었습니다. 또한 Enter가 눌 렸는지 확인하기 위해 HTA를 업데이트했습니다.
npocmaka

1
@npocmaka (마지막 업데이트 : 20150405)를 1.2 메소드의 마지막 버전은 여기에 있습니다 : consolesoft.com/batch/password_input/password_input.cmd
카를로스

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 에게 감사드립니다 ).

충분하지 않다면 파이썬으로 전환하거나 스크립트 대신 실행 파일을 작성했습니다.

나는 이것들 중 어느 것도 완벽한 soutions가 아니라는 것을 알고 있지만 아마도 하나는 당신에게 충분할 것입니다 :)


4
명령 프롬프트에서 배치 파일을 실행하면 입력 한 암호가 CMD 기록에 저장됩니다. cmd가 작업에 대한 잘못된 도구라고 거의 말했듯이 반대 투표는 없습니다.
Mark K Cowan

콘솔의 명령 기록이 중요하지 않은 경우를 실행 doskey /reinstall하여 즉시 이전 명령 버퍼를 지울 수 있습니다 cls.
RuntimeException

1
doskey / reinstall을 사용하지 않고 명령 내역을 지우고 싶지 않은 경우 다른 옵션은 별도의 터미널 창에서 위 코드를 실행하고 즉시 종료하는 것입니다. 입력 한 문자열을 별표로 대체하지는 않습니다. 위의 솔루션은 powershell을 실행하지 않으려는 경우 옵션입니다. C:\>start "console" cmd /c ireadconsole.bat
RuntimeException

9

모든 종류의 형식화 된 입력에 ReadFormattedLine 서브 루틴을 사용할 수 있습니다. 예를 들어, 아래 명령은 8 자의 암호를 읽고 화면에 별표를 표시 한 다음 Enter 키를 누를 필요없이 자동으로 계속합니다.

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

이 서브 루틴은 순수 Batch로 작성되므로 추가 프로그램이 필요하지 않으며 숫자 만 읽기, 문자를 대문자로 변환 등과 같은 여러 형식화 된 입력 작업을 허용 합니다 . Read a line with specific format 에서 ReadFormattedLine 서브 루틴을 다운로드 할 수 있습니다 .


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 2014 년

소스 코드가 부족하여 귀찮다면 ReadLine.exe 에 관한 다른 답변을 참조하십시오 .
Bill_Stewart

잘 했어! 라이센스를 사용하면 사용할 수 있습니다. 또한 통합하기 쉽습니다. 그냥 명령 줄에서 종료 코드 1. 오류를 처리하기 위해, 2 입력 라인 (4)이 프로그램은 Ctrl-C를 함께 중단, 빈, 3 환경 변수가 변경되지 않았습니다이었다
제임스 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

나는 Blorgbeard의 위의 솔루션을 사용했는데 실제로 내 의견으로는 훌륭합니다. 그런 다음 다음과 같이 개선했습니다.

  1. Ansicon 용 Google
  2. zip 파일 및 샘플 텍스트 파일을 다운로드합니다.
  3. 설치 (즉, system32에 2 개의 파일 복사)

다음과 같이 사용하십시오.

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

이렇게하면 암호 입력을 위해 콘솔이 회색으로 회색으로 전환되고 완료되면 다시 전환됩니다. ESC는 실제로 인쇄 할 수없는 문자 여야하며 다운로드 한 샘플 텍스트 파일 (메모장의 왼쪽 화살표 모양)에서 배치 파일로 복사 할 수 있습니다. 샘플 텍스트 파일을 사용하여 모든 색상 조합에 대한 코드를 찾을 수 있습니다.

시스템 관리자가 아닌 경우 시스템이 아닌 디렉토리에 파일을 설치할 수 있으며 프로그램을 호출하고 이스케이프 시퀀스를 사용하기 전에 스크립트의 PATH에 디렉토리를 추가해야합니다. 관리자가 아닌 배포 할 수있는 몇 개의 파일 패키지가 필요한 경우 현재 디렉터리 일 수도 있습니다.


나는 이것을 테스트 할 수 없지만 입력 한 암호가 나중에 cmd 기록에 나타날 것으로 예상합니다.
Mark K Cowan 2014

@MarkKCowan 그게 정확히 일어나는 일입니다.
sjngm

1

보이지 않는 문자에 필요한 것을 호출하는 배치 파일을 만든 다음 호출되는 배치 파일의 바로 가기를 만듭니다.

마우스 오른쪽 버튼으로 클릭

속성

그림 물감

text == 검정

배경 == 검정

대다

확인

희망이 당신을 돕습니다 !!!!!!!!


사전에 환경을 설정해야하기 때문에 배치 상황에서 항상 실용적이지는 않지만 좋은 측면 사고 방식입니다. 아 잠깐만 요, 아마도 이것이 작동 할 것입니다 : stackoverflow.com/a/14447306/14420 또는 아마도 stackoverflow.com/questions/4339649/…
matt wilkie 2013 년

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.

업데이트 : 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가 out 과 같은 또 다른 옵션 은 다음과 같은 것을 사용하는 것입니다.

SET /P pw=C:\^>

^(가) 탈출 >그래서 표준과 같은 암호를 묻는 메시지가 표시됩니다의 모습 프롬프트 콘솔 cmd 만든 것이다.


1
질문은 암호 프롬프트를 숨기거나 숨기는 방법이 아니라 입력하는 동안 암호가 표시되지 않도록하는 것입니다. 그래서 이것은 질문에 대답하지 않습니다.
Stephan

내가 링크 한 답변 (작성 당시 13 개의 찬성표가 있음)도 마찬가지입니다. 내 대답은 그것에 대해 확장하는 것입니다. 이것이 일부에게는 유용한 대안이 될 수 있기 때문입니다 (Blogbeard가 나에게있어서 나왔습니다). (댓글로 추가했지만 사이트에서 나를 허용하지 않습니다.)
nimbell

좋은 대답이 아닙니다. 암호를 마스킹하거나 숨기지 않습니다. 좋은 해결책이나 답변이 있으면 댓글을 달아주세요.
Anic17

-3

나는 배치 파일에서 암호를 마스킹하는 방법, hide.com 솔루션을 사용하는 방법, 심지어 텍스트와 배경을 같은 색으로 만드는 방법에 대한 모든 투박한 솔루션을 인터넷에서 읽었습니다. hide.com 솔루션은 제대로 작동하고 안전하지도 않으며 64 비트 Windows에서는 작동하지 않습니다. 어쨌든 100 % Microsoft 유틸리티를 사용하는 방법이 있습니다!

먼저 내 사용법을 설명하겠습니다. Windows에 자동 로그온하는 약 20 개의 워크 스테이션이 있습니다. 데스크톱에는 임상 응용 프로그램에 대한 바로 가기가 하나 있습니다. 컴퓨터는 잠겨 있고 마우스 오른쪽 버튼을 클릭 할 수 없으며 아무것도 할 수 없지만 바탕 화면의 바로 가기 하나에 액세스 할 수 있습니다. 때로는 기술자가 일부 디버그 응용 프로그램을 시작하고 Windows 탐색기를 탐색하고 자동 로그 사용자 계정을 로그 오프하지 않고 로그 파일을 확인해야하는 경우가 있습니다.

그래서 여기에 제가 한 일이 있습니다.

원하는대로 수행하되 잠긴 컴퓨터가 액세스 할 수있는 네트워크 공유에 두 개의 배치 파일을 저장합니다.

내 솔루션은 Windows의 주요 구성 요소 인 runas를 사용합니다. 만들려는 runas.bat에 대한 바로 가기를 클라이언트에 추가합니다. 참고로 클라이언트에서 더 나은보기를 위해 바로 가기 이름을 변경하고 아이콘을 변경했습니다.

두 개의 배치 파일을 만들어야합니다.

배치 파일 이름을 runas.batDebug 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은 초 타이머를 만드는 내 coonass 방법입니다.

이게 첫 번째 배치 파일을 처리합니다. 매우 간단합니다.

다음은 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

저는 코더가 아니며 약 1 년 전에 배치 스크립팅을 시작했습니다. 배치 파일에서 암호를 마스킹하는 방법을 발견 한 이번 라운드는 꽤 굉장합니다!

나 이외의 누군가가 그것을 사용할 수 있다는 소식을 듣고 싶습니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.