情景如下:
两个进程要运行在服务端,客户对这个linux毫不熟悉,因此想在window端做一个远程进程监控的小工具,网搜之后,找到了Renci.SshNet. 参考了https://blog.youkuaiyun.com/qq_17486399/article/details/117435385,使用很简单.核心代码如下:
public static string RunSSHCommands(string host, string username, string password, string command)
{
var retVal = "";
if (command == null || command.Length == 0)
{
getSSHLog("指令为空!");
}
try
{
using (var client = new SshClient(host, username, password))
{
try
{
client.Connect();
//client.KeepAliveInterval = new TimeSpan(0, 10, 4);
var cmd = client.RunCommand(command);//.Execute();
//client.
var result = cmd.Result;
var msg = cmd.Error != "" ? " \r\nerror:" + cmd.Error : "";
retVal = result + msg;
getSSHLog(retVal );
client.Disconnect();
}
catch (Exception e)
{
getSSHLog(e.Message);
}
}
}
catch (Exception e)
{
getSSHLog(e.Message);
retVal = e.Message;
}
return retVal;
}
}
其中的getSSHLog(retVal ) 是log 函数,自己写即可.
注意点如下:
运行多个命令用 ; 隔开即可.
后台运行的shell 命令的写法如下:
nohup ./youApp> output 2>&1 &
注意: 2>&1 的意思是 将标准错误输出改向到标准输出, 最后一个& 表示后台运行, output 记录程序的输出内容,相当于一个log文件.
坑是啥呢? 就是 如果写成如下格式:
nohup ./youApp> /dev/null 1>&2 &
在终端下操作,一样可以后台运行,但是使用ssh.net 的RunCommand 运行就是一个坑了,没有错误信息,也没输出结果,但是进程就是没有执行.笔者由于之前写成了这样的格式,折腾了好几天啊. 其他命令都可以唯独我这个shell不行. 关键是没有任何错误提示啊. 这或许是ssh.net 的一个小bug.
maraSun 2021-01-05 BJFWDQ.