Linux:检查是否在同一网络中

Tob*_*obi 1 ip bash substring

如果两个IP在同一网络上,我想在bash脚本中进行测试.

我有一个IP $remoteIP,我想测试它是否与我当前的机器在同一网络(局域网)上(例如$remoteIP= 192.168.2.200hostname -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).

所以我需要以下步骤:

  1. 获取ssh连接所在的接口子网掩码
  2. 测试它是什么子网掩码(如果[...]简单)
  3. 获取ssh-connection进来的IP地址
  4. 获取remoteIP地址(我认为它将在某些环境变量中)
  5. 根据子网掩码对两个地址进行子串
  6. 比较网络部分.

在第1,3和5点,我不知道如何做到这一点.

小智 7

另一种策略是使用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
Run Code Online (Sandbox Code Playgroud)

要获得默认网关的IP地址:

$ ip route | awk '/default/ {print $3}'
192.168.1.1
Run Code Online (Sandbox Code Playgroud)

要确定如何路由给定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
Run Code Online (Sandbox Code Playgroud)

(注意,第一个命令via 192.168.1.1显示" "表示它将通过默认网关路由)

将所有内容放在一起使用:

is_remote_ip() {
   ip route get $1 | grep -q "via $(ip route | awk '/default/ {print $3}') "
}
Run Code Online (Sandbox Code Playgroud)

示范:

$ is_remote_ip 4.2.2.2 && echo yes || echo no
yes

$ is_remote_ip 192.168.1.10 && echo yes || echo no
no
Run Code Online (Sandbox Code Playgroud)