PowerShell,读写/写入SSH.NET流

我想通过SSH连接到服务器,使用PowerShell, 然后更改为其他用户

为了通过SSH实现与PowerShell的服务器连接,我使用SSH.NET库中的 SSH和如何通过SSH连接 PowerShell来使用 SSH 。 这很棒,并为我提供了简单的命令行开关,例如new-sshsessioninvoke- sshcommand

接下来,我想su给不同的用户。 当我尝试通过命令行开关这样做时,我得到了错误: 标准必须是tty

我知道我可以编辑服务器上的安全设置,让我在没有处于交互模式的情况下使用su 。 但是,我无法在我想要连接的所有服务器上更改该设置。

使用我在https://sshnet.codeplex.com/discussions/285853上找到的C#示例,我把它放在一起:

$server = "server1" $port = 22 $username = "user1" $password = "password1" $ssh = new-object Renci.SshNet.SshClient($server, $port, $username, $password) $ssh.Connect() $inputstream = new-object System.IO.MemoryStream $streamwriter = new-object System.IO.StreamWriter($inputstream) $outputstream = new-object System.IO.MemoryStream $streamreader = new-object System.IO.StreamReader($outputstream) $shell = $ssh.CreateShell($inputstream, $outputstream, $outputstream) $shell.Start() $streamwriter.WriteLine("echo hello > tempfile.txt") $streamwriter.Flush() $streamreader.ReadToEnd() $shell.Stop() 

运行,我得到输出,如:

 Last login: Fri Nov 8 11:37:45 2013 from 10.XXX.XXX.XXX [user1@server1 /users/user1] 

但是,/ /users/user1/tempfile.txt永远不会被写入,我不会得到任何进一步的输出。

你看到我做错了吗?

使用https://sshnet.codeplex.com/discussions/439210中的示例,我能够使用以下代码解决我的问题。 主要问题是我正在为输入/输出创建两个不同的流,我只需要使用一个流。

 $server = "server1" $port = 22 $username = "user1" $password = "password1" ############################################################### function ReadStream($reader) { $line = $reader.ReadLine(); while ($line -ne $null) { $line $line = $reader.ReadLine() } } function WriteStream($cmd, $writer, $stream) { $writer.WriteLine($cmd) while ($stream.Length -eq 0) { start-sleep -milliseconds 500 } } ############################################################### $ssh = new-object Renci.SshNet.SshClient($server, $port, $username, $password) $ssh.Connect() $stream = $ssh.CreateShellStream("dumb", 80, 24, 800, 600, 1024) $reader = new-object System.IO.StreamReader($stream) $writer = new-object System.IO.StreamWriter($stream) $writer.AutoFlush = $true while ($stream.Length -eq 0) { start-sleep -milliseconds 500 } ReadStream $reader WriteStream "su - root" $writer $stream ReadStream $reader WriteStream "password" $writer $stream ReadStream $reader WriteStream "pwd" $writer $stream ReadStream $reader $stream.Dispose() $ssh.Disconnect() $ssh.Dispose()