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

Lig*_*tCC 5 .net c# ssh session ssh.net

我正在将 C# 与 SSH.NET 一起使用,并且已经能够使客户端 SSH 连接正常工作以通过 SSH 执行命令。我可以毫无问题地连接到管理程序 VM 上的 Linux 安装,回读StdOutStdErr等。

但是,每个命令就像一个全新的会话 - 它总是从 开始/home/user,即使您使用最后一个命令从另一个目录结束也是如此。您可以使用分号将多个命令串在一起:

pwd; cd ..; pwd
Run Code Online (Sandbox Code Playgroud)
/home/user
/home
Run Code Online (Sandbox Code Playgroud)

但是如果我执行:

pwd
Run Code Online (Sandbox Code Playgroud)
/home/user
Run Code Online (Sandbox Code Playgroud)

我回到了那个用户的主目录。

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

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);
}
Run Code Online (Sandbox Code Playgroud)

我意识到在连接到 Bash 等时交互式会话和非交互式会话之间存在差异,但对 linux 等的了解不够,不知道这是否可以成为解决方案的一部分(即可能必须是解决了与登录一侧.profile.bashrc或类似的?)。

题:

那么 - 有没有办法与 SSH(尤其是 SSH.NET)建立类似 shell 的连接?或者我是否只需要序列化任何一组命令并一次发送它们,对于任何新命令总是从头开始?

Mar*_*ryl 6

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

  • SshClient.CreateShellStream( ShellStreamclass) — 它为您提供了一个Stream可以读写的接口。当您想直接与 shell 交互时,此接口很有用。
  • SshClient.CreateShell(Shell类) — 您自己为输入、输出和错误输出提供单独的流。当您想将输入和输出链接/管道到现有流(如标准输入和输出或文件)时,此接口很有用。尽管您仍然可以直接交互,但如果您使用PipeStream. 另请参阅SSH.NET 不处理我的 shell 输入命令

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

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