我正在使用带有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的连接?或者我只是需要序列化任何命令集并立即发送它们,总是从头开始为任何新命令?
答案 0 :(得分:2)
您可以使用以下方法实现shell会话:
SshClient.CreateShellStream
(ShellStream
class) - 它为您提供了一个Stream
接口,您可以同时编写和读取。当您想直接与shell交互时,此界面非常有用。SshClient.CreateShell
(Shell
class) - 您自己为输入,输出和错误输出提供单独的流。当您想要将输入和输出链接/输出到现有流(如标准输入和输出或文件)时,此接口很有用。虽然您仍然可以直接互动,但如果您使用PipeStream
。另请参阅SSH.NET doesn't process my shell input commands。但实际上不建议使用“shell”来自动执行命令。 shell是一种交互式功能,没有确定性行为。
您最好使用exec频道,请参阅How to run commands on SSH server in C#?
答案 1 :(得分:0)
作为记录,可以通过使用SSH连接并打开隧道,然后使用telnet进行交互来解决此问题。 SSH.NET在交互方面还不够成熟。