隐藏批处理文件中的输入
Posted
技术标签:
【中文标题】隐藏批处理文件中的输入【英文标题】:Hide Input in Batch File 【发布时间】:2011-08-16 16:51:19 【问题描述】:我想知道如何在批处理文件中隐藏“set /p”命令的输入。
set /p Password=你的密码是多少?
我们都知道,输入您的密码,您就能看到它。我该如何隐藏它?
我尝试了 here. 的 conset.exe 并使用了:
conset /PH Password=你的密码是什么?
我得到“Conset:错误设置变量”:(
我的另一个想法是更改控制台窗口的颜色。但是我怎么能改变同一行的颜色呢?这样你可以看到问题,但看不到答案?
专业人士有什么想法吗?
【问题讨论】:
***.com/questions/286871/…的可能重复 Can I mask an input text in a bat file的可能重复 【参考方案1】:1.纯批处理解决方案(ab)使用XCOPY
命令及其/P /L
开关找到here:
:: 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
2.1 Another way based on replace command
@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弹窗的密码提交者 . This is a hybrid .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' >
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'></input>
<hr>
<button onclick='pipePass()'>Submit</button>
</body>
</html>
3.A self-compiled .net hybrid .再次应保存为.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);
【讨论】:
不错的答案,但 xcopy.exe 不是“纯批处理”解决方案。据我所知,没有纯粹的批处理解决方案。【参考方案2】:好的 - 所以这个答案在 9 年后才出现,但我想迟到总比没有好......
我写了标记答案中提到的editv32/editv64工具,但从那以后我写了一个稍微好一点的工具:
https://github.com/Bill-Stewart/editenv
该工具是免费和开源的。可从Releases
选项卡下载二进制文件。
--maskinput
(-m
) 选项可让您屏蔽输入(可选择使用用户定义的字符)。请注意,此功能不安全(变量值仍在内存中,环境以纯文本形式保存)——这只是为了方便。
我最常使用这个工具是为当前进程交互式地编辑 Path
变量(结果证明它非常方便)。
【讨论】:
【参考方案3】:您可能可以在这里查看答案:Can I mask an input text in a bat file
我认为 EditV32.exe 和 EditV64.exe 是您拥有的最佳选择(而且由于您可以使用 conset,据我所知 Windows 不附带,我认为您不会反对使用编辑?)
http://www.westmesatech.com/editv.html
还有:http://social.technet.microsoft.com/Forums/en-US/ITCG/thread/7d2d92a5-5d59-4954-bf3e-22eeb5cf0ee6/
【讨论】:
请注意,我的editv32
/edit64
实用程序已被我的开源 editenv
实用程序取代。【参考方案4】:
简单的代码对我有用
:CVSPassword
echo hP1X500P[PZBBBfh#b##fXf-V@`$fPf]f3/f1/5++u5>hide.com
set /P cvspassword=Please enter CVS Password:: <nul
for /f "tokens=*" %%i in ('hide.com') do set cvspassword=%%i
IF "%cvspassword%"=="" GOTO CVSPassword
echo cvspassword %cvspassword%
【讨论】:
hide.com
?它在哪里? (它不是一个 16 位应用程序,不能在 64 位窗口上运行吗?)
忘记添加 echo 命令,该命令将创建一个用于隐藏密码的 hide.com 文件
@Stephan 是正确的,这在 64 位操作系统上不工作。以上是关于隐藏批处理文件中的输入的主要内容,如果未能解决你的问题,请参考以下文章