You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Paramiko关闭远程运行的tcpdump进程?

解决Paramiko执行tcpdump后无法终止进程的问题

方案1:用timeout命令自动限制tcpdump运行时间

这是最简便的方式,直接给tcpdump套一层timeout命令,让它自动在指定时间后退出,和你的sleep时间匹配:

command="timeout 10 tcpdump -i enp8s0f2 -w test_tcpdump.pcap"
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.WarningPolicy())
ssh.connect(IP, username=USER_GW, password=PSW_GW,look_for_keys=False, banner_timeout=200, timeout=200, auth_timeout=200) 
ssh.exec_command(command, timeout=60)
time.sleep(10)
ssh.close()

这里timeout 10会让tcpdump运行10秒后自动终止,不需要手动kill,从根源避免进程残留。

方案2:记录tcpdump进程号并手动终止

如果需要灵活控制停止时机,可以把tcpdump的进程号写入临时文件,之后读取pid执行kill:

import paramiko
import time

IP = "你的目标IP"
USER_GW = "用户名"
PSW_GW = "密码"

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.WarningPolicy())
ssh.connect(IP, username=USER_GW, password=PSW_GW, look_for_keys=False, banner_timeout=200, timeout=200, auth_timeout=200) 

# 启动tcpdump并将进程号写入临时文件
start_cmd = "tcpdump -i enp8s0f2 -w test_tcpdump.pcap & echo $! > /tmp/tcpdump.pid"
stdin, stdout, stderr = ssh.exec_command(start_cmd)
# 等待命令执行完成,确保pid文件生成
stdout.channel.recv_exit_status()

time.sleep(10)

# 读取进程号并终止tcpdump
get_pid_cmd = "cat /tmp/tcpdump.pid"
stdin, stdout, stderr = ssh.exec_command(get_pid_cmd)
tcpdump_pid = stdout.read().strip().decode()
ssh.exec_command(f"kill {tcpdump_pid}")

# 可选:清理临时pid文件
ssh.exec_command("rm /tmp/tcpdump.pid")

ssh.close()

方案3:事后清理残留的tcpdump进程

如果已经有残留的tcpdump进程在后台运行,可以直接用pkill或killall命令批量终止:

# 在需要清理时执行以下命令
ssh.exec_command("pkill tcpdump")
# 或者用killall
# ssh.exec_command("killall tcpdump")

为什么之前的kill命令无效?

你之前执行ssh.exec_command("kill", timeout=60)没用,是因为kill命令必须指定要终止的进程号或进程名,单独执行kill不会有任何操作。

内容的提问来源于stack exchange,提问作者martinmistere

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 11:30:18