我身上真的发生了奇怪的事情。
我有ssh命令,该命令在远程服务器上执行python脚本。 当我通过PuTTY执行它时,它应该像应该的那样工作并显示所需的输出。但是,当使用ssh.net通过我的C#应用程序执行该命令时,它总是返回一些旧的数据,这些数据已经很久没有从服务器上使用了(freebsd 9.3)。
这是我执行命令并捕获输出的方式:
var task = new Task(() => {
var ret = ssh_instance.CreateCommand("cd /home/" + "python python_script.py -param");
ret.Execute();
FlexibleMessageBox.Show(ret.Result);
});
task.Start();
这在我看来是无法解释的,因此,如果有人能启发我我在做什么错,我将非常感激。
答案 0 :(得分:-1)
请记住。
您需要根据每个命令读取流中接收到的所有数据。
->我认为,这就是为什么从连接中获得旧结果的原因。
因此,我尝试使用Renci.SshNet.ShellStream类。在我的代码中是
private Renci.SshNet.SshClient _client = null;
private Renci.SshNet.ShellStream shellStream = null;
private void connect()
{
try
{
this.disConnect();
_client = new Renci.SshNet.SshClient(cboUri.Text, tbxSrvUsr.Text, tbxSrvPW.Text);
//_client.ErrorOccurred += new EventHandler<Renci.SshNet.Common.ExceptionEventArgs>(_client_ErrorOccurred);
//_client.HostKeyReceived += new EventHandler<Renci.SshNet.Common.HostKeyEventArgs>(_client_HostKeyReceived);
_client.Connect();
byte[] buffer = new byte[1000];
shellStream = _client.CreateShellStream("Jornathan", 80, 24, 800, 800, 1024);
shellStream.BeginRead(buffer, 0, buffer.Length, null, null);
shellStream.DataReceived += new EventHandler<Renci.SshNet.Common.ShellDataEventArgs>(shellStream_DataReceived);
tbxStatus.Text = "Connected";
this.btnConnect.Enabled = false;
this.cboServerList.Enabled = false;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
并添加方法以从服务器读取所有文本。 请记住,您应该阅读所有文本,直到遇到接收到的数据大小为“ 0”为止。请参阅以下内容。
private void readOutput()
{
do
{
string strOutput = shellStream.ReadLine();
if (strOutput != null && strOutput.Length > 0)
{
System.Console.WriteLine(strOutput);
this.SetStatusText(strOutput);
}
else
{
break;
}
} while (true);
}
然后添加事件处理程序,就是这样!
private System.Threading.Thread Thread_OutputHandle = null;
private void shellStream_DataReceived(object sender, Renci.SshNet.Common.ShellDataEventArgs e)
{
if (Thread_OutputHandle == null)
{
Thread_OutputHandle = new System.Threading.Thread(new System.Threading.ThreadStart(readOutput));
Thread_OutputHandle.Start();
}
else if (Thread_OutputHandle.ThreadState == System.Threading.ThreadState.Stopped)
{
Thread_OutputHandle.Abort();
Thread_OutputHandle = new System.Threading.Thread(new System.Threading.ThreadStart(readOutput));
Thread_OutputHandle.Start();
}
}
其他: 我希望记住我在哪里可以帮助制作此代码。 但是我不能。
当您找到需要帮助的代码位置时,请告诉我。 我将其位置添加到这里。