当前位置:  开发笔记 > 编程语言 > 正文

我可以屏蔽bat文件中的输入文本

如何解决《我可以屏蔽bat文件中的输入文本》经验,为你挑选了7个好方法。

我正在编写一个批处理文件来执行其他一些程序.在这种情况下,我需要提示输入密码.我有办法屏蔽输入文本吗?我不需要打印*******字符而不是输入字符.Linux的密码提示行为(在打字时不打印)就足够了.

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

这将读取输入,但我不能使用这种方法掩盖文本.



1> unclemeat..:

是的 - 我迟到了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%

最初我写它输出到文本文件,然后从该文本文件中读取.但是上面的方法更好.在一条极其漫长,近乎难以理解的路线上:

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

本文解释了powershell命令正在做什么; 本质上它使用输入Read-Host -AsSecureString- 以下两行将该安全字符串转换回纯文本,输出(明文密码)然后使用发送到文本文件>.tmp.txt.然后将该文件读入变量并删除.


这太棒了.但它将纯文本密码保存到磁盘的方式让我感到不舒服.避免这样做::for/f"usebackq tokens =*"%% p in(``powershell -Command"$ pword = read-host'输入密码'-AsSecureString; $ BSTR = [System.Runtime. InteropServices.Marshal] :: SecureStringToBSTR($ pword); [System.Runtime.InteropServices.Marshal] :: PtrToStringAuto($ BSTR)"``)设置密码= %% p`然后`echo%password%`.NB.我无法得到这个评论来正确地逃避反击 - 在"powershell"之前,在结束之前")"是两个反击,但应该是一个反击.
最初的答案很棒,但我认为现在应该是最终答案

2> paxdiablo..:

在XP和Server 2003之前,您可以使用另一个包含的工具(VBScript) - 以下两个脚本可以完成您想要的工作.

首先,getpwd.cmd:

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

getpwd.vbs简单地使用密码对象到来自用户的输入的密码,然后将它打印到标准输出(下一段将解释为什么不在终端中显示).

getpwd.cmd命令脚本是一个有点棘手,但它基本的工作原理如下.

"命令的作用是输出没有尾随换行符的提示 - 这是一种模仿"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\System32Windows\System32文件夹在自己的系统上.复制DLL后,您需要通过运行以下命令来注册它:

regsvr32 scriptpw.dll

要在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

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本身.


哇,那个尼斯.还可以注意到,您可以将VBS文件替换为可以从命令行调用的任何等效语言.例如,您可以使用以下命令替换cscript部分:'python -c"来自getpass import getpass; pwd = getpass(); print pwd;"'

3> npocmaka..:

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"'
) 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 基于replace命令的另一种方式

@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!" 

2.使用HTA弹出窗口的密码提交者 .这是一个hybrit .bat/jscript/mshta文件,应该保存为.bat:




Password submitter


    

    
    

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);


我的hacky感觉刺痛,尤其是混合动力!
第一个解决方案非常聪明-不错的+1。

4> Blorgbeard..:

我可能只会这样做:

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

所以你得到一个提示,然后屏幕在输入后清除.

请注意,如果从命令提示符执行批处理文件,则输入的密码将存储在CMD历史记录中(Thanks @Mark K Cowan).

如果这还不够好,我会切换到python,或编写可执行文件而不是脚本.

我知道这些都不是完美的,但也许一个对你来说已经足够了:)


请注意,如果从命令提示符执行批处理文件,则输入的密码将存储在CMD历史记录中.没有downvote,但你几乎都说cmd是错误的工具.
@MarkKCowan感谢你指出这一点,并补充说.

5> Bill_Stewart..:

另一种选择是我的EditV32(x86)或EditV64(x64)命令行工具.例如:

editv32 -m -p "Password: " PWD

-m表示"屏蔽输入",-p表示提示.用户的输入存储在PWD环境变量中.你可以在这里得到它:

www.westmesatech.com/editv.html


这不是唯一的闭源解决方案(Windows是封闭源代码!).你当然可以免费使用它......

6> Bill_Stewart..:

如果缺乏源代码困扰您,我还有另一种选择。

@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获得。包含源代码。



7> Aacini..:

您可以对所有类型的格式化输入使用ReadFormattedLine子例程。例如,下面的命令读取8个字符的密码,在屏幕上显示星号,然后自动继续而不需要按Enter键:

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

该子例程是用纯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%"

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有