Lig*_*tCC 5 .net c# ssh session ssh.net
我正在将 C# 与 SSH.NET 一起使用,并且已经能够使客户端 SSH 连接正常工作以通过 SSH 执行命令。我可以毫无问题地连接到管理程序 VM 上的 Linux 安装,回读StdOut和StdErr等。
但是,每个命令就像一个全新的会话 - 它总是从 开始/home/user,即使您使用最后一个命令从另一个目录结束也是如此。您可以使用分号将多个命令串在一起:
pwd; cd ..; pwd
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)/home/user /home
但是如果我执行:
pwd
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)/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);
}
Run Code Online (Sandbox Code Playgroud)
我意识到在连接到 Bash 等时交互式会话和非交互式会话之间存在差异,但对 linux 等的了解不够,不知道这是否可以成为解决方案的一部分(即可能必须是解决了与登录一侧.profile,.bashrc或类似的?)。
那么 - 有没有办法与 SSH(尤其是 SSH.NET)建立类似 shell 的连接?或者我是否只需要序列化任何一组命令并一次发送它们,对于任何新命令总是从头开始?
您可以使用以下方法实现 shell 会话:
SshClient.CreateShellStream( ShellStreamclass) — 它为您提供了一个Stream可以读写的接口。当您想直接与 shell 交互时,此接口很有用。SshClient.CreateShell(Shell类) — 您自己为输入、输出和错误输出提供单独的流。当您想将输入和输出链接/管道到现有流(如标准输入和输出或文件)时,此接口很有用。尽管您仍然可以直接交互,但如果您使用PipeStream. 另请参阅SSH.NET 不处理我的 shell 输入命令。但是真的不建议使用“shell”来自动执行命令。外壳是一种交互式功能,没有确定性行为。
您最好使用 exec 通道,请参阅如何在 C# 中的 SSH 服务器上运行命令?
| 归档时间: |
|
| 查看次数: |
7741 次 |
| 最近记录: |