python - 如果进程通过 paramiko ssh session 运行并且最后以 "&"运行,则进程终止

标签 python linux ssh paramiko tcpdump

我只想使用 paramiko 在后台运行 tcpdump

部分代码如下:

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, username=login, password=password)
transport = ssh.get_transport()
channel = transport.open_session()
channel.get_pty()
channel.set_combine_stderr(True)

cmd = "(nohup tcpdump -i eth1  port 443 -w /tmp/dump20150317183305940107.pcap) &"
channel.exec_command(cmd)
status = channel.recv_exit_status()

在我执行这段代码后,pgrep tcpdump 什么都不返回。

如果我删除 & 标志,tcpdump 运行正常,但我的 ssh shell 被阻止。

如何在后台正确运行 tcpdump

我试过什么命令:

cmd = 'nohup tcpdump -i eth1  port 443 -w /tmp/dump20150317183305940107.pcap &\n'
cmd = "screen -d -m 'tcpdump -i eth1  port 443 -w /tmp/dump20150317183305940107.pcap'"
cmd = 'nohup sleep 5 && echo $(date) >> "test.log" &'

最佳答案

使用 & 可以使远程命令立即退出。因此,远程 sshd 可能(取决于实现,但 openssh 会)终止所有从您的命令调用启动的进程。在您的情况下,您只是生成了一个新进程 nohup tcpdump ,由于最后 & 将立即返回。 channel.recv_exit_status() 只会阻塞,直到 & 操作的退出代码准备就绪,即刻准备就绪。然后您的代码就会终止,终止您的 ssh session ,这将使远程 sshd 杀死生成的 nohup tcpdump 进程。这就是为什么您最终没有 tcpdump 进程的原因。

以下是您可以执行的操作:

由于 exec_command 将为您的命令生成一个新线程,您可以将其保持打开状态并继续执行其他任务。但是请确保不时清空缓冲区(对于冗长的远程命令)以防止 paramiko 停滞。

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, username=login, password=password)
transport = ssh.get_transport()
channel_tcpdump = transport.open_session()
channel_tcpdump.get_pty()
channel_tcpdump.set_combine_stderr(True)

cmd = "tcpdump -i eth1  port 443 -w /tmp/dump20150317183305940107.pcap"        # command will never exit
channel_tcpdump.exec_command(cmd)  # will return instantly due to new thread being spawned.
# do something else
time.sleep(15)      # wait 15 seconds
_,stdout,_ = ssh.exec_command("pgrep tcpdump") # or explicitly pkill tcpdump
print stdout.read()     # other command, different shell
channel_tcpdump.close()     # close channel and let remote side terminate your proc.
time.sleep(10)

关于python - 如果进程通过 paramiko ssh session 运行并且最后以 "&"运行,则进程终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29105029/

相关文章:

python - 从刷新与未刷新的缓冲区中读取

python - 如何使用变量名 pandas df.assign()?

c - 用于 linux 的无线工具,用于在未连接的情况下扫描无线设备

linux - 使用 Batch 解决 Linux 通配符问题

python - 如何修复 Twitter 30 天沙盒搜索上的错误代码 403?

python - 如何根据列表有条件地更新 Pandas 中的 DataFrame 列

c++ - blast 无法创建单位计数容器

macos - Laravel Homestead 在 SSH 身份验证方法 : private key on mac 中挂起

MySQL 通过 SSH 隧道访问被拒绝

ruby - 使用Ruby通过SSH发送脚本