使用PowerShell将文本发送到Python进程的密码STDIN

时间:2016-04-20 11:28:55

标签: python powershell stdin

我正在尝试创建一个powershell脚本,该脚本将输入一个来自Credential Manager的密码到Python脚本的密码输入中。在this older post中,我找到了一些关于如何使用Powershell启动进程然后在STDIN中输入一些文本的信息,但出于某种原因,这种方法对我不起作用。我执行python脚本,它只是在Powershell命令行窗口中等待密码输入。

这是代码,它正确执行Python脚本,要求输入密码,但之后没有任何反应。我可以手动输入密码并单击回车,但这当然不是目的。然后我可以自己执行python脚本。

$executingScriptDirectory = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
. $executingScriptDirectory\CredMan.ps1

$launcherScript = Join-Path $executingScriptDirectory "launcher.py"
$credTarget = 'some-target-in-credential-manager'

Write-Host "Loading password from Windows credmgr entry '$credTarget' ..."

[object] $cred = Read-Creds $credTarget
if ($cred -eq $null)
{
    Write-Host ("No such credential found: {0}" -f $credTarget)
    Exit 2
}

# Found the credential; grab the password and boot up the launcher
[string] $password = $cred.CredentialBlob

Write-Host "Launching $launcherScript ..."
Write-Host "Password: '$password'"

$psi = New-Object System.Diagnostics.ProcessStartInfo;
$psi.Arguments = "$launcherScript "
$psi.FileName = "python.exe";
$psi.UseShellExecute = $false; # start the process from its own executable file
$psi.RedirectStandardInput = $true; # enable the process to read from stdin

$p = [System.Diagnostics.Process]::Start($psi);

Start-Sleep -s 2 # wait 2 seconds so that the process can be up and running
$p.StandardInput.WriteLine($password); 
$p.WaitForExit()

问题是什么?使用此行在python脚本中请求密码,因此使用getpass模块。

password = getpass.getpass("Enter your password: ")

感谢您的帮助。

如果您需要更多信息,请直接索取:)。

2 个答案:

答案 0 :(得分:1)

我认为Python进程不会从STDIN流中读取密码,而是直接从进程附加到的终端读取密码。此终端流不受您在启动子进程之前安装的任何重定向的影响,因此写入进程的STDIN不会影响这一点。您可以直接使用键盘输入密码进入Python流程并且接受它,这一事实证明我是正确的,我会说。

在你的情况下,你需要调整Python进程以从其他地方读取PW,例如: G。通过传递一个特殊选项(完全取决于你的Python过程)或修补Python源本身。

也许还有特定于Windows的方法来模拟键盘按键,但我称之为非常难看的黑客,因此无法推荐。

答案 1 :(得分:1)

Alfe,谢谢你向我展示了解决这个问题的正确方向。

我已经调整了python脚本,以便它接受命令行上的参数,并且可以在-p选项之后给出密码参数,如下所示:

$ script.py -p "password"

要从powershell脚本执行此操作,我使用此代码首先从Windows Credential Manager中获取凭据,并将其作为参数提供给python脚本。

我使用现有脚本来获取凭据管理器中的凭据,即CredMan.ps1 script

# Get the path of where this script is being invocated to reference to the script files in the same directory as this script.
$executingScriptDirectory = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
# Include external script to speak with Credential Manager
. $executingScriptDirectory\CredMan.ps1

$launcherScript = Join-Path $executingScriptDirectory "script.py"
$credentialTarget = "name-of-credential-in-manager"

[object] $cred = Read-Creds $credentialTarget
if ($cred -eq $null) {
    Write-Host ("No such credential found: {0}" -f $credentialTarget)
    Exit 2
}

# Found the credential; Grab the password and execute the script with the password
[string] $password = $cred.CredentialBlob

# Execute python script with password given as parameter
$exe = "python.exe"
&$exe $launcherScript -p $password

感谢您的帮助,我希望您理解给定的答案。