2014-02-10 61 views
1

如果兩個IP位於同一網絡上,我想在bash腳本中測試。Linux:檢查是否在同一網絡

我有一個IP $remoteIP,我想測試它是否在同一網絡上(局域網)作爲我目前該機(因此,例如$remoteIP = 192.168.2.200hostname -I = 192.168.2.13與子網掩碼例如255.255.255.0這些主機在同一網絡上,192.168.1.32的主機將不在同一個網絡上。)

我想這樣做是因爲我想檢查是否在本地網絡上的計算機上運行ssh或一些帶有直接IP的服務器。基於此我想爲ps1-prompt(綠色=無ssh,黃色=本地網絡,紅色=在線服務器)着色

首先,我只需要支持大的子網掩碼(255.0.0.0,255.255。 0.0,255.255.255.0)。

所以我需要進行如下操作:接口

  1. 獲取子網掩碼在SSH連接進來
  2. 考什麼子網掩碼是(簡單,如果[...])
  3. 獲取通過ssh連接進入的IP地址
  4. 獲取遠程IP地址(我認爲它將在某個環境變量中)
  5. 子串兩個基於子網掩碼的地址
  6. 比較網絡部分。

在第1,3和5點,我不知道該怎麼做。

+0

我知道,這不是你的答案,錯誤'ping -t 1 $ remoteIP'應該在不在同一個網絡中時失敗 –

+0

但是,如果它沒有失敗,那麼它不在同一個網絡中是否合適;-)我只是說我可以達到服務器在一些其他的紐約。 – Tobi

回答

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 

(注意f IRST的命令說,「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 
+0

良好的起點,但我的服務器,例如不打印「通過」 – Tobi

相關問題