这是一种更加“不可知”的方式来获取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列在单独的行中。如果您只想要第一个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 ...
。
最后,请注意,脚本要做的事情之一是省略系统管理员和开发人员称为“localhost”的IP 127.0.0.1
,但请注意,一些应用程序也可能添加具有IP的虚拟网络设备,如果未将其添加到省略列表中,则可能返回该IP,例如Docker添加一个虚拟接口docker0
,通常具有IP172.17.0.1
,如果您想省略此IP以及“localhost” IP,请将表达式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 ...
: 在OSX机器中未安装ip
命令。
hostname -I
: 在OSX中,-I
选项无效。
ifconfig en0 ...
: Linux和OSX的接口名称(eth0
,en0
)不同,并且在Linux中,名称还取决于接口类型(以太网连接使用ethX,无线连接使用wlanX等)。
python -c 'import socket; print(socket.gethostbyname(socket.gethostname()))'
:在Ubuntu Linux 14.04中,这给我返回了一个环回IP地址127.0.1.1
,所以无法工作。
ifconfig | grep 'inet addr:' | grep -v 127.0.0.1 | head -n1 | cut -f2 -d: | cut -f1 -d ' '
:Geograph的帖子最接近正确答案,但在一些没有配置LANG=en
的Linux发行版中无法工作,因为grep
查找的文本inet addr:
在其他语言环境下可能有不同的输出,在Mac OS中该标签也不同。
ifconfig en1 | sed -n '/inet addr/s/.*addr.\([^ ]*\) .*/\1/p'
至少在 Ubuntu 和 Fedora 上可用... 根据您的ifconfig en1
输出,如果需要可以进行更多调整。 - anishsane