是否可以使用SSH.NET从单个登录会话执行多个SSH命令?

我正在使用带有SSH.NET的C#,并且能够使客户端SSH连接正常工作,以便跨SSH执行命令。 我可以连接到虚拟机管理程序VM上的Linux安装,没有任何问题,读回StdOut和StdErr等。

但是,每个命令都像一个全新的会话 – 它始终从/home/user ,即使您使用最后一个命令从另一个目录完成。 您可以使用分号将多个命令串起来:

 pwd; cd ..; pwd 
 /home/user /home 

但是如果我执行:

 pwd 
 /home/user 

我回到了该用户的主目录。

我没有断开和关闭命令之间的会话。 以下是连续几个命令的示例代码,使用路径中的更改来说明问题:

  public void MultiCommandTest() { string output1, output2; var host = Config.SshHostName; var port = Config.SshHostPort; var user = Config.SshUsername; var pass = Config.SshPassword; var auth = new PasswordAuthenticationMethod(user, pass); var info = new ConnectionInfo(host,port,user,auth); using (var ssh = new SshClient(info)) { ssh.Connect(); var cmd1 = ssh.CreateCommand("pwd; cd ..; pwd"); output1 = cmd1.Execute(); var cmd2 = ssh.CreateCommand("pwd; cd ..; pwd"); output2 = cmd2.Execute(); ssh.Disconnect(); } string output = output1 + Environment.NewLine + output2; System.Windows.Forms.Clipboard.SetText(output); System.Windows.Forms.MessageBox.Show(output); } 

我发现在连接到Bash等时,交互式和非交互式会话之间存在差异,但对linux等知之甚少,以了解它是否可以成为解决方案的一部分(也许它必须是使用.profile.bashrc或类似方法在登录端解决?)。

题:

那么 – 有没有办法与SSH(特别是SSH.NET)建立类似shell的连接? 或者我只需要序列化任何命令集并立即发送它们,总是从头开始为任何新命令?

您可以使用以下命令实现shell会话:

  • SshClient.CreateShellStreamShellStream类 ) – 它为您提供了一个可以写入和读取的Stream接口。 当您想直接与shell交互时,此接口很有用。
  • SshClient.CreateShellShell类 ) – 您自己为输入,输出和错误输出提供单独的流。 当您想要将输入和输出链接/输出到现有流(如标准输入和输出或文件)时,此接口很有用。 虽然您仍然可以直接进行交互,但是如果您使用PipeStream 。 另请参见SSH.NET不处理我的shell输入命令 。

但实际上不建议使用“shell”来自动执行命令。 shell是一种交互式function,没有确定性行为。

您最好使用exec通道,请参阅如何在C#中的SSH服务器上运行命令?