我写了下面的脚本,要求用户输入密码作为参数
如果我输入密码"Hello&123"
,它会失败,但它适用于!Hello&123>
之类的其他情况,请提出一些克服这种情况的好方法。
@echo off
setlocal
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
if "%password%" == "" @echo password cannot be empty & goto DIE
TestScript2.bat.bat testuser "192.168.1.1" "%password%"
endlocal
:DIE
exit /b 1
@echo off
echo n | psftp %1@%2 -pw %3 -b Test3.bat >> TestLog.log 2>&1
答案 0 :(得分:1)
尝试扩展变量时,需要使用延迟扩展
对于任何内容,延迟扩展始终是安全的
但由于延迟扩张,感叹号和插入符号存在问题
这就是为什么你应该在set "password=%%p"
之后启用它。
@echo off
setlocal DisableDelayedExpansion
set "psCommand=powershell -Command "$pword = read-host 'Enter password:' -AsSecureString ; ^
$BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword); ^
$str=[System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR); ^
Write-host('#'+$str)""
for /f "usebackq delims=" %%p in (`%psCommand%`) do set "password=%%p"
setlocal EnableDelayedExpansion
set "password=!password:*#=!"
if not defined password (
echo password cannot be empty
goto :DIE
)
echo It works: pwd=!password!
TestScript2.bat testuser "192.168.1.1" "!password!"
但是你会得到TestScript2.bat的下一个问题,因为扩展本身是安全的,但是你不能通过值将任意密码传递给函数或批处理文件(这实际上是不可能的)。
所以你应该通过ref而不是值来传递它。
TestScript2.bat testuser "192.168.1.1" password
使用!%~3!
但是用密码调用psftp命令会再次导致任意值的问题
您需要将内容转义为安全格式,在这种情况下,您必须考虑psftp的规则
我测试过,psftp将\""
替换为"
。
<强> TestScript2.bat 强>
@echo off
setlocal EnableDelayedExpansion
set "password=!%~3!"
set "password=!password:"=\""!"
... more replace rules
echo n | psftp %1@%2 -pw "!password!" -b Test3.bat >> TestLog.log 2>&1
答案 1 :(得分:0)
我认为你想要的是这样的:
SET Test="Hello"
FOR /F "TOKENS=2 DELIMS==" %a in ('SET Test') DO @ECHO %~a
%~a删除任何引号。
答案 2 :(得分:0)
&符号和>
都需要转义(!Hello^&123^>
),因为它们当前不是%3
,而是!Hello
。
您可以使用延迟扩展来解决此问题:
setlocal enableDelayedExpansion
TestScript2.bat testuser "192.168.1.1" !password!