通过SSH传递管道命令

时间:2017-04-27 15:33:48

标签: powershell ssh pipe

我使用Powershell模块Posh-SSH ssh到Ubuntu服务器并运行命令。我通过简单的行没有任何困难,例如:

$sshSession = New-SSHSession -ComputerName server001 -Credential $credential
$sshStream = New-SSHShellStream -Index $sshSession.sessionID
$sshStream.WriteLine("history")
$sshStream.Read()

最后一行完全输出了它应该是什么。我想在服务器上运行以下命令:

for guest in `nova list --all-tenants --host serverName | grep Shutdown | awk '{ print $2 }'`; do nova start $guest; sleep 5; done"

将此行直接粘贴到$sshStream.WriteLine("")并不起作用,因为`是Powershell中的转义字符,$已经用于变量。我尝试通过转义一些字符并将其放入变量来解决这个问题:

$block = "for guest in ``nova list --all-tenants --host server001 | grep Shutdown | awk '{ print `$2 }'`; do nova start `$guest; sleep 5; done"
$sshStream.WriteLine("$block")
$sshStream.WriteLine($block)

上述两次尝试都无法在服务器上正确读取。我知道如何解决这个问题,或者有更好的方法吗?

提前致谢

2 个答案:

答案 0 :(得分:0)

试试这个

$block = @"
for guest in ``nova list --all-tenants --host server001 | grep Shutdown | awk '{ print `$2 }'`; do nova start `$guest; sleep 5; done
"@

$sshStream.WriteLine($block)

它会将“块”视为文字字符串(即没有转义)。

答案 1 :(得分:0)

正如TessellatingHeckler建议的那样,我使用单引号并且它有效:

$block = 'for guest in `nova list --all-tenants | grep Shutdown | awk ''{ print $2 }''`; do nova stop $guest; done'
$sshStream.WriteLine($block)