SSH:将远程命令发送到本地后台

时间:2012-07-17 18:38:26

标签: shell ssh tcpdump

所以我遇到类似于how to send ssh job to background的问题。

我有一个windows c#程序自动执行使用http://sshnet.codeplex.com/在远程linux os上执行tcpdump。我正在尝试在远程linux上执行tcpdump,并在断开连接后保持运行。

我一直在使用plink进行大量调试,但似乎无法达到预期的效果。我试过了:

plink root@10.5.1.1 bash -c "tcpdump -i eth0 -w test.cap"

但它保留了sshclient,直到我ctrl + C(不适用于自动化解决方案)。我也尝试了各种变体:

plink root@10.5.1.1 bash -c "tcpdump -i eth0 -w test.cap &"

但是该命令根本不执行(test.cap不存在)或立即终止(test.cap包含1行)。在测试期间,我已经离开了ping,所以捕获应该有 somthing ......

前面提到的链接解决了 screen 的问题,但是远程linux os不可配置且没有屏幕。欢迎任何建议。

6 个答案:

答案 0 :(得分:5)

在后一种情况下,当您断开连接时,您的tcpdump进程可能会被中止。尝试:

plink root@10.5.1.1 bash -c "nohup tcpdump -i eth0 -w test.cap &"

请参阅nohup的联机帮助页。您可能还需要考虑将stdout和stderr重定向到文件或/dev/null以防止nohup将输出写入文件:

plink root@10.5.1.1 bash -c "nohup tcpdump -i eth0 -w test.cap >/dev/null 2>&1 &"

答案 1 :(得分:2)

启动远程应用程序时遇到了类似的问题。这种模式在Debian服务器上对我有用:

ssh root@server "nohup /usr/local/bin/app -c cfg &; exit"

另外:进行另一次测试,上面没有用,即。该命令未在远程服务器上启动。添加在退出之前成功返回的命令似乎有效。

ssh root@server "nohup /usr/local/bin/otherapp &; w; exit"

答案 2 :(得分:1)

我有类似的情况: (在Windows机器上)我想创建一个ms批处理脚本来打开与raspberry pi的SSH连接并在后台执行本地脚本。 我发现将Raj和fahd的答案结合起来对我来说很有用:

我的ms批处理脚本:

plink -load "raspberry Pi" -t -m startCommand.txt

startCommand.txt 的内容如下:

nohup /home/pi/myscript >/dev/null 2>&1 &
w
exit

"> / dev / null 2>& 1"很重要! 我发现(困难的方式)RPi的SD卡通过一个非常大的nohup.out文件(并且使用完整的SD卡,RPi甚至无法正常登录)保持满满。

推理:

我使用-load在PuTTY中加载已保存的会话(我这样做是因为我使用公钥/私钥而不是密码进行身份验证,但这应该与在主机中输入相同)

然后-t(由Raj推荐)

然后-m加载该文件中的命令列表

没有参数" -t"没有" w"和"退出",我的批处理脚本只会运行,而不是执行' myscript'并再次关闭。

答案 3 :(得分:0)

我有同样的问题。我有一个我没有tcpdump的脚本....& 。当ssh完成时,我无法使用ssh来运行它。我提出的解决方案非常简单。我刚刚将sleep 5添加到我脚本的末尾,它运行得很好。看来tcpdump需要几秒钟才能在你退出之前安全地进入后台,即使是nohup也是如此。

答案 4 :(得分:0)

我遇到了同样的问题,我发现“-t”选项似乎对nohup很重要。如果没有“-t”选项,我发现nohup没有生效。

ssh -t user@remote 'nohup tcpdump -i any -w /tmp/somefile &>/dev/null & sleep 2'

答案 5 :(得分:0)

我认为我已经把它钉了,至少在IBM AIX上是

我正在使用

ssh -tq user@host "/path/start-tcpdump.ksh"

(通过publick键进行身份验证)。 我使用简单的“nohup tcpdump ....&”来获得不一致的结果,有时它有效,有时它没有,有时它甚至被阻止,我不得不断开会话。 到目前为止,这工作正常,我不能说它为什么工作,但它是......

这是我的开始-tcpip.ksh

#!/usr/bin/ksh
HOST=$(uname -n)
FILTER="port not 22"
(tcpdump -i en1 -w $HOST-en1.cap $FILTER >/dev/null 2>&1 ) &
sleep 2
(tcpdump -i en2 -w $HOST-en2.cap $FILTER >/dev/null 2>&1 ) &
sleep 2
exit 0