/sbin/ifconfig $(/sbin/route | awk '/default/ {print $8}') | grep "inet addr" | awk -F: '{print $2}' | awk '{print $1}'
我有上面的正则表达式可用于CentOS,Kubuntu甚至可能是Red Hat,但这不适用于Mac。是否有适用于任何操作系统的通用工具?
答案 0 :(得分:0)
它不是正则表达式,与python无关。它显然适用于这些Linux发行版。
而不是使用
/sbin/route
使用netstat -r
使其适用于mac和linux
答案 1 :(得分:0)
如果您想在任何操作系统上执行此操作,当然这是不可能的。您运行的四个程序中没有一个甚至存在于Windows上。 cmd
或PowerShell
也不具有$(…)
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。
但我不保证会对您关注的每个平台都有效。