是否可以使用SSH.NET?

时间:2017-10-20 10:34:52

标签: c# session ssh ssh.net

我正在使用带有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的连接?或者我只是需要序列化任何命令集并立即发送它们,总是从头开始为任何新命令?

2 个答案:

答案 0 :(得分:2)

您可以使用以下方法实现shell会话:

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

您最好使用exec频道,请参阅How to run commands on SSH server in C#?

答案 1 :(得分:0)

作为记录,可以通过使用SSH连接并打开隧道,然后使用telnet进行交互来解决此问题。 SSH.NET在交互方面还不够成熟。