我编写了这个脚本来停止进程:
parser = argparse.ArgumentParser(description='this script allows you to connect a device in your network')
parser.add_argument('-m', '--mac', dest='mac', type=str, required=True, help='put mac of victim')
args = parser.parse_args()
mac_host =str(args.mac)
print "mac_host %s"%mac_host
p = subprocess.Popen("sudo kill -9 $(sudo ps aux|grep '(" + mac_host + ")'|grep -v grep|awk '{print $2}')", shell=True, stdout=subprocess.PIPE)
output = p.communicate()[0].rstrip()
但是我有一个问题:pid 始终是空的。
mac_host 14:KL:73:GH:45:7f
Usage:
kill pid ... Send SIGTERM to every process listed.
kill signal pid ... Send a signal to every process listed.
kill -s signal pid ... Send a signal to every process listed.
kill -l List all signal names.
kill -L List all signal names in a nice table.
kill -l signal Convert between signal numbers and names.
我该如何解决这个问题?谢谢。
答案1
我猜这应该是一个正则表达式?
grep '(" + mac_host + ")'
尝试使用egrep
或grep -e
。
看起来您想使用正则表达式,但正在寻找上面输入的确切术语。或者,如果它一直被称为 mac_host,那么删除其他所有内容
grep "mac_host"
还放了一个
set +x
在您的脚本中调试您的脚本。
干杯,s1mmel
答案2
Bleh 还不能发表评论,
以上是正确的,但是如果您使用 pgrep,则需要清理的内容会更少。它仅返回 pid(而不是 ps 的整行)。
p = subprocess.Popen("sudo kill -9 $(sudo ps aux| pgrep '(" + mac_host + ")')", shell=True, stdout=subprocess.PIPE)
编辑:
如果您想尝试不使用子进程/shell 命令,您可以尝试这样的操作,
import os
from signal import SIGKILL
pids = [pid for pid in os.listdir('/proc') if pid.isdigit()]
for pid in pids:
if mac_host in open(os.path.join('/proc', pid, 'cmdline'), 'rb').read():
os.kill(int(pid), SIGKILL)
如果“if mac_host in”不能完成其工作,则可能需要正则表达式。
使用来源: