我想在 python 腳本中處理 tcpdump 輸出,到目前為止我能夠實作這個實作
from subprocess import Popen, PIPE, CalledProcessError
import os
import signal
import time
if __name__=="__main__":
cmd = ["sudo","tcpdump", "-c","1000","-i","any","port","22","-n"]
with Popen(cmd, stdout=PIPE, bufsize=1, universal_newlines=True) as p:
try:
for line in p.stdout:
print(line,flush=True) # process line here
except KeyboardInterrupt:
print("Quitting")
這是我從這個先前提出的問題的第二個答案中了解到的。 雖然它不等待子行程完成以列印 tcpdump 的輸出,但我仍然一次獲得 20-30 行的塊輸出。即使子行程的 stdout pf 中只有一行,有沒有辦法讀取?
PS:我在帶有 ubuntu 服務器 22.04.1 的樹莓派 4 上運行這個腳本
uj5u.com熱心網友回復:
tcpdump如果將其標準輸出連接到管道,則使用更大的緩沖區。您可以通過運行以下兩個命令輕松地看到這一點。(我將計數從 1000 更改為 40 并洗掉port 22,以便快速在我的系統上獲得輸出。)
$ sudo tcpdump -c 40 -i any -n
$ sudo tcpdump -c 40 -i any -n | cat
第一個命令一次列印一行。第二個收集緩沖區中的所有內容并在tcpdump退出時列印所有內容。解決方案是告訴tcpdump使用帶有-l引數的行緩沖。
$ sudo tcpdump -l -c 40 -i any -n | cat
在您的 Python 程式中執行相同的操作。
import subprocess
cmd = ["sudo", "tcpdump", "-l", "-c", "40", "-i", "any", "-n"]
with subprocess.Popen(cmd, stdout=subprocess.PIPE, bufsize=0, text=True) as p:
for line in p.stdout:
print(line.strip())
當我運行它時,我一次列印一行。
請注意,這universal_newlines是一個向后兼容的別名text,因此后者應該是首選。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/537384.html
