我正在寻找一个命令行解决方案,将返回我的主(第一个)IP地址的本地主机,而不是127.0.0.1
该解决方案至少适用于Linux (Debian和RedHat)和OS X 10.7+
我知道在这两个平台上都可以使用ifconfig,但是它的输出在这些平台之间并不一致。
我正在寻找一个命令行解决方案,将返回我的主(第一个)IP地址的本地主机,而不是127.0.0.1
该解决方案至少适用于Linux (Debian和RedHat)和OS X 10.7+
我知道在这两个平台上都可以使用ifconfig,但是它的输出在这些平台之间并不一致。
当前回答
解决方案
$ ip -o route get to 8.8.8.8 | sed -n 's/.*src \([0-9.]\+\).*/\1/p'
192.168.8.16
解释
查询网络信息的正确方法是使用ip:
-o单行输出 Route get获取到目的地的实际内核路由 8.8.8.8谷歌IP,但可以使用您想要到达的真实IP
例如IP输出:
8.8.8.8 via 192.168.8.254 dev enp0s25 src 192.168.8.16 uid 1000 \ cache
要提取src ip, sed是最轻的,最兼容regex支持:
-n默认不输出 's/pattern/replacement/p'只匹配模式和打印替换 . * src \([0 - 9] \ + \)。*匹配内核使用的src IP,达到8.8.8.8
例如,最终输出:
192.168.8.16
其他答案
我认为前面的答案对我来说都不够好,因为它们在最近的机器上不起作用(Gentoo 2018)。
我在前面的答案中发现的问题:
在命令输出中使用位置列; 使用已弃用的ifconfig,例如,不要列出多个ip; 使用awk来完成简单的任务,而sed可以更好地处理这些任务; IP route get 1不清楚,实际上是IP route get到1.0.0.0的别名 使用hostname命令,在所有设备中都没有-I选项,在我的情况下返回127.0.0.1。
其他回答
在Mac电脑上,考虑以下问题:
scutil --nwi | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
对于linux机器(不是OS X):
hostname --ip-address
ifconfig | grep "inet addr:" | grep -v "127.0.0.1" | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | head -1
我提取我对这个答案的评论:
ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p'
它基于@CollinAnderson的答案,但对我来说没用。
linux下也可以通过该命令获取eth0的IP地址
/sbin/ip -4 -o addr show dev eth0| awk '{split($4,a,"/");print a[1]}'
输出如下所示
[root@localhost Sathish]# /sbin/ip -4 -o addr show dev eth0| awk '{split($4,a,"/");print a[1]}'
192.168.1.22