如何在powershell作业中插入用户输入?

xqk2d5yq  于 2023-04-12  发布在  Shell
关注(0)|答案(1)|浏览(129)

我有一个启动后台作业的PowerShell脚本(它使用kubectl进行端口转发):

$forwardjob = Start-Job -ScriptBlock{kubectl port-forward service/db 7125:7125} -Name "Database Port-Forwarder"

这很好用,但是kubectl经常会要求凭证。我想知道在这种情况下我如何捕获和插入一些用户输入?
我的想法是在下面的两行中等待一段时间,直到我们确定有响应,然后检查结果,如果有密码提示,只需输入它。然而,在这一点上,作业总是导致错误(由于缺少输入),作业完成。

$forwardjob = Start-Job -ScriptBlock{kubectl port-forward service/db 7125:7125} -Name "Database Port-Forwarder"
Start-Sleep -Milliseconds 1000
$result = Receive-Job -Job $forwardjob

因此,问题是如何捕获输入提示并正确输入它?

hyrbngr7

hyrbngr71#

Start-Job(PowerShell background job)上下文中,响应外部程序呈现的交互式提示的唯一方法是通过 * 管道*提前发送所有响应 *。
这与您在 * 直接 * 调用中自动响应外部程序的交互式提示所使用的技术相同。但是,请注意-与直接调用不同-在使用后台作业时,您根本无法 * 交互式 * 响应交互式提示。
即:

  • 您无法控制发送响应的时间:它们在启动外部程序后立即被发送到外部程序的 stdin(标准输入)流。
  • 您需要按照您预期的顺序,预期程序可能显示的 * 所有 * 交互式提示(如果不止一个),如您发送的输入顺序所反映的那样。
  • 此外,这种技术基本上只能工作:
  • 如果外部程序从stdin* 读取对其交互式提示 * 的响应(而不是直接从控制台/终端读取)。
  • 如果外部程序在提示之前没有清除其预输入缓冲区,特别是在某些其他处理发生之前它可能不会提示。

请注意,外部程序可能会(明智地)将其提示 * 消息 * 直接打印到终端(例如,Enter your password:),这意味着它们不会 * 显示在后台作业通过Receive-Job捕获和输出的内容中。
以下是独立的、特定于平台的示例,展示了该技术:他们使用平台原生shell来模拟一些处理,然后提示输入“密码”并回显响应,这是通过PowerShell的管道预先提供的:* 也许不用说,以这种方式提供纯文本密码存在安全风险 *。

  • windows
'somepassword' | 
  Start-Job { cmd /v /c 'echo doing things... & powershell -NoProfile sleep 2  & set /p pass=Enter^ password: & echo You entered: !pass!' } |
  Receive-Job -AutoRemoveJob -Wait
  • 类Unix平台:
'somepassword' |
  Start-Job { bash -c 'echo doing things...; sleep 2; read -p ''Enter password: '' pass; echo You entered: $pass' } |
  Receive-Job -AutoRemoveJob -Wait

相关问题