我必须在批处理模式下执行一个程序,该程序将在windows终端中请求用户凭据。不幸的是,在启动程序时,我只能发送用户名而不能发送密码作为输入参数。因此,我想通过python3将预定义的密码发送到终端(需要对用户可见(。这是程序所要求的唯一剩下的用户输入。由于这是一台windows机器,我不能用pexpect。我还尝试了wexpect、subprocess.communicate((和stdin.write((,但似乎不起作用。作为测试的一个最小示例,我编写了以下批处理文件,要求输入密码:
askPWD.bat
@echo off
echo START ASK PWD
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%
到目前为止我尝试过的一些例子:
我们期待:
import wexpect
child = wexpect.spawn('C:\Desktop\askPWD.bat')
child.expect('Enter Password:')
child.sendline('userinput')
print(child.before)
子流程:
from subprocess import Popen, PIPE, STDOUT
p = Popen('start cmd /K C:\Desktop\askPWD.bat', shell=True, stdout=PIPE, stdin=PIPE, stderr=STDOUT)
output= p.communicate(input=b'userpasswordn')[0]
print(output.decode())
from subprocess import Popen, PIPE, STDOUT
proc = Popen('start cmd /K C:\Desktop\askPWD.bat', shell=True, stdin=PIPE, stdout=PIPE)
proc.stdout.readline()
proc.stdin.write('userpasswordn')
所需的输出是,python将密码发送到终端,批处理模式程序继续执行。
因此,首先,批处理文件,以及我认为的任何编程语言,在没有重读的情况下,都无法实时观察计算机中发生的事情,或者基本上,尝试重新找到它。您需要制作一个新的批次标签来验证是否设置了密码。使用一个基本示例:
:verify
if exist continue goto continue
goto verify
该程序将继续,直到名为"only"的文件或文件夹出现;继续";(不区分大小写,因为没有引号(
在您的情况下,在密码情况下,您使用带有mkdir
或其他内容的文件夹,使批处理验证某个地方或某个变量中是否存在有效密码。我不建议使用文件,这很复杂。擦除文件夹只是rd (folder)
,没有人会看到文件夹。可以使用系统变量%temp%
或%tmp%
对文件夹进行armazenate。每个程序都可以看到,但这是你的优势。
我希望我帮助了你。