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

Python 在任何操作系统上都有查找IP的通用正则表达式吗?,python,regex,ip,cross-platform,Python,Regex,Ip,Cross Platform,我有上面的正则表达式,可以在CentOS、Kubuntu甚至红帽上使用,但在Mac上不起作用。有一个通用的可以在任何操作系统上使用吗?它不是正则表达式,与python无关。它显然可以在这些linux发行版上运行 代替使用 /sbin/route使用netstat-r使其在mac和linux上都能工作如果您想在任何操作系统上执行此操作,当然这是不可能的。你正在运行的四个程序中甚至没有一个存在于Windows上。cmd或PowerShell也没有bash的$(…)语法 一个更好但仍不完美的解决方案

我有上面的正则表达式,可以在CentOS、Kubuntu甚至红帽上使用,但在Mac上不起作用。有一个通用的可以在任何操作系统上使用吗?

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

代替使用
/sbin/route
使用
netstat-r
使其在mac和linux上都能工作

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


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

/sbin/ifconfig $(/sbin/route | awk '/default/ {print $8}') | grep "inet addr" | awk -F: '{print $2}' | awk '{print $1}' 
这样做的优点是可以在所有平台上使用Python和套接字(包括Windows)

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


如果你想要一个与你开始时相近的东西,这样可以避免名称查找问题,并且可以在很多流行的现代POSIX系统上工作(但显然,比如说,Windows),你可能可以在一定程度上实现这一点

第一:

python -c 'import socket; print socket.getaddrinfo(socket.gethostname(), None)[0][4][0]'
你可能会注意到这里有几个问题。首先,
netstat
没有指定列的数量或顺序;通过
-l
至少可以得到8个,而
Netif
通常是第7个,但是如果我没有测试过的某个平台有
Mtu
,因此你会得到一个名为
1500
的接口,请不要怪我。其次,请注意,我必须指定IPv4(通过
-f inet
),而不是
路由
,在那里您可以请求默认协议。即使在2014年末,5%的用户已经错了,这个数字(希望)只会增加

但最大的问题是一旦你得到了它该怎么办ifconfig en0和Linux上的
ifconfig eth0
都将生成人类可读的输出,但输出的格式不同。例如,以下是Mac和Linux机箱的输出行:

iface=$(netstat -rl -f inet | awk '/^default/ {print $7)')
您可以使用以下内容分析这两个方面:*

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
*对于IPv6,两次都使用
inet6
代替
inet


但我不能保证它能在你关心的每一个平台上运行。

为什么它不能在Mac上运行?输出有什么不同?@nhahtdh:首先,没有参数的BSD和SysV
route
是一个错误;您可以使用
route-get-default
,但即使这样,
route
的输出也没有标准化;在*BSD系统上,您需要
awk'/interface:/{print$2}'
或类似的工具,但这在linux或SysV系统上不起作用。(当然,所有这些都无法在Windows上运行…@user2921139:请在下次的问题中包括更多信息,如abarnert所提到的。既然您在原始标记中包含Python,您对Python解决方案满意吗?有操作系统吗?你是说任何Unix或Linux操作系统<代码>/sbin/ifconfig肯定无法在Windows(或AmigaOS)上工作:)这仍然有很多问题。首先,您希望从
netstat-r
中选择哪一列?而且,一旦获得了接口,如何解析
ifconfig
的输出?对于这两个命令,如何指定默认协议(IPv4和IPv6之间)而不是硬编码协议?我想使用我所提到的3个OSs。我如何区分Mac版本?@user2921139:如果你把所有发行版都算作Linux,你提到了2个OSs,如果你把它们都算作单独的发行版,你提到了4个OSs,所以我不确定你指的是哪3个。我想说的是,一个简单的方法可以找到它是否是Mac/unix并找到它的IP。
addr=$(ipconfig $iface inet | awk '/^\tinet / {print $2} | sed 's/addr://')