[Linux] 執行 tcpdump 出現 Permission denied 錯誤

[Linux] 執行 tcpdump 出現 Permission denied 錯誤

最近專案的單元測試 (unit-testing) 常常失敗,懷疑是網路不穩定造成的,

想說用 tcpdump 抓一下封包,這樣子 unit-testing 失敗時可以查一下網路狀況,

結果執行 tcpdump 時卻出現了 Permission denied 錯誤:

root@localhost /root # tcpdump -C 50 -w cap.pcap 
tcpdump: cap.pcap: Permission denied

 

真是奇怪,我都已經是 root 了,怎麼還會有權限不足的問題?

查了一下 serverfault: tcpdump: out.pcap: Permission denied

裡面的答案寫得很好,就照它的說明來操作一次吧~

 

先用 strace 來看看發生了什麼事…

root@localhost /root # strace tcpdump -C 50 -w cap.pcap
......
setgid(72)                              = 0
setuid(72)                              = 0
......
open("cap.pcap", O_WRONLY|O_CREAT|O_TRUNC, 0666) = -1 EACCES (Permission denied)

 

原來在執行 tcpdump 時,裡面自己執行了 setgid() 和 setuid(),

把自己的 gid 和 uid 都設定成 72~

72 是哪個帳號呢?可以查一下 /etc/passwd,原來就是 tcpdump 這個帳號:

root@localhost /root # egrep -w 72 /etc/passwd
tcpdump:x:72:72::/:/sbin/nologin

 

也就是說,tcpdump 自己在執行時,把權限降低成 tcpdump 這個帳號的權限,

導致它沒有權限將 pcap 寫入到 /root 目錄下面~

看一下 man tcpdump,裡面有提到 -Z 這個參數,

說如果用 root 執行 tcpdump 且要寫入 pcap 檔案時,會自動改用 tcpdump 所屬的 user 的 uid:

-Z    If  tcpdump  is running as root, after opening the capture device or input savefile, but before opening any savefiles for output, change the
user ID to user and the group ID to the primary group of user.
This behavior is enabled by default (-Z tcpdump), and can be disabled by -Z root.

 

因此要解決的方法也很簡單,就是加上 -Z root,這樣就會維持 root 的 uid,

自然可以寫入到 /root 這個目錄囉:

root@localhost /root # tcpdump -C 50 -w cap.pcap -Z root
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes

 

由這件事情來看,strace 真的是頗有幫助的,

不過老實說,要在那落落長的 strace 輸出中,

找到 setgid/setuid 這個關鍵字也相當不容易,真的是得憑經驗呀~~

 

(本頁面已被瀏覽過 2,047 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料