Я написал этот скрипт, чтобы остановить процессы:
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.
Как я могу решить эту проблему. Спасибо.
Bleh еще не может комментировать,
Выше правильно, но если вы используете pgrep, у вас меньше средств для очистки. Он возвращает только pid (а не всю строку ps).
p = subprocess.Popen("sudo kill -9 $(sudo ps aux| pgrep '(" + mac_host + ")')", shell=True, stdout=subprocess.PIPE)
Edit:
Если вы хотите попробовать без использования команд subprocess / 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» не выполняет свою работу.
Используемые источники:
how-to -terminate-process-from-python-using-pid