如何通过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
相关产品推荐
相关产品推荐

