我正在寻找一个命令行解决方案,将返回我的主(第一个)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,但是它的输出在这些平台之间并不一致。
当前回答
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
其他回答
在linux系统上获取本地ipv4地址的最短方法:
hostname -I | awk '{print $1}'
如果你知道网络接口(eth0, wlan, tun0等):
ifconfig eth0 | grep addr: | awk '{ print $2 }' | cut -d: -f2
解决方案
$ 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。
我只是利用网络接口名称,我的自定义命令是
[[ $(ip addr | grep enp0s25) != '' ]] && ip addr show dev enp0s25 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p' || ip addr show dev eth0 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p'
在我自己的笔记本上
[flying@lempstacker ~]$ cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
[flying@lempstacker ~]$ [[ $(ip addr | grep enp0s25) != '' ]] && ip addr show dev enp0s25 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p' || ip addr show dev eth0 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p'
192.168.2.221
[flying@lempstacker ~]$
但如果网络接口拥有至少一个ip,那么它将显示属于它的所有ip
例如
Ubuntu 16.10
root@yakkety:~# sed -r -n 's@"@@g;s@^VERSION=(.*)@\1@p' /etc/os-release
16.04.1 LTS (Xenial Xerus)
root@yakkety:~# [[ $(ip addr | grep enp0s25) != '' ]] && ip addr show dev enp0s25 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p' || ip addr show dev eth0 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p'
178.62.236.250
root@yakkety:~#
Debian杰西
root@jessie:~# sed -r -n 's@"@@g;s@^PRETTY_NAME=(.*)@\1@p' /etc/os-release
Debian GNU/Linux 8 (jessie)
root@jessie:~# [[ $(ip addr | grep enp0s25) != '' ]] && ip addr show dev enp0s25 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p' || ip addr show dev eth0 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p'
192.81.222.54
root@jessie:~#
CentOS 6 . 8
[root@centos68 ~]# cat /etc/redhat-release
CentOS release 6.8 (Final)
[root@centos68 ~]# [[ $(ip addr | grep enp0s25) != '' ]] && ip addr show dev enp0s25 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p' || ip addr show dev eth0 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p'
162.243.17.224
10.13.0.5
[root@centos68 ~]# ip route get 1 | awk '{print $NF;exit}'
162.243.17.224
[root@centos68 ~]#
Fedora 24
[root@fedora24 ~]# cat /etc/redhat-release
Fedora release 24 (Twenty Four)
[root@fedora24 ~]# [[ $(ip addr | grep enp0s25) != '' ]] && ip addr show dev enp0s25 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p' || ip addr show dev eth0 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p'
104.131.54.185
10.17.0.5
[root@fedora24 ~]# ip route get 1 | awk '{print $NF;exit}'
104.131.54.185
[root@fedora24 ~]#
link提供的命令ip route get 1 | awk '{print $NF;exit}'似乎更准确,而且更短。
使用grep从ifconfig中过滤IP地址:
ifconfig | grep eo的inet (addr:) ?([0 - 9] * \){3}[0 - 9] *’| grep eo”([0 - 9]* \){3}[0 - 9]*’| grep - v 127.0.0.1的
或者用sed:
ifconfig | sed -En 's/127.0.0.1//;* inet (addr) ?(([0 - 9] * \){3}[0 - 9] *)。* / \ 2 / p”
如果你只对某些接口感兴趣,比如wlan0、eth0等,那么:
ifconfig wlan0 | ...
例如,您可以在.bashrc中使用别名来创建自己的命令myip。
别名myip =“ifconfig | sed -En’s / 127 . 0 0。1;s /。* inet(键入https://www.bittrex.com:) ?(0 - 9) *[\。)0 - 9]{3}[*)* \ 2 / p’”。
一个更简单的方法是hostname -I (hostname -I用于旧版本的hostname,但请参阅注释)。但是,这仅适用于Linux。