我试图了解在 Posh-SSH 中读取流的工作原理,以便我可以组合一个“等待操作”函数,以便脚本仅在远程命令完成后才继续。
下面显示的代码放在一起的目的是在远程系统 (Linux、CentOS 7) 上启动“yum update”,然后监视流以确定远程命令何时完成,然后继续执行脚本的下一行。它确实“有时”有效,但并不总是有效。
此代码成功建立了一个新的 SSH 连接并定义了一个流:
$hostIP = "Remote_Linux_Server_IP"
$centosCreds = "My_Credential_Object"
$pemFile = "My_Pem_File"
New-SSHSession -ComputerName $hostIP -Port 22 -Credential $centosCreds -KeyFile $pemFile -ConnectionTimeout 120 -OperationTimeout 120 -AcceptKey
$stream = New-SSHShellStream -Index 0
通过新流执行远程命令非常简单:
Invoke-SSHStreamShellCommand -ShellStream $stream -Command "yum update"
在 Invoke-SSHStreamShellCommand 命令(yum update)运行时运行以下命令将按预期返回远程命令输出的片段:
$stream.Read()
但是,一旦“yum update”完成,流读取仅返回一个空白值。我在网上找到的信息表明流读取应该返回远程系统命令提示符字符串,但事实并非如此。
因为命令完成后读取返回的值为空,所以我尝试组合的“等待操作”循环无法持续工作:
$promptString = "Remote_System_Command_Prompt_String"
$streamOut = $stream.Read()
while ($streamOut -notlike "*$promptString*") {
Start-Sleep -s 1
$streamOut = $stream.Read()
}
我不确定我在这里遗漏了什么 - 文档有限,而且我找不到与我所看到的行为相匹配的许多其他 Posh-SSH 流读取示例。
欢迎任何指导或建议。
谢谢。
答案1
这篇文章非常老了,但实际上从未得到过答复。我从未见过 stream.reaed() 返回命令提示符。以下一些变体可能有效:
$promptString = "Remote_System_Command_Prompt_String"
$streamOut = $stream.Read()
while (($streamOut).length -ne 0) {
Start-Sleep -s 1
$streamOut = $stream.Read()
}
其他选项包括使用 -match 并查找完成时使用的短语或休眠更长时间,然后检查 yum 日志以验证它是否已更新。任何这些选项都可能完成任务。
答案2
$stream.Read()
/r/n
生成带有换行符的单个字符串。
我必须将其放入$stream.Read()
一个变量并将其拆分成一个数组。然后扫描每一行。
长话短说,写了一个函数集这样做。仍在测试中。