2024-10-01 13:25:51 发布
网友
/sbin/ifconfig $(/sbin/route | awk '/default/ {print $8}') | grep "inet addr" | awk -F: '{print $2}' | awk '{print $1}'
我有上面的正则表达式,这将在CentOS,Kubuntu,甚至可能红帽工作,但这不会在Mac上工作。是否有一个通用的可以在任何操作系统上工作?你知道吗
如果您想在任何操作系统上执行此操作,当然这是不可能的。你正在运行的四个程序中,甚至没有一个在Windows上存在。cmd或PowerShell也没有$(…)语法bash。你知道吗
cmd
PowerShell
$(…)
bash
一个更好但仍不完美的解决方案是用C或Python或任何您喜欢的语言调用getaddrinfo。例如:
getaddrinfo
python -c 'import socket; print socket.getaddrinfo(socket.gethostname(), None)[0][4][0]'
这样做的好处是可以使用Python和sockets(包括Windows)在每个平台上工作。你知道吗
它的缺点是依赖于名称查找。例如,只需在/etc/hosts中添加一个条目,将您的主机名映射到其他地址,您就可以得到其他地址而不是您自己的地址……但是没有跨平台的解决方案可以避免这些问题。你知道吗
/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%的用户已经错了,而且这个数字(希望)只会增加。你知道吗
netstat
-l
Netif
Mtu
1500
-f inet
route
但最大的问题是一旦你得到它该怎么办。^Mac上的{}和Linux上的ifconfig eth0都将生成可读的输出,但输出的格式不同。例如,以下是Mac和Linux设备的输出行:
ifconfig eth0
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。
inet6
inet
但我不能保证你所关心的每一个平台都能成功。你知道吗
它不是正则表达式,与python无关。它显然可以在这些linux发行版上运行。你知道吗
而不是使用 /sbin/route使用netstat -r让它在mac和linux上都能工作
/sbin/route
netstat -r
如果您想在任何操作系统上执行此操作,当然这是不可能的。你正在运行的四个程序中,甚至没有一个在Windows上存在。
cmd
或PowerShell
也没有$(…)
语法bash
。你知道吗一个更好但仍不完美的解决方案是用C或Python或任何您喜欢的语言调用
getaddrinfo
。例如:这样做的好处是可以使用Python和sockets(包括Windows)在每个平台上工作。你知道吗
它的缺点是依赖于名称查找。例如,只需在
/etc/hosts
中添加一个条目,将您的主机名映射到其他地址,您就可以得到其他地址而不是您自己的地址……但是没有跨平台的解决方案可以避免这些问题。你知道吗如果你想要的东西接近你开始的,避免了名称查找问题,并且在很多流行的现代POSIX系统(但显然仍然不是,比如说,Windows)上工作,你也许可以部分地达到。你知道吗
首先:
你可能会注意到一些问题。首先,
netstat
没有指定列的数量或顺序;传递-l
应该至少得到8个列,而Netif
通常是第7个列,但是如果某个我没有测试过的平台Mtu
在那里,那么不要责怪我,因此您会得到一个名为1500
的接口。其次,请注意,我必须指定IPv4(通过-f inet
),这与route
不同,在route
中您可以请求默认协议。即使在2014年末,5%的用户已经错了,而且这个数字(希望)只会增加。你知道吗但最大的问题是一旦你得到它该怎么办。^Mac上的{}和Linux上的
ifconfig eth0
都将生成可读的输出,但输出的格式不同。例如,以下是Mac和Linux设备的输出行:您可以用如下方式解析这两个函数:*
*对于IPv6,两次都使用
inet6
代替inet
。但我不能保证你所关心的每一个平台都能成功。你知道吗
它不是正则表达式,与python无关。它显然可以在这些linux发行版上运行。你知道吗
而不是使用
/sbin/route
使用netstat -r
让它在mac和linux上都能工作相关问题 更多 >
编程相关推荐