Powershell, модуль Posh-SSH: как чтение потока должно работать в Posh-SSH?
Я пытаюсь понять, как чтение потока должно работать в Posh-SSH, поэтому я могу собрать функцию "wait-action", чтобы сценарий продолжался только после завершения удаленной команды.
Целью приведенного ниже кода, при его объединении, является запуск "yum update" на удаленной системе (Linux, CentOS 7), затем отслеживание потока, чтобы определить, когда удаленная команда выполнена, затем переход к следующей Строка сценария. Это работает "иногда", но не последовательно.
Этот код успешно устанавливает новое соединение 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" завершено, чтение потока возвращает только пустое значение. Информация, которую я смог найти в Интернете, указывает на то, что чтение потока должно возвращать строку командной строки удаленной системы, но это не так.
Поскольку значение, возвращаемое чтением после завершения команды, пустое, цикл "ожидания-действия", который я пытаюсь собрать, не работает согласованно:
$promptString = "Remote_System_Command_Prompt_String"
$streamOut = $stream.Read()
while ($streamOut -notlike "*$promptString*") {
Start-Sleep -s 1
$streamOut = $stream.Read()
}
Я не уверен, что мне здесь не хватает - документация ограничена, и я не смог найти много других примеров чтения потока Posh-SSH, которые соответствуют поведению, которое я вижу.
Любое руководство или предложения приветствуются.
Благодарю.
2 ответа
создает одну строку с/r/n
разрывы строк.
мне пришлось поставить$stream.Read()
в переменную и разбить ее на массив. Затем просканируйте каждую строку.
Короче говоря, написал набор функций для этого. Все еще тестирую.
Этот пост очень старый, но на него так и не ответили. Я никогда не видел, чтобы 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 для проверки того, что он обновился. Любой из них, вероятно, справился бы с задачей.