是否可以使用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.CreateShellStream
(ShellStream
类 ) – 它为您提供了一个可以写入和读取的Stream
接口。 当您想直接与shell交互时,此接口很有用。 - 或
SshClient.CreateShell
(Shell
类 ) – 您自己为输入,输出和错误输出提供单独的流。 当您想要将输入和输出链接/输出到现有流(如标准输入和输出或文件)时,此接口很有用。 虽然您仍然可以直接进行交互,但是如果您使用PipeStream
。 另请参见SSH.NET不处理我的shell输入命令 。
但实际上不建议使用“shell”来自动执行命令。 shell是一种交互式function,没有确定性行为。
您最好使用exec通道,请参阅如何在C#中的SSH服务器上运行命令?