GNU/Linux >> Linux の 問題 >  >> Linux

LAN でどのコンピュータがオンになっているかを通知する Linux bash スクリプトを作成するにはどうすればよいですか?

nmap の ping-scan フラグを使用することをお勧めします。

$ nmap -sn 192.168.1.60-70

Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2009-04-09 20:13 BST
Host machine1.home (192.168.1.64) appears to be up.
Host machine2.home (192.168.1.65) appears to be up.
Nmap finished: 11 IP addresses (2 hosts up) scanned in 0.235 seconds

とはいえ、自分で書きたい場合 (これで十分です)、私なら次のようにします:

for ip in 192.168.1.{1..10}; do ping -c 1 -t 1 $ip > /dev/null && echo "${ip} is up"; done

..および上記のコマンドの各ビットの説明:

IP アドレスのリストを生成しています

06 を使用できます たとえば、数字のリストを生成する構文..

$ echo {1..10}
1 2 3 4 5 6 7 8 9 10

( 16 のようなものにも役立ちます - 21 になります と 39 、それぞれ 49 を含む および 57 )

したがって、IP のリストを生成するには、次のようにします

$ echo 192.168.1.{1..10}
192.168.1.1 192.168.1.2 [...] 192.168.1.10

ループ

bash で何かをループするには、61 を使用します :

$ for thingy in 1 2 3; do echo $thingy; done
1
2
3

ping

次に、ping を実行します。ping コマンドは、オペレーティング システムやディストリビューション/バージョンによって少し異なります (現在 OS X を使用しています)。

デフォルトでは (これも OS X バージョンの 70 では )中断されるまでpingを実行しますが、これは機能しません。したがって、85 マシンが起動しているかどうかを判断するのに十分なパケットを 1 つだけ送信しようとします。

もう 1 つの問題はタイムアウト値です。このバージョンの ping では 11 秒のようです。99 を使用して変更されています。 国旗。ローカル ネットワーク上のマシンが生きているかどうかを確認するには、1 秒で十分です。

したがって、使用する ping コマンドは..

$ ping -c 1 -t 1 192.168.1.1
PING 192.168.1.1 (192.168.1.1): 56 data bytes

--- 192.168.1.1 ping statistics ---
1 packets transmitted, 0 packets received, 100% packet loss

ping の結果を確認しています

次に、マシンが応答したかどうかを知る必要があります..

104 を使用できます 最初のコマンドが成功した場合にコマンドを実行する演算子。例:

$ echo && echo "It works"

It works
$ nonexistantcommand && echo "This should not echo"
-bash: nonexistantcommand: command not found

よし、そうしよう..

ping -c 1 -t 1 192.168.1.1 &&echo "192.168.1.1 is up!"

もう 1 つの方法は、ping の終了コードを使用することです。ping コマンドは、成功した場合は終了コード 0 (成功) で終了し、失敗した場合はゼロ以外のコードで終了します。 bash では、変数 115 で最後のコマンド終了コードを取得します

したがって、コマンドが機能したかどうかを確認するには、..

ping -c 1 -t 1 192.168.1.1;
if [ $? -eq 0 ]; then
    echo "192.168.1.1 is up";
else 
    echo "ip is down";
fi

ping 出力の非表示

最後に、ping の出力を確認する必要がないため、124 をリダイレクトできます。 136147 で リダイレクト、例:

$ ping -c 1 -t 1 192.168.1.1 > /dev/null && echo "IP is up"
IP is up

150 をリダイレクトするには (164 を破棄するには メッセージ)、174 を使用します - 例:

$ errorcausingcommand
-bash: errorcausingcommand: command not found
$ errorcausingcommand 2> /dev/null
$

スクリプト

それで、すべてを組み合わせると..

for ip in 192.168.1.{1..10}; do  # for loop and the {} operator
    ping -c 1 -t 1 192.168.1.1 > /dev/null 2> /dev/null  # ping and discard output
    if [ $? -eq 0 ]; then  # check the exit code
        echo "${ip} is up" # display the output
        # you could send this to a log file by using the >>pinglog.txt redirect
    else
        echo "${ip} is down"
    fi
done

または、186 を使用して メソッド、ワンライナーで:

for ip in 192.168.1.{1..10}; do ping -c 1 -t 1 $ip > /dev/null && echo "${ip} is up"; done

問題

遅いです..各 ping コマンドには約 1 秒かかります (-t タイムアウト フラグを 1 秒に設定しているため)。一度に 1 つの ping コマンドしか実行できません..これを回避する明白な方法は、スレッドを使用することです。これにより、並行コマンドを実行できますが、それは bash を使用する目的を超えています..

「Python スレッド - 最初の例」では、Python スレッド モジュールを使用してマルチスレッド ping'er を作成する方法について説明しています。 ..


現実の世界では、nmap を使用できます 欲しいものを手に入れるために。

nmap -sn 10.1.1.1-255

これにより、10.1.1.1 から 10.1.1.255 の範囲のすべてのアドレスに ping が送信され、どのアドレスが応答したかがわかります。

もちろん、実際にこれを bash の演習として実行したい場合は、アドレスごとに ping を実行して出力を解析することもできますが、それはまったく別の話です。


ネットワークが 10.10.0.0/24 であると仮定すると、

のようにブロードキャスト アドレスで ping を実行すると
ping -b 10.10.0.255

ICMP ping ポートをブロックしていない、このネットワーク上のすべてのコンピューターから回答が得られます。

64 bytes from 10.10.0.6: icmp_seq=1 ttl=64 time=0.000 ms
64 bytes from 10.10.0.12: icmp_seq=1 ttl=64 time=0.000 ms 
64 bytes from 10.10.0.71: icmp_seq=1 ttl=255 time=0.000 ms 

したがって、たとえば awk を使用して、4 番目の列を抽出するだけです。

ping -b 10.10.0.255 | grep 'bytes from' | awk '{ print $4 }'

10.10.0.12:
10.10.0.6:
10.10.0.71:
10.10.0.95:

重複するので、':' を削除する必要があるかもしれません。

コメントからの編集:-c オプションは、スクリプトが終了するため、ping の数を制限します。また、一意の IP で自分自身を制限することもできます

ping -c 5 -b 10.10.0.255 | grep 'bytes from' | awk '{ print $4 }' | sort | uniq

Linux
  1. LinuxBashシェルスクリプトで暗号化されたパスワードを使用する方法

  2. 使用しているLinuxディストリビューションを知る方法は?

  3. BashスクリプトにUnix/Linuxユーザーを追加する方法は?

  1. LinuxでPerlスクリプトをシステムデーモンとして実行するにはどうすればよいですか?

  2. Linuxでbashスクリプトを使用してインターネットアクセスをチェックするには?

  3. Azure Linux VM で Ping を有効にする方法

  1. PostgreSQL がインストールされているかどうかを Linux スクリプトで確認するにはどうすればよいですか?

  2. どのプロセスが自分のプロセスにシグナルを送信したかをLinuxで確認するにはどうすればよいですか

  3. Linux ホストで cgroup が使用可能かどうかを確認するにはどうすればよいですか?