这是获取 IP 地址的更“不可知”的方式,无论您的 *nix 系统(Mac OS、Linux)、接口名称,甚至是您的语言环境配置如何:
ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d:
如果您有多个活动 IP,将在单独的行中列出每一个。如果您只想要第一个 IP,请添加| head -n1
到表达式:
ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" \
| grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1
如果您想要特定接口的 IP 地址,请将第一个表达式替换ifconfig
为ifconfig INTERFACENAME
,例如ifconfig eth0 | grep -E ...
。
最后,您注意到脚本所做的其中一件事是省略127.0.0.1
系统管理员和开发人员“localhost”调用的 IP,但要考虑到某些应用程序还可能添加具有 IP 的虚拟网络设备,如果是未添加到省略列表中,例如。docker0
Docker 添加了一个通常具有 IP的虚拟接口172.17.0.1
,如果您想省略此 IP 以及“localhost”,请更改表达式grep -v 127.0.0.1
以考虑另一个 IP。在这种情况下(省略 localhost 和 docker),最终表达式将是:
ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v '[127.0|172.17].0.1' | awk '{ print $2 }' | cut -f2 -d: | head -n1
这些是本页中提到的在某些情况下失败的示例以及原因:
ip route ...
:该ip
命令未安装在 OSX 机器中。
hostname -I
: 该-I
选项在 OSX 中无效。
ifconfig en0 ...
:接口名称(eth0
, en0
)在 Linux 和 OSX 中不同,在 Linux 中,名称还取决于接口类型(ethX表示以太网连接,wlanX表示无线等)。
python -c 'import socket; print(socket.gethostbyname(socket.gethostname()))'
:这让我在 Ubuntu Linux 14.04 中获得了127.0.1.1
(环回 IP),所以不起作用。
ifconfig | grep 'inet addr:' | grep -v 127.0.0.1 | head -n1 | cut -f2 -d: | cut -f1 -d ' '
:Geograph 的帖子更接近,但在没有配置的情况下在某些 Linux 发行版中不起作用,LANG=en
因为查找的文本在其他语言环境中以不同的文本输出,并且在 Mac OS 中该标签也不同。inet addr:
grep