我将 C# 与 SSH.NET 结合使用,并且能够使客户端 SSH 连接正常工作,以便通过 SSH 执行命令。我可以毫无问题地连接到虚拟机管理程序虚拟机上安装的 Linux,请读回StdOut
and StdErr
, etc.
然而,每个命令就像一个全新的会话 - 它总是从/home/user
,即使您使用最后一个命令从另一个目录完成。你can用分号将多个命令串在一起:
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 的连接?或者我是否只需要序列化任何命令集并一次发送所有命令,对于任何新命令始终从头开始?
您可以使用以下方法实现 shell 会话:
-
SshClient.CreateShellStream
(ShellStream
类)——它给你一个Stream
接口,您可以写入和读取。当您想直接与 shell 交互时,此接口非常有用。
- or
SshClient.CreateShell
(Shell
class) — 您自己为输入、输出和错误输出提供单独的流。当您想要将输入和输出链接/管道到现有流(例如标准输入和输出或文件)时,此接口非常有用。尽管您仍然可以直接交互,但如果您使用PipeStream
。也可以看看SSH.NET 不处理我的 shell 输入命令.
但实际上不建议使用“shell”来自动执行命令。 shell 是一种交互式功能,不具有确定性行为。
您最好使用执行通道,请参阅如何用 C# 在 SSH 服务器上运行命令?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)