2016-12-22 2 views
1

Я пытаюсь открыть Tcpdump для захвата UDP-пакетов из сценария Python. Вот мой код:Tcpdump: невозможно захватить пакеты из сценария Python

os.system("tcpdump -i wlp2s0 -n dst 8.8.8.8 -w decryptedpackets.pcap &") 
testfile = urllib.URLopener() 
s = socket(AF_INET, SOCK_DGRAM) 
host = "8.8.8.8" 
port = 5000 
buf = 1024 
addr = (host, port) 
s.connect((host, port)) 
f = open("file.txt", "rb") 
data = f.read(buf) 

while (data): 
    if (s.sendto(data, addr)): 
     print "sending ..." 
     data = f.read(buf) 

Я могу захватить пакеты (PCAP файл имеет содержание), если я вручную выполнить эту команду в оболочке:

tcpdump -i wlp2s0 -n dst 8.8.8.8 -w decryptedpackets.pcap & 

Однако, если я использую os.system () Я не могу захватить пакеты. (Когда я открываю файл PCAP, я считаю это пустым)

Я проверил и обнаружил, что это процесс, который будет создаваться, когда сценарий Python выполняется:

корневых 10092 0,0 0,0 17856 1772 очков/19 S 10:25 0:00 ТСРйитр -i -n wlp2s0 ДСТ 8.8.8.8 -w decryptedpackets.pcap

Кроме того, я бегу это как пользователь SUDO, чтобы избежать каких-либо проблем с правами доступа.

Любые предложения, которые могут вызывать эту проблему?

+0

Что именно * есть * проблема? У вас есть 'tcpdump' записи пакетов в файл' .pcap'. И ваш вывод 'ps' показывает, что он успешно запущен. Так что эта часть, похоже, работает. Но тогда вы открываете файл.txt' и отправляет его содержимое на удаленный хост. Чего вы ожидали? –

+0

Проблема в том, что если я выполняю команду os.system(), файл pcap пуст без захваченных пакетов. Однако, если я вручную запускаю команду tcpdump в оболочке, файл pcap имеет содержимое –

+0

Не используйте '&' и выбирайте хорошую альтернативу из модуля 'subprocess'. –

ответ

0

От python documentation.

os.system (команда) Выполнение команды (строки) в подоболочке. Этот реализован путем вызова стандартной системы функций C() и имеет те же ограничения. Изменения в sys.stdin и т. Д. Не отражены в среде выполненной команды.

В Unix возвращаемое значение - это статус выхода процесса, закодированного в , формат, заданный для wait(). Обратите внимание, что POSIX не указывает значение значения возвращаемого значения функции C(), поэтому значение значения функции Python зависит от системы.

В Windows, возвращаемое значение, что возвращается в системную оболочку после выполнения команды, задается переменной среды Windows COMSPEC: в системах command.com (Windows 95, 98 и ME) это всегда 0; на системах cmd.exe (Windows NT, 2000 и XP) это выход состояния запуска команды; на системах с использованием не-родной оболочки, обратитесь к документации вашей оболочки.

Подпроцессный модуль предоставляет более мощные средства для нереста новых процессов и получения их результатов; с использованием этого модуля предпочтительнее использовать эту функцию. См. «Замена старых функций» с подразделением модуля подпроцесса в документации к подпроцессу для некоторых полезных рецептов.

Я думаю, что os.system возвращается немедленно и сценарий продолжает идти, нет никаких проблем с кодом, но вы, вероятно, потребуется создать отдельный поток и вызвать os.system с tcp-dump, так как я считаю, что он немедленно возвращается.

Смежные вопросы