C# - SSH Winforms 模拟控制台
本文关键字:模拟 控制台 Winforms SSH | 更新日期: 2023-09-27 18:34:53
我知道这个问题被问了很多,但我似乎找不到一个好的开始方法。
我一直在使用 sharpssh,但它是为控制台应用程序制作的。因此,当我尝试创建 winforms 应用程序时,我无法让它按照我想要的方式运行。
在我的表格中,我有:显示输出的文本框用户应在其中编写命令的文本框。
我卡在readline((,我需要暂停应用程序,直到用户点击输入,然后发送插入文本框中的命令。我不知道如何将应用程序转换为wform应用程序。
所以问题是如何去做呢?- 我是否应该使用一个在初始化应用程序时启动的进程,以及一个在收到输出并需要输入时启动的进程?并使用第二个进程收集输入,监听文本框中按下的事件输入键并启动另一个进程发送输入并再次等待输出?
如果是这样,有关于如何解决它的示例吗?
这是代码?
public Form1()
{
InitializeComponent();
txthost.Text = "XXX";
txtuser.Text = "XXXXX";
txtpass.Text = "XXXXX";
string pattern = "sdf:";
mPattern = pattern;
this.txtInput.KeyPress += new System.Windows.Forms.KeyPressEventHandler(checkforenter);
}
public void button1_Click(object sender, EventArgs e)
{
try
{
mShell = new SshShell(Host, User);
mShell.Password = Pass;
//WRITING USER MESSAGE
txtOutput.AppendText("Connecting...");
mShell.Connect();
txtOutput.AppendText("OK");
//txtOutput.AppendText("Enter a pattern to expect in response [e.g. '#', '$', C:''''.*>, etc...]: ");
//Stop for user input
mShell.ExpectPattern = mPattern;
mShell.RemoveTerminalEmulationCharacters = true;
_writer = new TextBoxStreamWriter(txtOutput);
Console.SetOut(_writer);
StringReader reader = new StringReader(txtInput.Text);
while (mShell.ShellOpened)
{
txtOutput.AppendText("'r'n" + "TERMINAL MODE ENGAGED");
txtOutput.AppendText(mShell.Expect( pattern ));
txtInput.Text = Console.ReadLine();
Console.ReadLine();
Console.WriteLine(Environment.NewLine);
txtOutput.AppendText(mShell.Expect(pattern));
MessageBox.Show("innan enter 2");
Console.WriteLine(Environment.NewLine);
txtOutput.AppendText(mShell.Expect(("(continue)")));
MessageBox.Show("efter enter 2");
Console.WriteLine(Environment.NewLine);
//Data from termninal --> Append to text
string output = mShell.Expect(Pattern);
txtOutput.AppendText(output);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
根据 SharpSSH 关于 Codeproject (http://www.codeproject.com/Articles/11966/sharpSsh-A-Secure-Shell-SSH-library-for-NET( 的文章,有两种方法可以读取和写入 SSH 连接:
//Writing to the SSH channel
ssh.Write( command );
//Reading from the SSH channel
string response = ssh.ReadResponse();
文本框将成为控制台,因此无需再使用 Console 对象。您需要检测何时按下 Enter 键。按下时,执行 Write 命令并将上次键入的内容发送到 SSH 连接中。然后执行 ReadResponse,这将暂停应用程序并等待响应。返回后,可以将生成的字符串追加到文本框中。
您可能会担心检测用户输入的内容并将其发送到SSH连接。您可以做的是每次执行 ReadResponse 时,获取文本框中的字符索引,然后在按 Enter 后将其与字符所在的位置一起使用。
或者,您可以只使用两个文本框,一个用于输入,一个用于输出。
希望这有帮助!