我有一个嵌入式 Linux 系统,它设置为对 eth0 使用 DHCP,但也配置了一个链路本地 IP 地址作为备用地址 (eth0:1),以防万一没有从 DHCP 获取 IP 地址。
有没有一种简单的方法可以从 shell 脚本检查正在使用哪个 IP 地址?
我得到的最接近的是:
$ ip route get 1
1.0.0.0 via 192.168.0.100 dev eth0 src 192.168.0.133
cache
$ ifconfig eth0 0.0.0.0 # Simulate no IP obtained from DHCP
$ ip route get 1
1.0.0.0 via 192.168.0.100 dev eth0 src 169.254.197.131
cache
这可以正确识别正在使用的 IP 地址(“src”字段)。但是,这仅在配置了默认网关的情况下才有效,如果 DHCP 由于某种原因不可用,则不会出现这种情况。
即使没有配置默认网关,如何找出正在使用的 IP 地址?
答案1
命令ip route get ADDRESS
做即使没有配置默认网关也可以工作。例如,在eth0上配置了以下地址:10.0.7.139/24
, 169.254.1.2/16
,并且删除了默认路由,则
$ ip route get 10.0.7.222
10.0.7.222 dev eth0 src 10.0.7.139
cache
$ ip route get 169.254.55
169.254.55.0 dev eth0 src 169.254.1.2
cache
$ ip route get 1
RTNETLINK answers: Network is unreachable
最后一个答案是正确的:如果不存在到任何地址 1.xxx 的主机,则无法到达该主机。不是ip route get
命令不起作用,而是网络配置错误。
请注意,“链路本地”仅表示仅在连接到的以太网链路 eth0 上使用的地址。它不应该用于“传出”连接。
编辑:澄清下面添加的评论。
路由表(并且只有路由表)决定数据包如何开始其到达目的地的旅程。发送 IP 数据包时始终会涉及路由,即使目的地位于本地链路甚至本地主机上。路由表条目还包含源地址,匹配路由的该地址被选择作为传输数据包的源IP地址。
可能有多个 IP 地址分配给同一接口,甚至来自同一地址范围,但匹配的路由表条目中只列出其中一个(主地址)。
因此ip route get
(或间接ip route
)给出了您的问题的明确答案。从ip-route
手册页来看:“此命令获取到目的地的单个路由并完全按照内核所看到的方式打印其内容。”