2011-08-23 35 views
7

Tôi đang chạy tcpdump trong một tiến trình con như thế này:Bắt stdout từ một tiến trình con tcpdump sau khi chấm dứt nó

pcap_process = subprocess.Popen(['tcpdump', '-s 0', '-w -', 'tcp'], 
            stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

Đối số -w - là rất quan trọng: nó nói tcpdump để in kết quả file .pcap để stdout.

Sau đó, tôi truy cập trang web bằng cách sử dụng urllib.open(). Sau khi điều này được thực hiện, tôi muốn giết tcpdump và đặt bất cứ điều gì nó in thành một chuỗi. Tôi đã thử các cách sau:

pcap_process.terminate() 
result = pcap_process.stdout.read() # or readline(), etc. 

Nhưng (trừ khi tôi đang làm điều gì đó sai), điều đó không hiệu quả; Tôi đã giết quá trình, bây giờ không còn gì để đọc. Nếu tôi sử dụng read() hoặc communicate() trước khi chấm dứt, tập lệnh của tôi sẽ chỉ ngồi đó và đọc và bật, đợi tcpdump để kết thúc (điều đó sẽ không).

Có cách nào để thực hiện việc này (tốt nhất là không có vòng lặp) không?

+1

Bạn cần phải vượt qua từng tham số cho 'tcpdump' riêng:' Popen ([ 'tcpdump', '-s', '0', '-w', '-', 'tcp'], ...) '. Đối số đơn '-w -' không được hiểu giống như hai đối số' -w' và '-', v.v. –

+0

Đúng, đó sẽ là câu trả lời đúng :) Cảm ơn anyways! –

Trả lời

8

Thay vì sử dụng tcpdump, bạn nên sử dụng PCAP directly hoặc Scapy.

Nếu đó không phải là một tùy chọn, chỉ cần gọi communicate sau terminate - giết quá trình không giết dữ liệu trong các đường dẫn đến nó. Tuy nhiên, đừng quên để tách lập luận trong việc tạo ra các tiến trình con ([,'-w', '-'] thay vì [... , '-w -', ..]):

pcap_process = subprocess.Popen(['tcpdump', '-s', '0', '-w', '-', 'tcp'], 
            stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
+1

Thật không may pypcap không phải là một lựa chọn ở đây: (... nếu tôi làm điều đó, đầu ra là trống. Có lẽ vấn đề là ở một nơi khác ... ಠ_ಠ –

+1

@sebastian_k ''-w -'' viết vào một tập tin có tên' - 'Bạn muốn hoặc là' '-w-'' hoặc '' -w '' -'' Cập nhật câu trả lời – phihag

+0

Bạn hoàn toàn đúng, một sai lầm ngớ ngẩn. Cảm ơn một nhóm, phihag! :) –

Các vấn đề liên quan