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

2024-10-01 13:25:51 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我有上面的正则表达式,这将在CentOS,Kubuntu,甚至可能红帽工作,但这不会在Mac上工作。是否有一个通用的可以在任何操作系统上工作?你知道吗


Tags: defaultmacroutegrepaddrinetprintcentos
2条回答

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


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

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

这样做的好处是可以使用Python和sockets(包括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不同,在route中您可以请求默认协议。即使在2014年末,5%的用户已经错了,而且这个数字(希望)只会增加。你知道吗

但最大的问题是一旦你得到它该怎么办。^Mac上的{}和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://')

*对于IPv6,两次都使用inet6代替inet

但我不能保证你所关心的每一个平台都能成功。你知道吗

它不是正则表达式,与python无关。它显然可以在这些linux发行版上运行。你知道吗

而不是使用 /sbin/route使用netstat -r让它在mac和linux上都能工作

相关问题 更多 >