Linuxコマンドを実行し、PuTTYなどのWindowsアプリケーションのテキストボックスに結果を表示する方法はありますか?.
たとえば、次のコマンドを実行しようとしています
wget http://centos-webpanel.com/cwp-latest
sh cwp-latest
次のコードを使用する
SshClient sshclient = new SshClient(IPtxtBox.Text, UserNameTxt.Text, PasswordTxt.Text);
sshclient.Connect();
ShellStream stream = sshclient.CreateShellStream("customCommand", 80, 24, 800, 600, 1024);
resultTxt.Text = SSHCommand.SendCommand(stream, "wget http://centos-webpanel.com/cwp-latest && sh cwp-latest");
private static void WriteStream(string cmd, StreamWriter writer, ShellStream stream)
{
writer.WriteLine(cmd);
while (stream.Length == 0)
Thread.Sleep(500);
}
private static string ReadStream(StreamReader reader)
{
StringBuilder result = new StringBuilder();
string line;
while ((line = reader.ReadLine()) != null)
result.AppendLine(line);
return result.ToString();
}
private static string SendCommand(ShellStream stream, string customCMD)
{
StringBuilder strAnswer = new StringBuilder();
var reader = new StreamReader(stream);
var writer = new StreamWriter(stream);
writer.AutoFlush = true;
WriteStream(customCMD, writer, stream);
strAnswer.AppendLine(ReadStream(reader));
string answer = strAnswer.ToString();
return answer.Trim();
}
このコマンドの実行には時間がかかり、結果テキストボックスに結果が表示されません。
まず、正当な理由がない限り、「シェル」チャネルを使用してコマンドの実行を自動化しないでください。 「exec」チャネル(SSH.NETではCreateCommand
またはRunCommand
)を使用します。
出力をTextBox
にフィードするには、バックグラウンドスレッドでストリームを読み続けます。
private void button1_Click(object sender, EventArgs e)
{
new Task(() => RunCommand()).Start();
}
private void RunCommand()
{
var Host = "hostname";
var username = "username";
var password = "password";
using (var client = new SshClient(Host, username, password))
{
client.Connect();
// If the command2 depend on an environment modified by command1,
// execute them like this.
// If not, use separate CreateCommand calls.
var cmd = client.CreateCommand("command1; command2");
var result = cmd.BeginExecute();
using (var reader =
new StreamReader(cmd.OutputStream, Encoding.UTF8, true, 1024, true))
{
while (!result.IsCompleted || !reader.EndOfStream)
{
string line = reader.ReadLine();
if (line != null)
{
textBox1.Invoke(
(MethodInvoker)(() =>
textBox1.AppendText(line + Environment.NewLine)));
}
}
}
cmd.EndExecute(result);
}
}
わずかに異なるアプローチについては、同様のWPFの質問を参照してください。
SSH.NETリアルタイムコマンド出力監視 。
Pythonなどの一部のプログラムは、この方法で実行すると出力をバッファリングする場合があります。見る:
ローカルコンソールでC#SSH.NETを使用して実行されたリモートホスト(Raspberry Pi)で実行されているプログラムPythonプログラム)からの出力を継続的に書き込む方法?