gpt4 book ai didi

c# - 是否可以使用 SSH.NET 从单个登录 session 执行多个 SSH 命令?

转载 作者:行者123 更新时间:2023-11-30 15:56:26 26 4
gpt4 key购买 nike

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

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

pwd; cd ..; pwd
/home/user
/home

但是如果我执行:

pwd
/home/user

我回到了该用户的主目录。

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

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 等时,交互式 session 和非交互式 session 之间存在差异,但对 linux 等了解不多,不知道这是否可以作为解决方案的一部分(即,也许它必须在登录端用 .profile.bashrc 或类似的方法解决?)。

问题:

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

最佳答案

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

  • SshClient.CreateShellStream(ShellStream 类)— 它为您提供了一个Stream 接口(interface),您既可以写入也可以读取。当您想直接与 shell 交互时,此接口(interface)很有用。
  • SshClient.CreateShell(Shell 类)— 您自己为输入、输出和错误输出提供单独的流。当您想要将输入和输出链接/管道化到现有流(如标准输入和输出或文件)时,此接口(interface)很有用。尽管您仍然可以直接交互,但如果您使用 PipeStream。另见 SSH.NET doesn't process my shell input commands .

但是不推荐使用“shell”来自动执行命令。 shell 是一种交互式功能,不具有确定性行为。

你最好使用 exec channel ,参见 How to run commands on SSH server in C#?

关于c# - 是否可以使用 SSH.NET 从单个登录 session 执行多个 SSH 命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46847304/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com