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

时间:2014-02-10 14:30:50

标签: bash ip substring

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

我有一个IP $remoteIP,我想测试它是否与我当前的机器在同一网络(局域网)上(例如$remoteIP = 192.168.2.200和{具有子网掩码的{1}} = hostname -I例如192.168.2.13这些主机位于同一网络上。具有192.168.1.32的主机不在同一网络上。)

我想这样做是因为我想检查我是在本地网络上的计算机上还是在直接IP的某台服务器上进行ssh。基于此我想为ps1提示颜色(绿色=没有ssh,黄色=本地网络,红色=在线服务器)

首先,我只需要支持大的子网掩码(255.0.0.0,255.255.0.0,255.255.255.0)。

所以我需要以下步骤:

  1. 获取ssh-connection所在的接口的子网掩码
  2. 测试它是什么子网掩码(简单,如果[...])
  3. 获取ssh-connection进入的IP地址
  4. 获取remoteIP地址(我认为它将在某些环境变量中)
  5. 根据子网掩码
  6. 对两个地址进行子串
  7. 比较网络部分。
  8. 在第1,3和5点,我不知道如何做到这一点。

1 个答案:

答案 0 :(得分:6)

另一种策略是使用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