我目前正在用 bash 做一個掃描儀。
這個想法是接收一個網路作為輸入,并在遍歷它的同時,ping IP 并探測埠以查看它們是否打開。
變數說明(示例):
輸入->要掃描的網路:192.168.1.0/24
起始 IP:192.168.1.0 -> $i1.$i2.$i3.$i4
最后一個 IP:192.168.1.255 -> $m1.$m2.$m3.$m4
for oct1 in $(seq $i1 1 $m1); do
for oct2 in $(seq $i2 1 $m2); do
for oct3 in $(seq $i3 1 $m3); do
for oct4 in $(seq $i4 1 $m4); do
ping -c 1 $oct1.$oct2.$oct3.$oct4 | grep "64 bytes" | cut -d" " -f4 | tr -d ":" >> scan.txt
nc -nvz $oct1.$oct2.$oct3.$oct4 80 2>&1 | grep succeeded | cut -d" " -f4 >> scan.txt
done
done
done
done
檔案scan.txt類似于:
192.168.1.1
80
192.168.1.2
192.168.1.4
192.168.1.5
192.168.1.7
80
192.168.1.9
(...)
我唯一的問題是這個解決方案雖然有效,但需要太多時間。
掃描 192.168.1.0/24 網路,我發現腳本可以正常啟動,但在掃描大約 10 個 IP 后,它開始變慢,幾乎卡住了。
我想這與 ping 和 nc 命令讓作業在后臺運行有關。如果我添加& disown到 ping 和 nc 命令的末尾,它會運行得更順暢,但會導致輸出混亂。
它不是從 .1 到 0.254,而是開始看起來像:
192.168.1.6
80
192.168.1.10
80
80
192.168.1.1
192.168.1.5
192.168.1.3
(...)
可以優化此代碼(或以不同的方式完成)以更快地運行嗎?
uj5u.com熱心網友回復:
ping -c 1 $oct1.$oct2.$oct3.$oct4 | grep "64 位元組" | 剪切 -d" " -f4 | tr -d ":" >> scan.txt
當 ping 不產生“64 位元組”訊息時會發生什么?你的腳本停止了很長一段時間。在我的系統上,失敗需要 10 秒,但我不確定該超時是否有任何特別標準。
$ time ping -c1 192.168.0.123
PING 192.168.0.123 (192.168.0.123) 56(84) bytes of data.
--- 192.168.0.123 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
real 0m10.004s
user 0m0.000s
sys 0m0.000s
現在大多數 Linux 發行版都包含超時(1),因此您可以限制腳本等待的時間:
$ timeout 2 ping -c1 192.168.0.123 || echo no
PING 192.168.0.123 (192.168.0.123) 56(84) bytes of data.
no
對于并發處理(一次 ping 多個主機),您可以考慮使用make (1) 和-j選項。使用腳本生成一組地址??,每個地址都有一個檔案名,然后定義 Makefile 規則為每個輸入生成一個輸出檔案。最后一步,將所有輸出連接在一起。
如果您的輸入檔案是.ping并且您的輸出檔案是.pong,則遵循以下規則:
.ping.pong:
ping -c 1 $^ \
| grep "64 bytes" \
| cut -d" " -f4 \
| tr -d ":" > $@~
nc -nvz $^ 80 2>&1 \
| grep succeeded | cut -d" " -f4 >> $@~
mv $@~ $@
會將每個 .ping 檔案“編譯”為 .pong 檔案。(上述內容不太有效,因為您需要從檔案名中洗掉后綴以用作命令列引數。)
最后一句忠告:如果您發現自己在管道中使用 grep、cut、sed 和 tr,那么awk (1) 就是您的朋友。有 100 個原因,但也許最好的一個是您可以輕松地撰寫 awk 腳本,讓意外的輸入“通過”您可以看到并處理它。使用 grep,所有意外都被丟棄,讓您猜測(或詢問)缺少什么。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/351568.html
下一篇:將多個變數添加到關聯陣列
