我需要创建一个输出内部 IP 地址的脚本,该地址被配置为默认接口。
答案1
这里有很多很好的答案,但想加入我通常的方法:
最简单的解决方案是获取公共互联网地址的路由:
$ ip route get 1.1.1.1 | grep -oP 'src \K\S+'
192.168.0.20
另一种解决方案是获取默认网关,然后获取用于与该网关通信的 IP 地址:
$ ip route get $(ip route show 0.0.0.0/0 | grep -oP 'via \K\S+') | grep -oP 'src \K\S+'
192.168.0.20
答案2
这是另一种稍微简洁的方法procfs
(假设您使用的是 Linux):
default_iface=$(awk '$2 == 00000000 { print $1 }' /proc/net/route)
ip addr show dev "$default_iface" | awk '$1 ~ /^inet/ { sub("/.*", "", $2); print $2 }'
这将返回接口的 IPv4 和(如果可用)IPv6 地址。如果您只需要其中之一(查找inet
IPv4 和inet6
IPv6),则可以更改测试。
$ default_iface=$(awk '$2 == 00000000 { print $1 }' /proc/net/route)
$ ip addr show dev "$default_iface" | awk '$1 ~ /^inet/ { sub("/.*", "", $2); print $2 }'
10.0.2.15
fe80::a00:27ff:fe45:b085
$ ip addr show dev "$default_iface" | awk '$1 == "inet" { sub("/.*", "", $2); print $2 }'
10.0.2.15
$ ip addr show dev "$default_iface" | awk '$1 == "inet6" { sub("/.*", "", $2); print $2 }'
fe80::a00:27ff:fe45:b085
答案3
我最喜欢的是下面的。
获取默认界面:
$ ip r | grep -oP 'default .* \K.+'
eth0
获取接口的ip:
$ ip a show eth0 | grep -oP 'inet \K[\d\.]+'
10.33.44.135
综合:
$ ip a show $(ip r | grep -oP 'default .* \K.+') | grep -oP 'inet \K[\d\.]+'
10.33.44.135
答案4
另一种方法是:
ip a|awk /$(ip r|awk '/default/ { print $5 }')/|awk '/inet/ { print $2 }'| cut -f1 -d"/"
这样做的好处是仅使用ip a
并且ip r
默认情况下在所有 Linux 系统上都可用