Cha*_*ara 95 cmd batch-file command-prompt
我正在编写一个批处理文件来执行其他一些程序.在这种情况下,我需要提示输入密码.我有办法屏蔽输入文本吗?我不需要打印*******字符而不是输入字符.Linux的密码提示行为(在打字时不打印)就足够了.
@echo off
SET /P variable=Password :
echo %variable%
Pause
Run Code Online (Sandbox Code Playgroud)
这将读取输入,但我不能使用这种方法掩盖文本.
unc*_*eat 148
是的 - 我迟到了4年.
但我找到了一种方法,可以在一行中完成此操作,而无需创建外部脚本; 通过从批处理文件中调用powershell命令.
感谢TessellatingHeckler - 没有输出到文本文件(我在一个变量中设置了powershell命令,因为在for循环中的一个长行中它非常混乱).
@echo off
set "psCommand=powershell -Command "$pword = read-host 'Enter Password' -AsSecureString ; ^
$BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword); ^
[System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)""
for /f "usebackq delims=" %%p in (`%psCommand%`) do set password=%%p
echo %password%
Run Code Online (Sandbox Code Playgroud)
最初我写它输出到文本文件,然后从该文本文件中读取.但是上面的方法更好.在一条极其漫长,近乎难以理解的路线上:
@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%
Run Code Online (Sandbox Code Playgroud)
我会打破这个 - 你可以用插入符号将它分成几行^,这更好......
@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%
Run Code Online (Sandbox Code Playgroud)
本文解释了powershell命令正在做什么; 本质上它使用输入Read-Host -AsSecureString- 以下两行将该安全字符串转换回纯文本,输出(明文密码)然后使用发送到文本文件>.tmp.txt.然后将该文件读入变量并删除.
pax*_*blo 49
在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.
Run Code Online (Sandbox Code Playgroud)
然后,getpwd.vbs:
Set oScriptPW = CreateObject("ScriptPW.Password")
strPassword = oScriptPW.GetPassword()
Wscript.StdOut.WriteLine strPassword
Run Code Online (Sandbox Code Playgroud)
在getpwd.vbs简单地使用密码对象到来自用户的输入的密码,然后将它打印到标准输出(下一段将解释为什么不在终端中显示).
该getpwd.cmd命令脚本是一个有点棘手,但它基本的工作原理如下.
该"<nul: set /p passwd=Password: "命令的作用是输出没有尾随换行符的提示 - 这是一种模仿"echo -n"来自bashshell 的命令的偷偷摸摸的方式 .它将passwd空字符串设置为无关副作用,并且不等待输入,因为它从nul:设备获取输入.
该"for /f "delims=" %%i in ('cscript /nologo getpwd.vbs') do set passwd=%%i"声明是最棘手位.它运行VBScript而没有Microsoft"广告",因此唯一的行输出是密码(来自VBscript "Wscript.StdOut.WriteLine strPassword".
将分隔符设置为空是需要使用空格捕获整个输入行,否则您只需获取第一个单词.该"for ... do set ..."位设置passwd为VBScript的实际密码输出.
然后我们回显一个空行(终止该"Password: "行),密码将在passwd代码运行后在环境变量中.
现在,如上所述,scriptpw.dll仅适用于XP/2003.为了纠正这一点,你可以简单地复制scriptpw.dll文件从Windows\System32一个XP/2003系统中的文件夹Winnt\System32或Windows\System32文件夹在自己的系统上.复制DLL后,您需要通过运行以下命令来注册它:
regsvr32 scriptpw.dll
Run Code Online (Sandbox Code Playgroud)
要在Vista及更高版本上成功注册DLL,您将需要管理员权限.我没有检查这样一个移动的合法性,所以洞穴探长.
如果您不是过于热衷于尝试追踪并注册较旧的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
Run Code Online (Sandbox Code Playgroud)
Powershell脚本同样简单:
$password = Read-Host "Enter password" -AsSecureString
$password = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($password)
$password = [Runtime.InteropServices.Marshal]::PtrToStringAuto($password)
echo $password
Run Code Online (Sandbox Code Playgroud)
虽然有一些编组来获取实际的密码文本.
请记住,要在您的计算机上运行本地未签名的Powershell脚本,您可能需要从(严格的,但非常安全的)默认值修改执行策略,例如:
set-executionpolicy remotesigned
Run Code Online (Sandbox Code Playgroud)
来自Powershell本身.
npo*_*aka 24
1.Pure批量溶液的是(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
Run Code Online (Sandbox Code Playgroud)
@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
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
3. 一个自编的.net混合 .Again应保存为.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);
Run Code Online (Sandbox Code Playgroud)
Blo*_*ard 12
我可能只会这样做:
..
echo Before you enter your password, make sure no-one is looking!
set /P password=Password:
cls
echo Thanks, got that.
..
Run Code Online (Sandbox Code Playgroud)
所以你得到一个提示,然后屏幕在输入后清除.
请注意,如果从命令提示符执行批处理文件,则输入的密码将存储在CMD历史记录中(Thanks @Mark K Cowan).
如果这还不够好,我会切换到python,或编写可执行文件而不是脚本.
我知道这些都不是完美的,但也许一个对你来说已经足够了:)
另一种选择是我的EditV32(x86)或EditV64(x64)命令行工具.例如:
editv32 -m -p "Password: " PWD
Run Code Online (Sandbox Code Playgroud)
-m表示"屏蔽输入",-p表示提示.用户的输入存储在PWD环境变量中.你可以在这里得到它:
www.westmesatech.com/editv.html
小智 6
您可以将前景色设置为黑色,如下所示:
:: see /sf/ask/2330525431/
@echo off
for /F %%a in ('echo prompt $E ^| cmd') do set "ESC=%%a"
set color_white=%ESC%[37m
set color_black=%ESC%[30m
echo(
set /p user=Username:
set /p pass=password:%color_black%
echo %color_white%
echo blablablba
Run Code Online (Sandbox Code Playgroud)
享受!!!C。
如果缺乏源代码困扰您,我还有另一种选择。
@echo off
for /f "delims=" %%p in ('ReadLine -h -p "Enter password: "') do set PWD=%%p
echo You entered: %PWD%
Run Code Online (Sandbox Code Playgroud)
您可以从https://westmesatech.com/?page_id=49获得。包含源代码。
您可以对所有类型的格式化输入使用ReadFormattedLine子例程。例如,下面的命令读取8个字符的密码,在屏幕上显示星号,然后自动继续而不需要按Enter键:
call :ReadFormattedLine password="********" /M "Enter password (8 chars): "
Run Code Online (Sandbox Code Playgroud)
该子例程是用纯Batch编写的,因此它不需要任何其他程序,并且允许几种格式化的输入操作,例如只读数字,将字母转换为大写字母等。您可以从“ 读取具有特定格式的行”中下载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%"
Run Code Online (Sandbox Code Playgroud)
如果你安装了Python,你可以使用:
for /f "delims=" %%A in ('python -c "import getpass; print(getpass.getpass('Enter the CVS password: '));"') do @set CVSPASS=%%A
echo PASS: %CVSPASS%
Run Code Online (Sandbox Code Playgroud)
输出:
Enter the CVS password:
PASS: 123
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
194692 次 |
| 最近记录: |