我正在尝试将Putty的plink.exe用作Powershell脚本的一部分,并且在准备输出时遇到了麻烦。
某些命令调用交互式响应(例如:输入密码)。具体来说,我正在针对Isilon进行测试。
示例代码:
$command = '&"C:\Program Files\Putty\plink.exe" [email protected] -pw "password" -t -batch "isi auth users create testuser --set-password"'
iex $command
预期结果:
password:
confirm:
如果我尝试使用iex $command | tee-object -variable result
来准备输出,或者甚至只是使用iex $command *>test.log
重定向,则提示文本直到我响应后才显示。尽管在技术上仍然可以正常运行,但是如果您不确切知道期望什么提示,那么它就没有用。
我已经尝试过使用Start-Transcript,但这根本无法捕获输出。我也尝试过使用plink的-sshlog参数,但是它记录的方式太多了,而且格式不易读。
有什么方法可以在控制台中将stdout取消缓冲,也可以将其存储在变量中?
回答一些潜在的问题:
-这将在不允许使用模块的环境中运行,因此不能使用Posh-SSH。
-可用的Powershell版本不够新,无法使用内置的openssh功能。
这全部与重定向流有关。
使用重定向时,所有输出从流中重定向,并传递以写入文件。执行时:
Write-Host "Some Text" *>out.txt
您看不到任何输出,并且所有输出都重定向到文件。
主要说明:重定向以逐行为基础(简化),如下重定向通过一次向文件写入一行来实现。
类似地,当您使用Tee-Object
时,所有输出从流重定向到管道。这被传递到cmdlet Tee-Object
。 Tee-Object
接受输入,然后将该输入写入所需的变量/文件和屏幕。发生这种情况After收集并处理了输入。
这意味着重定向和Tee-Object
命令都逐行工作。 这很有意义重定向和Tee-Object
命令都以这种方式工作,因为在尝试同时编辑和维护打开的文件时,很难处理诸如删除字符,四处移动和动态编辑文本之类的事情。仅在语句完成后才输出,仅用于单向。
在这种情况下,当以交互方式运行它时,password:
提示将写入屏幕,您可以进行响应。
[重定向/准备输出时,password:
文本提示将被重定向并缓冲,以等待您的响应。 这很有意义,因为该语句尚未完成。您不想发送可能会更改的一半声明,也不希望在管道中发送一半的对象。只有完成语句(例如,输入密码+ Enter)后,整个语句才沿流/管道传递。整个语句发送完毕后,便会重定向/输出Tee,并可以显示。@ Bill_Stewart是正确的,在某种意义上,您应该选择交互式提示或全自动解决方案。