ssh.net维护与服务器的对话

时间:2015-06-10 19:18:38

标签: ssh.net

我希望使用ssh.net与远程服务器保持对话

我正在做的是连接到主机,将更改目录等命令发送到除root之外的某个目录。将结果值存储为全局值。

然后我通过RunCommand()发送另一个命令来检查当前目录......

发生的事情是,我正在获取根目录,而不是我刚刚在初始运行命令中更改的目录。

似乎正在发生的事情是,虽然与服务器的连接一直处于打开状态,但我已经以某种方式重置终端会话,从而失去了我与服务器的对话。

有没有人知道如何使用ssh.net与远程服务器保持对话,这样我就可以发送多个命令并使状态保持不变?

E.g。命令1 = cd / somedir 命令2 = pwd,命令2的结果为/ somedir

1 个答案:

答案 0 :(得分:1)

E.g。命令1 = cd / somedir命令2 = pwd,命令2的结果为/ somedir

你的例子看起来很好。但我认为,您希望更改目录并在该目录中运行第二个命令。

服务器连接是到服务器的ssh隧道,它不启动shell。 RunCommand()创建一个shell并运行一个命令,第二个RunCommand也创建一个新的shell并运行该命令,因此更改目录不会在命令之间保持不变。

建立连接后,使用ShellStream创建一个shell,您可以从中发送和接收交互式命令。

来自codeplex的示例:

    string command = "your command";

    using (var ssh = new SshClient(connectionInfo))
{
    ssh.Connect();
    string reply = String.Empty;

    try
    {
    using (var shellStream = ssh.CreateShellStream("dumb", 0, 0, 0, 0, BUFFERSIZE))
        {
            // Wait for promt for 10 seconds, if time expires, exception is thrown
            reply = shellStream.Expect(new Regex(@":.*>"), new TimeSpan(0, 0, 10));
            shellStream.WriteLine(command);

            // Wait for Read for 10 seconds, if time expires, exception is thrown
            string result = shellStream.ReadLine(new TimeSpan(0, 0, 10));
        }
    }
    catch
    {
        // Do something
    }
}