我在使用 SSH.NET 库时遇到了 2 个问题。
我想创建 SSH 连接然后断开连接。但是如果我开始异步读取,断开连接会导致问题。当我尝试结束连接时,我的程序只是冻结了。
public void button1_Click(object sender, EventArgs e)
{
var ssh = new SshClient(IP, UserName, Password);
ssh.Connect();
var stream = ssh.CreateShellStream("anything", 80, 24, 800, 600, 4096);
byte[] buffer = new byte[1000];
stream.BeginRead(buffer, 0, buffer.Length, null, null);
stream.DataReceived += new EventHandler<Renci.SshNet.Common.ShellDataEventArgs>(
(s, ex) =>
{
Invoke((MethodInvoker)delegate
{
textBox1.AppendText(stream.Read());
});
}
);
stream.WriteLine("ls");
stream.Dispose();
ssh.Disconnect(); //problem here
}
我也不知道如何创建一个可以在代码中的任何位置使用的连接。我希望能够定义 IP、用户名和密码(例如将它们写在一些文本框中),建立连接,然后通过执行一些命令和获取输入来与之交互。据我了解,传递凭据需要一些事件处理程序(例如 button1_Click),但是如果我想与stream = ssh.CreateShellStream(...)
通过传递命令创建的交互,例如 button2_Click,我不能这样做,因为“名称”流“不存在于当前上下文”。
早些时候,我一直通过 plik(来自 PuTTY)和 C# 的 Process 功能来做这件事:
private void ConnectButton_Click(object sender, EventArgs e)
{
...
p = new Process();
...
sw = p.StandardInput;
...
}
其中 sw 是在 ConnectButton_Click 事件处理程序之外定义的流编写器。
谢谢。