使用网络接口查找流程


9

我正在尝试找到一种安全关闭网络接口的方法,即不打扰任何进程。为此,我需要找出当前正在使用该接口的进程。工具喜欢ssnetstat或者lsof是有帮助的显示哪些进程打开插座,但他们不显示wpa_supplicantdhcpcdhostapd和其他人。

有没有一种方法可以以一般方式检测这些过程?它可能不适合dhcpcd,因为它只是一个不时打开套接字的程序,但是我假设wpa_supplicant和hostapd会对可检测到的接口“执行某些操作”,并且可能还会导致相关的PID。

Answers:


13

这样的程序将使用Netlink套接字直接与网络硬件的驱动程序通信。lsof版本4.85 增加了对Netlink套接字的支持,但是在我对CentOS 5.8的测试中,该功能似乎不能很好地工作。也许这取决于新内核中添加的功能。

但是,可以对运行Netlink套接字的时间做出很好的猜测。如果您cat /proc/net/netlink获得打开的Netlink套接字的列表,包括已打开它们的进程的PID。然后,如果你lsof -p $THEPID这些的PID,你会发现与项目sockTYPE列,并can't identify protocolNAME列。不能保证它们是Netlink套接字,但这是一个很好的选择。

您还可以推断出,如果某个给定的进程正在/sys/class/net/$IFNAME打开文件,则该进程正在直接与该接口通信。

现在,所有这些,我认为您的问题是错误的。

假设有一个我没有发现的命令。调用它lsif -i wlan0,并说它返回访问命名接口的PID列表。您将如何处理它,从而使您可以按照您的要求“不打扰”使用该界面的进程?您是否打算首先使用该接口终止所有进程?真令人不安。:)也许您是在想,将接口从使用该接口的过程中删除会带来某种危害?

到底有什么不好ifconfig wlan0 down呢?

网络接口不是存储设备。您不必将数据刷新到磁盘上并优雅地卸载它们。不破坏开放的套接字可能是值得的,但是正如您已经知道的那样,可以使用netstatand来解决这一问题lsofwpa_supplicant如果您毫不客气地弹开它的界面,它不会发闷。(如果确实如此,那是一个错误,需要修复;它并不表示您的某些错误。)

编写精良的网络程序当然可以应付此类问题。网络不可靠。如果程序无法应对接口被弹跳的问题,那么它也将无法应对拔出的以太网电缆,笨拙的DSL调制解调器或反铲


非常感谢你。我发现lsof可以正确报告系统上的netlink套接字。grep似乎足以让ROUTE找到我想要的进程。对于我正在使用的此信息,请执行以下操作:询问用户是否应该在用户启动与此接口关联的进程的情况下取消关闭。
ipsec 2012年

有没有办法找出流程连接到哪个特定接口?
ipsec 2012年

我不知道有什么办法,strace只能在启动时查看它们,然后等待bind(2)呼叫。
沃伦·杨

您也可以使用以下命令在proc fs中使用任何tun0“文件”: find /proc/ -name tun0 | cut -d\/ -f3 | uniq | xargs -IPID lsof -p PID
frogstarr78
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.