在debugging一个似乎无法连接的python irc bot的过程中,我想:“我知道,我只是用tcp dump来看看它在做什么”。 所以我像往常一样运行tcpdump,它说它是捕获的数据包,但实际上并没有写cap文件。
akraut@lance ~/pcaps $ sudo tcpdump -w pyhole -s 0 "port 6667" tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes ^C17 packets captured 17 packets received by filter 0 packets dropped by kernel 4294966881 packets dropped by interface akraut@lance ~/pcaps $ ls -la total 8 drwxr-xr-x 2 akraut akraut 4096 Feb 6 11:50 . drwxr-xr-x 8 akraut akraut 4096 Feb 6 11:50 .. akraut@lance ~/pcaps $
你可能想用strace检查tcpdump的行为,看看它是否像chroot一样奇怪,如果它在gentoo或其他分布可能欺骗二进制文件。
好的,我已经解开了这个谜。 跟着我一起解开Funtoo的TCPDump和丢失的pcap文件的奥秘 。
我用strace来看看发生了什么,相关的行是:
chroot("/var/lib/tcpdump") = 0 chdir("/") = 0 --- SNIP --- open("/tmp/lol.wat", O_WRONLY|O_CREAT|O_TRUNC, 0666) = -1 ENOENT (No such file or directory)
所以…
lance ~ # ls /var/lib/tcpdump/ blah blah.cap irc.cap pyhole
你看! 所有我试图创build的上限文件!
看看使用标志tcpdump默认情况下,我看到这个:
lance ~ # grep tcpdump /usr/portage/profiles/use*desc use.local.desc:net-analyzer/tcpdump:chroot - Enable chrooting when dropping privileges
那么为什么这样呢? 我的理论是这样的:
/var/lib/tcpdump ,然后删除root权限并开始捕获。 结果,当我指定./blah或blah它工作正常。 但/tmp/blah没有,因为/var/lib/tcpdump/tmp不存在。
所有这一切的一个简单的特点是:当使用suid标志来安装tcpdump SetUID时,你可以授予用户访问tcpdump组的权限,而不必为sudo或root权限提供这些权限。 可能的用途包括为您的networking工程师或研究人员的捕获框。
我只希望Gentoo / Funtoo在安装时会有这样的消息。
tl; dr:Gentoo / Funtoo把你的pcap文件放在/var/lib/tcpdump 。
语法是正确的:我只是尝试了它(尽pipe在端口80),并且它在当前工作目录中生成了一个pcap文件,给出了与你使用的相同的选项。
难道它有关于你的主目录,你试图写作为根(因为sudo)? 是否有可能你使用root-squashing NFS挂载的主目录? sudo touch ~akraut/pcaps/foo ?
你可以尝试写出pcap到/ tmp /或什么的?