是否有在任何操作系统上查找IP的通用正则表达式?

时间:2014-12-18 02:23:31

标签: python regex ip cross-platform

/sbin/ifconfig $(/sbin/route | awk '/default/ {print $8}') | grep "inet addr" | awk -F: '{print $2}' | awk '{print $1}' 

我有上面的正则表达式可用于CentOS,Kubuntu甚至可能是Red Hat,但这不适用于Mac。是否有适用于任何操作系统的通用工具?

2 个答案:

答案 0 :(得分:0)

它不是正则表达式,与python无关。它显然适用于这些Linux发行版。

而不是使用 /sbin/route使用netstat -r使其适用于mac和linux

答案 1 :(得分:0)

如果您想在任何操作系统上执行此操作,当然这是不可能的。您运行的四个程序中没有一个甚至存在于Windows上。 cmdPowerShell也不具有$(…) bash的语法。


更好 - 虽然仍然不完美 - 解决方案是用C或Python或您喜欢的任何语言调用getaddrinfo。例如:

python -c 'import socket; print socket.getaddrinfo(socket.gethostname(), None)[0][4][0]'

这样做的好处是可以在每个平台上使用Python和套接字(包括Windows)。

它的缺点是依赖于名称查找。例如,只需添加一个条目/etc/hosts将您的主机名映射到其他地址,您将获得其他地址而不是您自己的地址......但是没有跨平台的解决方案可以避免这些问题。


如果你想要一些与你开始时相近的东西,这可以避免名称查找问题,并且适用于许多流行的现代POSIX系统(但显然仍然不是,比如Windows),你可能能够在那里分道扬。

首先:

iface=$(netstat -rl -f inet | awk '/^default/ {print $7)')

你可能会注意到这里有几个问题。首先,netstat未指定列的数量或顺序;通过-l应该至少获得其中的8个,而Netif通常会是第7个,但如果我没有测试过的某个平台在那里有Mtu,请不要怪我,并且因此,您将获得名为1500的接口。其次,请注意我必须指定IPv4(通过-f inet),与route不同,您可以在其中请求默认协议。即使在2014年底,对于5%的用户来说这已经是错误的,并且这个数字(希望)只会增加。

但是,一旦你得到它,最大的问题是如何处理它。 Mac上的ifconfig en0和Linux上的ifconfig eth0都会产生人类可读的输出,但输出的格式不同。例如,以下是来自Mac和Linux盒子的输出行:

inet 192.168.42.100 netmask 0xffffff00 broadcast 192.168.42.255
inet addr:192.168.99.35  Bcast:192.168.99.255  Mask:255.255.255.0

您可以使用以下内容解析这两个内容:*

addr=$(ipconfig $iface inet | awk '/^\tinet / {print $2} | sed 's/addr://')

*使用inet6代替inet两次用于IPv6。

但我不保证会对您关注的每个平台都有效。