Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash Linux:检查是否在同一网络中_Bash_Ip_Substring - Fatal编程技术网

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

Bash Linux:检查是否在同一网络中,bash,ip,substring,Bash,Ip,Substring,我想在bash脚本中测试两个ip是否在同一网络上 我有一个IP$remoteIP,我想测试它是否与我当前的机器在同一个网络(局域网)上(例如$remoteIP=192.168.2.200和hostname-I=192.168.2.13子网掩码为例如255.255.255.0的主机位于同一网络上。具有192.168.1.32的主机将不在同一网络上。) 我想这样做是因为我想检查我是在本地网络上的计算机上还是在具有直接IP的服务器上进行了ssh。基于此,我想给ps1提示符涂上颜色(绿色=无ssh,黄色

我想在bash脚本中测试两个ip是否在同一网络上

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

我想这样做是因为我想检查我是在本地网络上的计算机上还是在具有直接IP的服务器上进行了ssh。基于此,我想给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路由的输出中看到

    $ 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
    

    另一种策略是使用Linux的
    ip
    命令来确定默认网关是什么,以及给定的ip地址是否将通过所述网关路由

    默认网关可以在
    ip路由的输出中看到

    $ 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
    

    我知道这不是你的答案,bug
    ping-t 1$remoteIP
    如果不在同一个网络中应该会失败,但如果它不失败,如果它在同一个网络中就不是舒尔;-)我只是舒尔,我可以通过其他一些新作品访问服务器。我知道这不是你的答案,bug
    ping-t 1$remoteIP
    在不在同一网络中时应失败,但如果不失败,则在同一网络中就不是舒尔;-)我只是舒尔,我可以通过其他一些NewWorks连接到服务器。这是一个很好的起点,但我的服务器没有打印“via”,这是一个很好的起点,但我的服务器没有打印“via”