2011-10-20 87 views
18

任何人都知道一個簡單的方法來要求Linux「顯示每個互聯網數據包到/從谷歌瀏覽器」或「顯示每個互聯網數據包到/從遠程登錄過程與PID 10275」?如何捕獲每個PID的網絡數據包?

telnet示例不太有用,因爲我只能使用wireshark或tcpdump來查看涉及端口23的所有TCP對話。那個和沒有人使用telnet了。但是,從所有使用多個端口的複雜應用程序中嗅探所有數據包似乎是一件有用的事情。

我發現了一些相關的答案,探索不同的方式來證實端口和的PID(或程序名)等,但隻字未提包

看起來有人可能願意爲此答覆付費:

NetHogs是快速看到哪些程序創建一個多接口的流量是有用的,但它並沒有辦法來捕獲數據包。

+0

hrm,我應該問serverfault嗎? –

+0

這實際上可能屬於超級用戶。一個有趣的問題。你可以使用WireShark來過濾HTTP請求,但你必須掛鉤內核驅動程序來過濾基於PID的數據包。 – Bojangles

+1

這是一個複雜的問題 - 套接字不屬於PID;你可以將它們從一個進程傳遞給另一個進程。如果進程A打開一個套接字,它可以將它傳遞給進程B然後退出 - 如果你正在過濾進程A的PID,現在會發生什麼? – bdonlan

回答

1

我會使用lsof -i來獲取與我想要的應用程序相關的端口號。 的代碼會是這樣的:

 
process=firefox 
for _port in `lsof -i | grep $process | cut -d' ' -f18 | cut -d: -f2 | cut -d'-' -f1` 
do 
    port=$_port 
    [[ "$_port" == +([a-zA-Z]) ]] && port=`cat /etc/services | grep '^$_port' | cut -d' ' -f12 | cut -d'/' -f1 | uniq | head -n 1` 

    echo "tcpdump -w ${port}.pcap port $port &" 
    tcpdump -w ${port}.pcap port $port & 
done 

注意,命令的輸出可能會在不同的版本/分佈不同。因此,在使用腳本之前,最好檢查一下正確的文件。

此外,此腳本不監視稍後打開的端口。爲此,我會考慮一個更復雜的腳本來定期檢查端口(使用類似watch的東西)

並記住在之後終止所有tcpdump進程。

2

Tcpdump可以告訴你PID /進程數據包來自/到。
在您的選項中拋出'-k NP'。

版本支持:tcpdump版本4.3.0 - 蘋果版本56

+8

有人問過Linux的問題。 Linux的tcpdump中沒有這樣的選項,它顯示了PID信息。 – shivams

+0

它適用於MAC。 –