我想在bash脚本中测试两个IP是否在同一网络上。
我有一个IP$remoteIP
,我想测试它是否与我当前的机器在同一个网络(局域网)上(例如$remoteIP
=192.168.2.200
和hostname -I
=192.168.2.13
,子网掩码为255.255.255.0
,这些主机在同一网络上。192.168.1.32的主机将不在同一网络上。)
我想这么做是因为我想检查我是在本地网络上的电脑上还是在有直接IP的服务器上。基于此,我想将ps1提示符着色(绿色=无ssh,黄色=本地网络,红色=在线服务器)
起初,我只需要支持大的子网掩码(255.0.0.0、255.255.0.0、255.255.255.0)。
所以我需要以下步骤:
- 获取ssh连接所在接口的子网掩码
- 测试它是什么子网掩码(如果[…],则很简单)
- 获取ssh连接进入的IP地址
- 获取remoteIP地址(我认为它将在某个环境变量中)
- 基于子网掩码的两个地址的子网
- 比较网络部件
在第1点、第3点和第5点,我不知道如何做到这一点。
另一种策略是使用Linux的ip
命令来确定默认网关是什么,以及给定的IP地址是否将通过所述网关路由。
默认网关可以在ip route
:的输出中看到
$ ip route
default via 192.168.1.1 dev eth0 metric 100
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.2
只获取默认网关的IP地址:
$ ip route | awk '/default/ {print $3}'
192.168.1.1
要确定给定IP地址的路由方式,请使用ip route get
:
$ ip route get 4.2.2.2
4.2.2.2 via 192.168.1.1 dev eth0 src 192.168.1.2
$ ip route get 192.168.1.10
192.168.1.10 dev eth0 src 192.168.1.2
(注意,第一个命令显示"via 192.168.1.1
",表示将通过默认网关进行路由)
将所有内容组合到一个函数中:
is_remote_ip() {
ip route get $1 | grep -q "via $(ip route | awk '/default/ {print $3}') "
}
演示:
$ is_remote_ip 4.2.2.2 && echo yes || echo no
yes
$ is_remote_ip 192.168.1.10 && echo yes || echo no
no