【问题标题】:Linux: Check if in Same NetworkLinux:检查是否在同一网络中
【发布时间】:2014-03-07 22:37:42
【问题描述】:

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

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

我想这样做是因为我想检查我是在本地网络上的计算机上还是在具有直接 IP 的某些服务器上 ssh'ed。基于此,我想为 ps1-prompt 着色(绿色 = 无 ssh,黄色 = 本地网络,红色 = 在线服务器)

一开始我只需要支持大子网掩码(255.0.0.0、255.255.0.0、255.255.255.0)。

所以我需要以下步骤:

  1. 获取 ssh 连接进入的接口的子网掩码
  2. 测试它是什么子网掩码(简单 if [ ... ] )
  3. 获取 ssh 连接进入的 IP 地址
  4. 获取远程IP地址(我认为它会在某个环境变量中)
  5. 根据子网掩码对两个地址进行子串化
  6. 比较网络部分。

在第 1、3 和 5 点,我不知道该怎么做。

【问题讨论】:

  • 我知道这不是你的答案,错误ping -t 1 $remoteIP 不在同一个网络中时应该会失败
  • 但是如果它没有失败,那么如果它在同一个网络中就不是舒尔 ;-) 我只是舒尔我可以通过其他一些网络到达服务器。

标签: bash ip substring


【解决方案1】:

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

【讨论】:

  • 好的起点,但我的服务器例如不打印“通过”
猜你喜欢
  • 2012-01-25
  • 1970-01-01
  • 2012-04-22
  • 1970-01-01
  • 2017-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多