Posso mascherare un testo di input in un file bat?


102

Sto scrivendo un file batch per eseguire altri programmi. In questo caso devo richiedere una password. Ho un modo per mascherare il testo di input? Non ho bisogno di stampare caratteri ******* invece di caratteri di input. Il comportamento del prompt della password di Linux (non stampare nulla durante la digitazione) è sufficiente.

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

Questo leggerà l'input ma non posso mascherare il testo usando questo approccio.


Risposte:


50

Fino a XP e Server 2003, è possibile utilizzare un altro strumento incluso (VBScript): i due script seguenti svolgono il lavoro desiderato.

Innanzitutto getpwd.cmd:

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

Quindi getpwd.vbs:

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

La getpwd.vbsusa semplicemente l'oggetto password per inserire la password da parte dell'utente e quindi stamparlo sullo standard output (paragrafo successivo spiegherà perché che non si presenta nel terminale).

Lo getpwd.cmdscript dei comandi è un po 'più complicato ma fondamentalmente funziona come segue.

L'effetto del "<nul: set /p passwd=Password: "comando è di visualizzare il prompt senza alcun carattere di nuova riga finale: è un modo subdolo per emulare il "echo -n"comando dalla bashshell. Si imposta passwdsu una stringa vuota come effetto collaterale irrilevante e non attende l'input poiché riceve l'input dal nul:dispositivo.

L' "for /f "delims=" %%i in ('cscript /nologo getpwd.vbs') do set passwd=%%i"affermazione è la parte più complicata. Esegue VBScript senza "pubblicità" Microsoft, in modo che l'unica riga di output sia la password (dal file VBscript "Wscript.StdOut.WriteLine strPassword".

L'impostazione dei delimitatori su nulla è necessaria per acquisire un'intera riga di input con spazi, altrimenti si ottiene solo la prima parola. Il "for ... do set ..."bit viene impostato passwdcome output della password effettiva da VBScript.

Quindi echeggiamo una riga vuota (per terminare la "Password: "riga) e la password sarà nella passwdvariabile d'ambiente dopo che il codice è stato eseguito.


Ora, come detto, scriptpw.dllè disponibile solo fino a XP / 2003. Per correggere questo problema, puoi semplicemente copiare il scriptpw.dllfile dalla Windows\System32cartella di un sistema XP / 2003 alla cartella Winnt\System32o Windows\System32sul tuo sistema. Una volta che la DLL è stata copiata, sarà necessario registrarla eseguendo:

regsvr32 scriptpw.dll

Per registrare correttamente la DLL su Vista e versioni successive, avrai bisogno dei privilegi di amministratore. Non ho esaminato la legalità di una tale mossa, così lettore delle caverne.


Se non siete troppo appassionato cercando di rintracciare e registrare file DLL più anziani (per convenienza o per ragioni legali), c'è un altro modo. Le versioni successive di Windows (quelle che non hanno la DLL richiesta) dovrebbero avere Powershell a tua disposizione.

E, in effetti, dovresti davvero considerare di aggiornare i tuoi script per usarlo completamente poiché è un linguaggio di scripting molto più capace di cmd.exe. Tuttavia, se vuoi mantenere la maggior parte del tuo codice come cmd.exescript (ad esempio se hai molto codice che non vuoi convertire), puoi usare lo stesso trucco.

Innanzitutto, modifica lo cmdscript in modo che chiami Powershell anziché CScript:

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

Lo script Powershell è altrettanto semplice:

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

sebbene con un po 'di marshalling per ottenere il testo della password effettiva.

Ricorda che, per eseguire script Powershell locali non firmati sulla tua macchina, potresti dover modificare la politica di esecuzione dall'impostazione predefinita (draconiana, sebbene molto sicura), con qualcosa del tipo:

set-executionpolicy remotesigned

dall'interno di Powershell stesso.


2
Whoa, quel <nul: set / p è davvero fantastico. Finora non lo sapevo :-). Ma VBScript non funziona per me: Errore di runtime di Microsoft VBScript: il componente ActiveX non può creare l'oggetto: "ScriptPW.Password". Windows 7 Beta x64 qui.
Joey

Interessante, dovrebbe essere disponibile da XP in poi. Sospetto che Win7 non sia ancora completamente finito se non funziona lì (o devi fare qualche altro trucco per farlo funzionare). Un po 'di ricerca mostra perché: guarda il mio aggiornamento.
paxdiablo

2
Bello. È anche utile notare che è possibile sostituire il file VBS con qualsiasi lingua equivalente che può essere chiamata dalla riga di comando. Ad esempio, puoi sostituire la sezione cscript con: 'python -c "da getpass import getpass; pwd = getpass (); print pwd;"'
Cerin

1
Usavo questo modo quando questa domanda era nuova - ho risposto di seguito un modo per farlo senza script extra.
Unclemeat

1
@ Bill: da qui la mia sezione che inizia con "Ora, sfortunatamente, ..." :-) Tuttavia, ho aggiunto più opzioni alla risposta per sperare di migliorarla. In particolare, l'uso di PowerShell anziché di scriptpw.dll.
paxdiablo

153

Sì, sono in ritardo di 4 anni.

Ma ho trovato un modo per farlo in una riga senza dover creare uno script esterno; chiamando i comandi PowerShell da un file batch.

Grazie a TessellatingHeckler - senza eseguire l'output in un file di testo (ho impostato il comando powershell in una variabile, perché è piuttosto disordinato in una lunga riga all'interno di un ciclo 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%

Inizialmente l'ho scritto per l'output in un file di testo, quindi l'ho letto da quel file di testo. Ma il metodo sopra è migliore. In una riga estremamente lunga, quasi incomprensibile:

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

Lo analizzerò: puoi dividerlo in poche righe usando il cursore ^, che è molto più carino ...

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

Questo articolo spiega cosa stanno facendo i comandi PowerShell; essenzialmente riceve l'input usando Read-Host -AsSecureString: le seguenti due righe convertono quella stringa sicura in testo normale, l'output (password in chiaro) viene quindi inviato a un file di testo usando >.tmp.txt. Il file viene quindi letto in una variabile e cancellato.


5
La risposta originale era ottima, ma penso che questa dovrebbe essere quella definitiva ora
James Wiseman,

30
È brillante. Ma il modo in cui salva una password in testo semplice su disco mi mette a disagio. Evita di farlo facendo invece questo: 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=%%pe poi echo %password%. NB. Non riesco a far sì che questo commento esegua correttamente l'esclusione dei backtick - prima che "powershell" e prima della fine ")" siano due backtick, ma dovrebbe essere un backtick.
TessellatingHeckler

1
@TessellatingHeckler Buona idea, ho aggiornato la mia risposta. Una versione leggermente modificata del tuo suggerimento. Grazie.
Unclemeat

È possibile impedire a questo metodo di riprodurre "*" (stella) per ogni pressione di un tasto? cioè non voglio che un osservatore sappia quanto è lunga la password.
Sam Hasler

1
@RegieBaguio No, dovrai abilitare Powershell. Dai un'occhiata alla soluzione Batch pura di npocmaka di seguito. È molto più complicato, ma dovrebbe funzionare per te.
Unclemeat

26

1.Pura soluzione batch che (ab) utilizza il XCOPYcomando e le sue /P /Lopzioni trovate qui (alcuni miglioramenti su questo possono essere trovati qui ):

:: 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 Un altro modo basato sul comando di sostituzione

@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.Invia la password che utilizza un pop-up HTA . Questo è un file hybrit .bat / jscript / mshta e dovrebbe essere salvato come .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. Un .net ibrido autocompilato .Again dovrebbe essere salvato come .bat. A differenza di altre soluzioni, creerà / compilerà un piccolo file .exe che verrà chiamato (se lo desideri puoi eliminarlo). Richiede anche .net framework installato, ma questo non è un problema:

@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
Il mio senso di hacky sta formicolando, specialmente all'ibrido!
Mark K Cowan

2
La prima soluzione è molto intelligente: bella +1.
Unclemeat

Il metodo 2.1 basato sul comando di sostituzione perderà la pressione dei tasti se digiti velocemente
Sam Hasler

@SamHasler - sì, cercherò di risolvere questo problema, anche se non sono riuscito a riprodurre il problema con il 2.1. Ho anche aggiornato l'HTA per verificare se viene premuto Invio.
npocmaka

1
@npocmaka l'ultima versione del metodo 1.2 (ultimo aggiornamento: 20150405) è qui: consolesoft.com/batch/password_input/password_input.cmd
carlos

16

Probabilmente farei solo:

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

Quindi ottieni un messaggio, quindi lo schermo si cancella dopo che è stato inserito.

Si noti che la password inserita verrà archiviata nella cronologia CMD se il file batch viene eseguito da un prompt dei comandi (Grazie @Mark K Cowan ).

Se ciò non fosse abbastanza buono, passerei a python o scriverei un eseguibile invece di uno script.

So che nessuna di queste è perfetta, ma forse una è abbastanza buona per te :)


4
Si noti che la password immessa verrà archiviata nella cronologia CMD se il file batch viene eseguito da un prompt dei comandi. Nessun voto negativo, perché hai detto che cmd è lo strumento sbagliato per il lavoro.
Mark K Cowan

Puoi eseguire doskey /reinstallper cancellare il buffer dei comandi precedente immediatamente dopo cls, se la cronologia dei comandi nella console non è importante per te.
RuntimeException

1
se non si desidera utilizzare doskey / reinstall e cancellare la cronologia dei comandi, un'altra opzione è eseguire il codice sopra in una finestra di terminale separata e uscire immediatamente. Nota che ancora non sostituisce la tua stringa digitata con asterischi. La soluzione sopra è un'opzione se non si desidera eseguire PowerShell. C:\>start "console" cmd /c ireadconsole.bat
RuntimeException

9

È possibile utilizzare la subroutine ReadFormattedLine per tutti i tipi di input formattato. Ad esempio, il comando seguente legge una password di 8 caratteri, visualizza asterischi sullo schermo e continua automaticamente senza bisogno di premere Invio:

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

Questa subroutine è scritta in puro Batch quindi non richiede alcun programma aggiuntivo e consente diverse operazioni di input formattate, come leggere solo numeri, convertire lettere in maiuscolo, ecc. È possibile scaricare la subroutine ReadFormattedLine da Leggi una riga con un formato specifico .


EDIT 2018-08-18 : Nuovo metodo per inserire una password "invisibile"

Il comando FINDSTR ha uno strano bug che si verifica quando questo comando viene utilizzato per mostrare i caratteri a colori E l'output di tale comando viene reindirizzato al dispositivo CON. Per i dettagli su come utilizzare il comando FINDSTR per mostrare il testo a colori, vedere questo argomento .

Quando l'output di questa forma del comando FINDSTR viene reindirizzato a CON, accade qualcosa di strano dopo che il testo viene emesso nel colore desiderato: tutto il testo dopo viene emesso come caratteri "invisibili", sebbene una descrizione più precisa sia che il testo è output come testo nero su sfondo nero. Il testo originale verrà visualizzato se si utilizza il comando COLORE per ripristinare i colori di primo piano e di sfondo dell'intero schermo. Tuttavia, quando il testo è "invisibile" potremmo eseguire un comando SET / P, quindi tutti i caratteri inseriti non appariranno sullo schermo.

@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

un'altra alternativa è il mio strumento da riga di comando EditV32 (x86) o EditV64 (x64). Per esempio:

editv32 -m -p "Password: " PWD

-m significa "input mascherato" e -p è il prompt. L'input dell'utente viene memorizzato nella variabile d'ambiente PWD. Puoi ottenerlo qui:

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


5
Questa non è l'unica soluzione closed source (Windows è closed source!). Sei libero di non usarlo, ovviamente ...
Bill_Stewart

Se la mancanza di codice sorgente ti dà fastidio, vedi la mia altra risposta su ReadLine.exe .
Bill_Stewart

Buono! La licenza ti consente di usarlo. Inoltre, facile da integrare. Solo per gestire il codice di uscita 1. Errore sulla riga di comando, 2 La riga di input era vuota, 3 La variabile d'ambiente non è stata modificata, 4 Programma interrotto con Ctrl-C
James Jithin

Nota: le utilità editenv32 / editenv64 e readline sono state sostituite dall'utilità editenv open source .
Bill_Stewart


3

Se hai installato Python, puoi usare:

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

Il risultato:

Enter the CVS password:
PASS: 123

2

Ho usato la soluzione di cui sopra di Blorgbeard che è davvero eccezionale secondo me. Quindi l'ho migliorato come segue:

  1. Google per ansicon
  2. Scarica il file zip e il file di testo di esempio.
  3. Installa (ciò significa copiare 2 file in system32)

Usalo in questo modo:

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

In questo modo la console passa al grigio su grigio per l'immissione della password e torna indietro quando hai finito. L'ESC dovrebbe effettivamente essere un carattere non stampabile, che puoi copiare dal file di testo di esempio scaricato (appare come una freccia sinistra nel Blocco note) nel tuo file batch. È possibile utilizzare il file di testo di esempio per trovare i codici per tutte le combinazioni di colori.

Se non sei l'amministratore della macchina, probabilmente sarai in grado di installare i file in una directory non di sistema, quindi dovrai aggiungere la directory al PATH nel tuo script prima di chiamare il programma e utilizzare le sequenze di escape. Probabilmente questa potrebbe anche essere la directory corrente, se hai bisogno di un pacchetto distribuibile non amministratore di pochi file.


Non posso testarlo, ma mi aspetto che la password digitata appaia in seguito nella cronologia di cmd.
Mark K Cowan

@MarkKCowan Questo è esattamente quello che succede.
sjngm

1

creare un file batch che richiami quello necessario per i caratteri invisibili, quindi creare un collegamento per il file batch chiamato.

clic destro

proprietà

colori

nero testo ==

sfondo == nero

applicare

ok

la speranza così ti aiuta !!!!!!!!


simpatico approccio di pensiero laterale, anche se non del tutto sempre pratico in una situazione batch a causa del dover impostare l'ambiente in anticipo. Oh aspetta, forse questo dovrebbe funzionare: stackoverflow.com/a/14447306/14420 o forse stackoverflow.com/questions/4339649/...
matt wilkie

1

AGGIORNAMENTO:
ho aggiunto due nuovi metodi che invece di utilizzare cls per nascondere l'input creano un nuovo pop-up con una sola riga.

Gli svantaggi sono che un metodo (metodo 2) lascia spazzatura nel registro - "Se eseguito senza i diritti appropriati", e l'altro (metodo tre) aggiunge un po 'di spazzatura allo script. Inutile dire che può essere facilmente scritto su qualsiasi file tmp e cancellato Ho solo provato a trovare un'alternativa.

Limitazione: la password può essere solo alfanumerica - nessun altro carattere!

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

Aggiornamento: ho trovato il post di sachadee perfetto e ho appena aggiunto la mia stranezza "pop-up".

@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

Ho scritto un programma open source chiamato editenvche sostituisce il mio vecchio editv32/ editv64utility:

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

L' opzione --maskinput( -m) [*] consente di nascondere (mascherare) l'input digitato e ha un carattere configurabile (il carattere predefinito è *); per esempio:

editenv -m -p "Password: " PWD

L' opzione --prompt( -p) consente di specificare un prompt di input. Quanto sopra mostrerà un Password:prompt e aspetterà che tu inserisca qualcosa. I caratteri digitati appariranno come *. Premendo Ctrl+ Cterminerà il programma con un codice di uscita di 1223.

Il download è qui:

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

[*] Notare che l' opzione --maskinput( -m) non è sicura : la stringa inserita viene inserita come testo normale nell'ambiente. Questa funzione è solo per comodità.



-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

Non hai spiegato il codice e hai semplicemente copiato quel codice. Questo non è un buon modo per farlo, poiché è necessario aggiornare lo schermo e la password deve essere lunga x caratteri.
Anic17

-1

Un'altra opzione, sulla stessa linea di Blorgbeard è fuori , è usare qualcosa come:

SET /P pw=C:\^>

La ^sfugge il >modo che la password pronta sarà simile a uno standard CMD prompt della console.


1
La domanda non è come nascondere / camuffare la richiesta della password, ma impedire che la password venga visualizzata durante la digitazione. Quindi questo non (cerca di) rispondere alla domanda.
Stephan

Nemmeno la risposta a cui ho collegato (che al momento della scrittura ha 13 voti positivi). La mia risposta si sta solo espandendo su questo, in quanto questa potrebbe essere un'alternativa utile per alcuni (dato che Blogbeard is out era per me). (Avrei aggiunto come commento, ma il sito non me lo consente.)
nimbell il

Non è una buona risposta. Non stai mascherando né nascondendo la password. Per favore commenta una volta che hai una buona soluzione o risposta.
Anic17

-3

Ho letto tutte le soluzioni goffe in rete su come mascherare le password in un file batch, quelle derivanti dall'utilizzo di una soluzione hide.com e persino quelle che rendono il testo e lo sfondo dello stesso colore. La soluzione hide.com funziona in modo decente, non è molto sicura e non funziona su Windows a 64 bit. Quindi, comunque, usando le utility Microsoft al 100%, c'è un modo!

Innanzitutto, lasciatemi spiegare il mio uso. Ho circa 20 workstation che accedono automaticamente a Windows. Hanno un collegamento sul desktop: per un'applicazione clinica. Le macchine sono bloccate, non possono fare clic con il pulsante destro del mouse, non possono fare altro che accedere all'unico collegamento sul desktop. A volte è necessario per un tecnico avviare alcune applicazioni di debug, sfogliare Windows Explorer e guardare i file di registro senza disconnettere l'account utente di autolog.

Quindi ecco cosa ho fatto.

Fallo come desideri, ma ho messo i miei due file batch su una condivisione di rete a cui ha accesso il computer bloccato.

La mia soluzione utilizza 1 componente principale di Windows: runas. Metti un collegamento sui client al runas.bat che stai per creare. Cordiali saluti, sui miei client ho rinominato il collegamento per una migliore visualizzazione e ho cambiato l'icona.

Dovrai creare due file batch.

Ho chiamato i file batch runas.bat e Debug Support.bat

runas.bat contiene il codice seguente:

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

Puoi aggiungere tanti se "% un%" e in caso contrario "% un%" per tutti gli utenti a cui vuoi dare accesso. Il @ping è il mio modo migliore per creare un timer dei secondi.

Quindi questo si occupa del primo file batch - piuttosto semplice eh?

Ecco il codice per 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

Non sono un programmatore e ho iniziato a dedicarmi allo scripting batch circa un anno fa, e questo modo in cui ho scoperto di mascherare una password in un file batch è davvero fantastico!

Spero di sentire che qualcun altro oltre a me è in grado di trarne vantaggio!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.