2015-10-21 109 views
1

因此,如果我想通過SSH連接到網絡上的所有設備,使用ARP表來準確知道連接的位置,我該怎麼辦?Bash - 循環播放ARP表並將IP存儲在變量中

的代碼將是這樣的:

#!/bin/bash 

for a in $([ARP Table here?]) 
do 
    ssh [email protected]$a true 
    echo "Connected to $a" 
done 

我不知道如何將IP地址DINAMIC存儲在一個變量。另外我不確定事實上我可以使用這個變量通過ssh進行連接,因爲IP不會是int,而更可能是一個字符串。

編輯:安德魯提出之後我發現我的網絡上不是每個設備可以在我的ARP表,我想知道:

是更好地從0開始到當前網絡掩碼的最大值或在ARP表中搜索?

這裏有兩種情況:

#!/bin/bash 

for a in $(seq 255) 
do 
    ssh [email protected]$a true 
    echo "Connected to 172.18.10.$a" 
done 

#!/bin/bash 

for a in $([ARP Table here?]) 
do 
    ssh [email protected]$a true 
    echo "Connected to $a" 
done 
+0

可能不是一個好方法。無法保證任何給定的本地設備在任何特定時間都會在您的ARP緩存中。 –

+0

@AndrewMedico所以你說,網絡上可能有一些實際的設備,但不是在我的ARP表中。然後我會編輯我的問題。 –

+0

此外,「所有設備」並不足以說明問題。什麼樣的設備? Cisco IOS? JUNOS? FreeBSD還是Linux?如果您正在討論特定主機上的arp緩存,則可以在大多數操作系統中分析arp -an的輸出。但聽安德魯,他說的是真話;你的arp緩存是短暫的,並且依賴於網絡活動。 ARP是一種工具,可讓您的設備互相講以太網,這不是一種網絡管理策略。 – ghoti

回答

1

比開發自己的掃描工具更好的解決方案可能是使用已經存在的東西。

要查看哪些IP地址可到達(作爲副作用將填充您的ARP緩存),您可以使用fping。它可能適用於您的操作系統或發行版。我的本地網絡示例如下:

$ fping -g 10.1.1.0/29 
10.1.1.1 is alive 
10.1.1.2 is alive 
10.1.1.5 is alive 
10.1.1.3 is unreachable 
10.1.1.4 is unreachable 
10.1.1.6 is unreachable 

fping命令是ICMP專用的 - 它發送ping。如果您的目標不僅僅是確定存在哪些設備,而且還要確定它們是否在SSH端口上進行應答(22),您可以使用tcping或其他類似的東西。

for ip in $(seq -f "10.1.1.%g" 1 9); do 
    if tcping -u 200 -q $ip 22; then 
    echo "yes: $ip" 
    fi 
done 

這可能是有點麻煩,腳本的另一種選擇是使用一個實際的掃描工具,如nmap(如The Matrix所示)。

如果您使用的是網絡監控系統,請檢查它是否包含內置的網絡掃描工具。例如,Cacti有一個discovery pluginNagiosquite a few of them

+0

Ty非常感謝gothi的一切:D –

+0

我的榮幸。 :) – ghoti

1

我要回答你最初的問題(一個標題介紹)。

要閱讀ARP表和遍歷每個IP地址就可以了,你可以做以下

#!/bin/bash 

for a in $(arp -n | tail -n+2 | cut -d' ' -f1) 
do 
    ssh [email protected]$a true 
    echo "Connected to $a" 
done 
  • arp命令輸出ARP緩存,搭配一些信息 大約每個條目一起。
  • tail用於刪除第一行,其中 包含輸出 arp的不同列的標題。
  • cut刪除所有的輔助信息,只留下 的IP地址,每行一個。
+0

不幸的是,/ proc文件系統是Linuxism。有其他操作系統的版本,但它們通常不會默認安裝,並且據我所見,它們不包含/ proc/net擴展名。 OP沒有指定在這裏使用的操作系統,所以重要的是讓你的答案可移植。 – ghoti

+0

@ ghoti ok,切換到arp命令 –

相關問題