如果目标是找到连接到互联网的IP地址,则这应该是一个不错的解决方案。
编辑2021:添加了“sed”和“grep”版本以及新的“awk”版本(其中一些是gnu)。
要查找连接到互联网的使用的IP地址,我们可以使用
ip route
命令。在较新版本的Linux中,您将获得更多信息,典型输出如下:
ip route get 8.8.8.8
8.8.8.8 via 10.36.15.1 dev ens160 src 10.36.15.150 uid 1002
cache
要获取IP,您需要在src之后使用awk、sed或grep查找IP。
ip route get 8.8.8.8 | awk -F"src " 'NR==1{split($2,a," ");print a[1]}'
ip route get 8.8.8.8 | awk 'match($0,/src (\S*)/,a)&&$0=a[1]'
ip route get 8.8.8.8 | awk '{for(i=1;i<=NF;i++)if($i~/src/)$0=$(i+1)}NR==1'
ip route get 8.8.8.8 | sed -E 's/.*src (\S+) .*/\1/;t;d'
ip route get 8.8.8.8 | sed 's/.*src \([^ ]*\).*/\1/;t;d'
ip route get 8.8.8.8 | sed -nE '1{s/.*?src (\S+) .*/\1/;p}'
ip route get 8.8.8.8 | grep -oP 'src \K[^ ]+'
10.36.15.150
如果你喜欢使用 awk、sed 或者 grep,可以通过这些工具来查找接口名称
ip route get 8.8.8.8 | awk -F"dev " 'NR==1{split($2,a," ");print a[1]}'
ip route get 8.8.8.8 | awk 'match($0,/dev (\S*)/,a)&&$0=a[1]'
ip route get 8.8.8.8 | awk '{for(i=1;i<=NF;i++)if($i~/dev/)$0=$(i+1)}NR==1'
ip route get 8.8.8.8 | sed -E 's/.*?dev (\S+) .*/\1/;t;d'
ip route get 8.8.8.8 | sed 's/.*dev \([^ ]*\).*/\1/;t;d'
ip route get 8.8.8.8 | sed -nE '1{s/.*?dev (\S+) .*/\1/;p}'
ip route get 8.8.8.8 | grep -oP 'dev \K[^ ]+'
ens192
ip route
不会打开任何连接,它只显示到达 8.8.8.8
所需的路由。 8.8.8.8
是 Google 的 DNS。
如果您想将此存储到变量中,请执行以下操作:
my_ip=$(ip route get 8.8.8.8 | awk -F"src " 'NR==1{split($2,a," ");print a[1]}')
my_interface=$(ip route get 8.8.8.8 | awk -F"dev " 'NR==1{split($2,a," ");print a[1]}')
为什么其他解决方案可能会失败:
ifconfig eth0
- 如果您的接口有另一个名称(eno1、wifi、venet0等)
- 如果您有多个接口
- IP连接方向不是多个IF列表中的第一个
Hostname -I
- 可能只会得到127.0.1.1
- 在所有系统上都无法使用。
- 给出所有IP,而不仅仅是连接到互联网的那个。-I,--all-ip-addresses适用于主机的所有地址