
(免責事項 - bashシェルスクリプトを使用すると、これを簡単に行うことができますが、練習する必要がありますnmap
。)
$ scriptname 192.168.42 18 23
Checking: 192.168.42.18 19 20 21 22 23
Live hosts:
192.168.42.21
192.168.42.22
There were:
5 alive hosts
1 not alive hosts
found through the use of 'ping'.
上記の出力は次のとおりです。 「確認中:...」には、確認しているすべてのIPが一覧表示されます。すべてのアクティブホストが「アクティブホスト」の下に一覧表示され、フルアクティブおよび非アクティブホストが実行されます。
これが私が今まで持っているものです
for i in `seq ${2} ${3}`
do
ping -c 1 -t 1 ${1}.${i} > /dev/null 2>&1;
if [ $? -eq 0 ]; then
echo "Live hosts: \n ${1}.${i}"; LIVECOUNT=$( ???? )
fi
done
なぜならLIVECOUNT=$( ???? )
何を入れるべきか分からないからです。生きている/無生物の累計をどのように維持するのか分かりません。確認が完了するまで、「Live Host」と「Has」セクションが表示される必要はありません。
答え1
最初の質問に対する短い答えはですLIVECOUNT=$((LIVECOUNT+1))
。この算術拡張は二重括弧$(())で表され、変数LIVECOUNTはpingコマンドが0を正常に返すたびに増加します。
ホストの総数を計算する簡単な方法は、親アドレス(${3})から子アドレス(${2})を引いた後、1 を加えてホストの総数を取得することです。
だから:
#!/bin/bash
CHECKING=${1}.
LIVEHOSTS=""
LIVECOUNT=0
TOTALHOSTS=$(($3 - $2 + 1))
for i in `seq ${2} ${3}`
do
CHECKING="$CHECKING${i} "
ping -c 1 -t 1 ${1}.${i} > /dev/null 2>&1;
if [ $? -eq 0 ]; then
LIVEHOSTS="$LIVEHOSTS \n ${1}.${i}"
LIVECOUNT=$((LIVECOUNT+1))
fi
done
echo ""
echo "Checking: $CHECKING"
echo ""
echo "Live hosts:"
echo -e "$LIVEHOSTS"
echo ""
echo "There were:"
echo "$LIVECOUNT alive hosts"
echo "$((TOTALHOSTS - $LIVECOUNT)) not alive hosts"
echo "found through the use of ping"
次の点に注意してください。 $ CHECKINGは、パラメータ1 $ {1}によって提供されたサブネットで始まり、doループが繰り返されるたびに現在のホスト番号$ {i}を追加する文字列です。
フォーマットされた方法(「ライブホスト:」行の前に「チェック:」行を追加)により、ライブホストを文字列($ CHECKINGに似ている)に保つのが簡単に見えます。これは$ LIVEHOSTSの意味です。
$ LIVEHOSTSと$ LIVECOUNTは、何が起こっているのかを明確にするために空白と0に初期化されます。これは必須ではありません。
$LIVEHOSTSを出力するときは、echo -eを使用してください。これは\ nが改行文字として機能できるようにするためです。
編集:最後のリストの代わりに現在確認されているIPを表示するには、その行を置き換え、CHECKING="$CHECKING${i} "
削除echo "Checking $CHECKING${i}"
、またはコメントアウトしますecho "Checking: $CHECKING"
。echo
そうだったから~へループ内では、do
$ iの現在の値を使用してパスごとに印刷します。 (これは、echo "Live hosts"
元のスクリプトで使用したものについて@slmが指摘したものと同じです。)