Mar*_*les 8 networking scripting ip ifconfig
我需要创建一个输出内部 IP 地址的脚本,该地址被配置为默认接口。
这里有很多很好的答案,但想采用我通常的方法:
最简单的解决方案是获取公共 Internet 地址的路由:
$ ip route get 1.1.1.1 | grep -oP 'src \K\S+'
192.168.0.20
Run Code Online (Sandbox Code Playgroud)
另一种解决方案是获取默认网关,然后获取用于与该网关通信的 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
Run Code Online (Sandbox Code Playgroud)
这是另一种稍微简洁的方法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 }'
Run Code Online (Sandbox Code Playgroud)
这将返回接口的 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
Run Code Online (Sandbox Code Playgroud)
$ ip addr show dev "$default_iface" | awk '$1 == "inet" { sub("/.*", "", $2); print $2 }'
10.0.2.15
Run Code Online (Sandbox Code Playgroud)
$ ip addr show dev "$default_iface" | awk '$1 == "inet6" { sub("/.*", "", $2); print $2 }'
fe80::a00:27ff:fe45:b085
Run Code Online (Sandbox Code Playgroud)