it-swarm.com.de

Kann ich einen Eingabetext in einer Fledermausdatei maskieren?

Ich schreibe eine Batch-Datei, um einige andere Programme auszuführen. In diesem Fall muss ich nach einem Passwort fragen. Kann ich den eingegebenen Text maskieren? Ich muss keine ******* anstatt der eingegebenen Zeichen drucken. Das Kennworteingabeverhalten von Linux (beim Schreiben nichts drucken) reicht aus.

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

Dadurch wird die Eingabe gelesen, aber ich kann den Text mit diesem Ansatz nicht maskieren.

Bis zu XP und Server 2003 können Sie ein anderes mitgeliefertes Tool (VBScript) verwenden. Die folgenden beiden Skripte erledigen die gewünschten Aufgaben.

Zuerst getpwd.cmd:

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

Dann getpwd.vbs:

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

Das getpwd.vbs Verwendet einfach das Kennwortobjekt, um das Kennwort vom Benutzer einzugeben und es dann zur Standardausgabe auszudrucken (der nächste Absatz erklärt, warum dies nicht im Terminal angezeigt wird).

Das Befehlsskript getpwd.cmd Ist etwas kniffliger, funktioniert aber im Grunde wie folgt.

Der Befehl "<nul: set /p passwd=Password: " Bewirkt, dass die Eingabeaufforderung ohne nachfolgendes Zeilenumbruchzeichen ausgegeben wird. Auf diese Weise kann der Befehl "echo -n" In der Shell bash auf einfache Weise emuliert werden. Es setzt passwd als irrelevanten Nebeneffekt auf einen leeren String und wartet nicht auf Eingaben, da diese vom nul: - Gerät stammen.

Die Anweisung "for /f "delims=" %%i in ('cscript /nologo getpwd.vbs') do set passwd=%%i" ist das schwierigste Bit. Es läuft das VBScript ohne Microsoft "Werbung", so dass die einzige Zeilenausgabe das Passwort ist (aus dem VBscript "Wscript.StdOut.WriteLine strPassword".

Das Festlegen der Trennzeichen auf "nichts" ist erforderlich, um eine gesamte Eingabezeile mit Leerzeichen zu erfassen. Andernfalls erhalten Sie nur das erste Wort. Das Bit "for ... do set ..." Setzt passwd als tatsächliche Kennwortausgabe von VBScript.

Dann geben wir eine leere Zeile aus (um die "Password: " - Zeile zu beenden) und das Passwort wird in der Umgebungsvariablen passwd gespeichert, nachdem der Code ausgeführt wurde.


Wie bereits erwähnt, ist scriptpw.dll Jetzt nur noch bis XP/2003 verfügbar. Um dies zu korrigieren, können Sie einfach die Datei scriptpw.dll Aus dem Ordner Windows\System32 Eines XP/2003-Systems in den Ordner Winnt\System32 Oder Windows\System32 Kopieren Ihr eigenes System. Nachdem das DLL kopiert wurde, müssen Sie es registrieren, indem Sie Folgendes ausführen:

regsvr32 scriptpw.dll

Um DLL unter Vista und höher erfolgreich zu registrieren, benötigen Sie Administratorrechte. Ich habe die Rechtmäßigkeit eines solchen Umzugs nicht geprüft, also Höhlenlektor.


Wenn Sie nicht übermäßig daran interessiert sind, ältere DLL -Dateien aufzuspüren und zu registrieren (aus praktischen oder rechtlichen Gründen) ist ein anderer Weg. Spätere Versionen von Windows (die nicht über die erforderliche DLL verfügen) sollten über Powershell verfügen.

Tatsächlich sollten Sie in Betracht ziehen, Ihre Skripte zu aktualisieren, um sie vollständig zu nutzen, da sie eine viel leistungsfähigere Skriptsprache als cmd.exe Sind. Wenn Sie jedoch den Großteil Ihres Codes als cmd.exe - Skripte behalten möchten (z. B. wenn Sie über eine Menge Code verfügen, die Sie verwenden will nicht konvertieren), können Sie den gleichen Trick verwenden.

Ändern Sie zuerst das Skript cmd so, dass es Powershell anstelle von CScript aufruft:

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

Das Powershell-Skript ist ebenso einfach:

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

allerdings mit etwas marshalling um den eigentlichen kennworttext zu bekommen.

Denken Sie daran, dass Sie zum Ausführen lokaler nicht signierter Powershell-Skripte auf Ihrem Computer möglicherweise die Ausführungsrichtlinie von der (drakonischen, wenn auch sehr sicheren) Standardeinstellung aus ändern müssen.

set-executionpolicy remotesigned

aus Powershell heraus.

49
paxdiablo

Ja, ich bin 4 Jahre zu spät.

Aber ich habe einen Weg gefunden, dies in einer Zeile zu tun, ohne ein externes Skript erstellen zu müssen. durch Aufrufen von Powershell-Befehlen aus einer Batch-Datei.

Dank TessellatingHeckler - ohne Ausgabe in eine Textdatei (ich habe den Powershell-Befehl in einer Variablen gesetzt, weil er in einer langen Zeile in einer for-Schleife ziemlich chaotisch ist).

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

Ursprünglich habe ich es geschrieben, um es in eine Textdatei auszugeben und dann aus dieser Textdatei zu lesen. Aber die obige Methode ist besser. In einer extrem langen, fast unverständlichen Zeile:

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

Ich werde das aufteilen - du kannst es mit caret ^ Auf ein paar Zeilen aufteilen, was viel schöner ist ...

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

Dieser Artikel erklärt, was die Powershell-Befehle tun; im wesentlichen wird es mit Read-Host -AsSecureString eingegeben - die folgenden zwei Zeilen konvertieren diesen sicheren String zurück in Klartext, die Ausgabe (Klartext-Passwort) wird dann mit >.tmp.txt in eine Textdatei gesendet. Diese Datei wird dann in eine Variable eingelesen und gelöscht.

143
unclemeat

1.Pure Batch-Lösung , die (ab) den Befehl XCOPY verwendet und deren Schalter /P /L Gefunden hat hier) (einige Verbesserungen hierzu könnten hier zu finden ) sein:

:: 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 Eine andere Möglichkeit, die auf dem Befehl replace basiert

@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.Passwortübermittler, der ein HTA-Popup verwendet . Dies ist eine hybrit .bat/jscript/mshta Datei und sollte als . Bat gespeichert werden:

<!-- :
:: 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 . Ein selbst kompilierter .net-Hybrid .Wieder als .bat Gespeichert werden . Anders als bei anderen Lösungen wird eine kleine .exe-Datei erstellt/kompiliert, die aufgerufen wird (wenn Sie möchten, können Sie sie löschen). Benötigt auch das installierte .net Framework, aber das ist kein Problem:

@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);
23
npocmaka

Ich würde wahrscheinlich nur tun:

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

Sie erhalten also eine Eingabeaufforderung, und der Bildschirm wird nach der Eingabe gelöscht.

Beachten Sie, dass das eingegebene Passwort im CMD-Verlauf gespeichert wird, wenn die Batch-Datei über eine Eingabeaufforderung ausgeführt wird (Danke @ Mark K Cowan ).

Wenn das nicht gut genug wäre, würde ich entweder zu Python wechseln oder eine ausführbare Datei anstelle eines Skripts schreiben.

Ich weiß, keine davon ist perfekt, aber vielleicht ist eine gut genug für dich :)

12
Blorgbeard

eine andere Alternative sind meine EditV32 (x86) - oder EditV64 (x64) -Befehlszeilentools. Beispielsweise:

editv32 -m -p "Password: " PWD

-m bedeutet "maskierte Eingabe" und -p ist die Eingabeaufforderung. Die Benutzereingabe wird in der Umgebungsvariablen PWD gespeichert. Sie können es hier bekommen:

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

6
Bill_Stewart

Wenn Sie der Mangel an Quellcode stört, habe ich eine andere Alternative.

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

Sie erhalten es von https://westmesatech.com/?page_id=49 . Quellcode ist enthalten.

5
Bill_Stewart

Sie können die Unterroutine ReadFormattedLine für alle Arten von formatierten Eingaben verwenden. Der folgende Befehl liest beispielsweise ein Passwort mit 8 Zeichen, zeigt Sternchen auf dem Bildschirm an und fährt automatisch fort, ohne die Eingabetaste drücken zu müssen:

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

Diese Unterroutine ist in reiner Stapelverarbeitung geschrieben und erfordert kein zusätzliches Programm. Sie ermöglicht mehrere formatierte Eingabeoperationen, wie das Lesen von Zahlen, das Konvertieren von Buchstaben in Großbuchstaben usw. Sie können die Unterroutine ReadFormattedLine von Read herunterladen eine Zeile mit einem bestimmten Format .


EDIT 2018-08-18 : Neue Methode zur Eingabe eines "unsichtbaren" Passworts

Der Befehl FINDSTR weist einen seltsamen Fehler auf, der auftritt, wenn dieser Befehl zum Anzeigen von Zeichen in Farbe verwendet wird UND die Ausgabe eines solchen Befehls an das CON-Gerät umgeleitet wird. Ausführliche Informationen zur Verwendung des Befehls FINDSTR zum Anzeigen von Text in Farbe finden Sie unter in diesem Thema .

Wenn die Ausgabe dieser Form von FINDSTR-Befehl an CON umgeleitet wird, passiert etwas Seltsames, nachdem der Text in der gewünschten Farbe ausgegeben wurde: der gesamte Text, nachdem er als "unsichtbare" Zeichen ausgegeben wurde, obwohl eine genauere Beschreibung darin besteht, dass es sich um den Text handelt Ausgabe als schwarzer Text auf schwarzem Hintergrund. Der Originaltext wird angezeigt, wenn Sie den Befehl FARBE verwenden, um die Vorder- und Hintergrundfarben des gesamten Bildschirms zurückzusetzen. Wenn der Text jedoch "unsichtbar" ist, können wir einen SET/P-Befehl ausführen, sodass nicht alle eingegebenen Zeichen auf dem Bildschirm angezeigt werden.

@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%"
4
Aacini

Wenn Sie Python installiert haben, können Sie Folgendes verwenden:

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

die Ausgabe:

Enter the CVS password:
PASS: 123
4
lutecki

erstellen Sie eine Batch-Datei, die die für unsichtbare Zeichen erforderliche aufruft, und erstellen Sie dann eine Verknüpfung für die aufgerufene Batch-Datei.

rechtsklick

eigenschaften

farben

text == schwarz

hintergrund == schwarz

sich bewerben

okay

hoffe das hilft dir also !!!!!!!!

1
cmd

UPDATE:
Ich habe zwei neue Methoden hinzugefügt, die anstelle der Verwendung von cls zum Ausblenden der Eingabe ein neues Popup mit nur einer Zeile erstellen.

Die Nachteile sind, dass eine Methode (Methode 2) Junk in der Registrierung belässt - "Wenn sie ohne die richtigen Rechte ausgeführt wird", und die andere (Methode drei) Junk an das Skript anfügt. Unnötig zu erwähnen, dass es leicht in jede tmp-Datei geschrieben und gelöscht werden kann. Ich habe gerade versucht, eine Alternative zu finden.

Einschränkung: Das Passwort darf nur alphanumerisch sein - keine anderen Zeichen!

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

Update: Ich fand sachadees Posting ist perfekt und habe gerade meine "Pop-up" -Eigenschaft hinzugefügt.

@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
Ir Relevant

Ich habe die obige Lösung von Blorgbeard verwendet, die meiner Meinung nach wirklich großartig ist. Dann habe ich es wie folgt erweitert:

  1. Google für ansicon
  2. Laden Sie die Zip-Datei und die Beispieltextdatei herunter.
  3. Installieren (dh 2 Dateien in system32 kopieren)

Benutze es so:

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

Dadurch wird die Konsole für die Kennworteingabe grau auf grau geschaltet und nach Beendigung wieder zurückgeschaltet. Der ESC sollte eigentlich ein nicht druckbares Zeichen sein, das Sie aus der heruntergeladenen Beispieltextdatei (im Editor als Pfeil nach links dargestellt) in Ihre Stapeldatei kopieren können. Sie können die Beispieltextdatei verwenden, um die Codes für alle Farbkombinationen zu finden.

Wenn Sie kein Administrator des Computers sind, können Sie die Dateien wahrscheinlich in einem Nicht-Systemverzeichnis installieren. Anschließend müssen Sie das Verzeichnis an den PATH in Ihrem Skript anhängen, bevor Sie das Programm aufrufen und die Escape-Sequenzen verwenden. Dies könnte wahrscheinlich sogar das aktuelle Verzeichnis sein, wenn Sie ein nicht-administrierbares Paket mit nur wenigen Dateien benötigen.

1
marcingo

Dies mag ein älteres Thema sein, aber wenn Sie Windows Vista oder 7 verwenden, habe ich eine Lösung, die sehr gut funktioniert. Ich habe hier ein Video davon gemacht: http://www.youtube.com/watch?v=mk8uAa6PIFM

Pastebin für die Batch-Datei ist hier

0
Nathansswell