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

3

我有一个类似于如何将ssh作业发送到后台的问题。

我有一个自动化的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"

但是它会一直保持ssh客户端,直到我按下ctrl+C(这对于自动化解决方案是行不通的)。我还尝试了各种变化:

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

但是,无论是命令根本没有执行(test.cap不存在),还是立即终止(test.cap只包含1行)。在测试期间,我一直在进行ping操作,因此捕获应该有一些东西...
之前提到的链接解决了screen的问题,但远程Linux操作系统不可配置,也没有screen。欢迎任何建议。

这些解决方案都不能在远程执行Fedora机器上的tcpdump。但是,如果将tcpdump命令封装在一个bash脚本中,在远程通过ssh命令执行该脚本,则可以如预期那样完成。 - user3529322
尽管我很想这样做,但在我的情况下,远程机器是一个只读嵌入式操作系统。 - UndeadBob
6个回答

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 &"

我很感激您的建议,但都没起作用。当我在10.5.1.1上运行 ps -ef 时,tcpdump 没有运行。此外,当我只是管道传输 tcpdump 的输出而不使用内置写入程序(使用 '>' 而不是 '-w'),文件被创建了,但是完全为空。也许这可以帮助你? - UndeadBob
听起来 tcpdump 可能只是抵制在后台运行,所以它就挂了。通常情况下,nohup 处理这些类型的程序。一时之间,我想不出其他可能适用于您的选项,很抱歉! - mrb

2

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

ssh root@server "nohup /usr/local/bin/app -c cfg &; exit"
< p > 另外: 进行另一项测试时,以上方法无效,即命令未在远程服务器上启动。添加一个成功返回的命令,在退出之前似乎可以解决问题。

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

1
我遇到了类似的情况: (在 Windows 机器上)我想创建一个 MS 批处理脚本,打开与树莓派的 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 "很重要!我发现(艰难地)树莓派的SD卡一直被一个极大的nohup.out文件填满(而且当SD卡已满时,树莓派甚至无法正确登录)

原因:

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

然后是“-t”(由Raj推荐)

然后是“-m”来加载那个文件中的命令列表

如果没有参数“-t”和“w”和“exit”,我的批处理脚本将只运行而不执行“myscript”并再次关闭。

"

0

我认为至少在IBM AIX上,我已经把它解决了。

我正在使用

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

(身份验证由公钥完成)。 我使用简单的“nohup tcpdump .... &”时,结果不一致,有时可以工作,有时不能工作,有时甚至会阻塞,我不得不断开会话。 到目前为止,这个方法还可以,我无法确切地说它为什么有效,但它确实有效...

这是我的start-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

start-tcpip.ksh是什么?你的命令中只提到了start-tcpdump.ksh - dg99

0

我遇到了同样的问题,而且我发现加上“-t”选项似乎对nohup很重要。如果没有“-t”选项,我发现nohup不起作用。

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


0

我曾经遇到过同样的问题。我有一个脚本,其中我没有使用ssh运行nohup tcpdump .... &,因为当ssh结束时它会死掉。我想出的解决方案非常简单。我只是在我的脚本末尾添加了sleep 5,现在它可以正常工作了。似乎tcpdump需要几秒钟才能安全地进入后台,即使使用nohup。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接