Linuxのpingコマンドで覚えておきたい使い方16個(+2個)

仕事でLinuxを利用していれば、必ずやお世話になるであろうpingコマンド。 しかし、大体の人はなんとなく使っていないだろうか?今回は、そんなpingコマンドで覚えておきたい使い方についてを紹介する。

1.基本的な使い方

まずは基本的な使い方…といっても、大体の人はわかるだろう。 以下のようにコマンドを実行する事で、相手先のホストが疎通可能な状態かを確認する。

ping 相手先のホスト名(IPアドレス)
test@ubuntu-server:~$ ping 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_seq=1 ttl=255 time=0.574 ms
64 bytes from 192.168.0.1: icmp_seq=2 ttl=255 time=0.536 ms
64 bytes from 192.168.0.1: icmp_seq=3 ttl=255 time=0.567 ms
64 bytes from 192.168.0.1: icmp_seq=4 ttl=255 time=0.512 ms
^C
--- 192.168.0.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2998ms
rtt min/avg/max/mdev = 0.512/0.547/0.574/0.029 ms

Windowsと違い、オプション無しで連続実行されるため、停止する場合は「Ctrl+C」でキャンセルするまでpingを実行し続ける。 ホスト名を指定して実行した場合、名前解決も行ってくれる。

test@ubuntu-server:~$ ping www.yahoo.co.jp
PING www.g.yahoo.co.jp (183.79.198.116) 56(84) bytes of data.
64 bytes from f9.top.vip.kks.yahoo.co.jp (183.79.198.116): icmp_seq=1 ttl=49 time=18.8 ms
64 bytes from f9.top.vip.kks.yahoo.co.jp (183.79.198.116): icmp_seq=2 ttl=49 time=18.2 ms
64 bytes from f9.top.vip.kks.yahoo.co.jp (183.79.198.116): icmp_seq=3 ttl=49 time=18.0 ms
64 bytes from f9.top.vip.kks.yahoo.co.jp (183.79.198.116): icmp_seq=4 ttl=49 time=18.2 ms
^C
--- www.g.yahoo.co.jp ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 18.036/18.362/18.891/0.346 ms

なお、疎通が出来た場合のexitコードは0、疎通できなかった場合のexitコードは1となっている。

test@ubuntu-server:~$ ping 192.168.0.2
PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.
From 192.168.0.208 icmp_seq=1 Destination Host Unreachable
From 192.168.0.208 icmp_seq=2 Destination Host Unreachable
From 192.168.0.208 icmp_seq=3 Destination Host Unreachable
^C
--- 192.168.0.2 ping statistics ---
4 packets transmitted, 0 received, +3 errors, 100% packet loss, time 2999ms
pipe 3
test@ubuntu-server:~$ echo $?
1
test@ubuntu-server:~$ ping 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_seq=1 ttl=255 time=0.469 ms
64 bytes from 192.168.0.1: icmp_seq=2 ttl=255 time=0.585 ms
64 bytes from 192.168.0.1: icmp_seq=3 ttl=255 time=0.447 ms
64 bytes from 192.168.0.1: icmp_seq=4 ttl=255 time=0.607 ms
^C
--- 192.168.0.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3000ms
rtt min/avg/max/mdev = 0.447/0.527/0.607/0.069 ms
test@ubuntu-server:~$ echo $?
0

2.指定した回数分pingを実行する

「-c」オプション(count)を指定する事で、指定回数分のpingを実行させることが可能だ。

ping -c 回数 相手先のホスト名(IPアドレス)
test@ubuntu-server:~$ ping -c 1 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_seq=1 ttl=255 time=0.601 ms

--- 192.168.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.601/0.601/0.601/0.000 ms

3.指定したインターフェイスからpingを実行する

「-Iオプション」で、指定したインターフェイス(eth0、eth1など)からpingを実行させる事ができる。

ping -I インターフェイス 相手先のホスト名(IPアドレス)
test@ubuntu-server:~$ ping -I eth0 192.168.0.1
PING 192.168.0.1 (192.168.0.1) from 192.168.0.208 eth0: 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_seq=1 ttl=255 time=24.3 ms
64 bytes from 192.168.0.1: icmp_seq=2 ttl=255 time=3.99 ms
64 bytes from 192.168.0.1: icmp_seq=3 ttl=255 time=8.06 ms
64 bytes from 192.168.0.1: icmp_seq=4 ttl=255 time=7.89 ms
^C
--- 192.168.0.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 3.997/11.065/24.306/7.816 ms

4.指定したホストへの通過点(ゲートウェイ)を指定する

Linuxのpingでは、ゲートウェイ(hop)を指定して、必ずそこを通過してホストへの疎通確認を行うようにすることも出来る。 指定する通過点が複数ある場合は、連続して複数指定する。

ping hop1(ゲートウェイ1) hop2(ゲートウェイ2) ... 相手先のホスト名(IPアドレス)

なお、この機能はソースルーティング方式となるため、環境によってはFWで弾かれたり、アラートが上がってしまうので注意が必要である。

5.指定したホストへ直接接続を行う

「-r」オプションを利用することで、同一セグメントのホストに対してのみ疎通確認を行うように出来る。

ping -r 相手先のホスト名(IPアドレス)
test@ubuntu-server:~$ ping -r 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_seq=1 ttl=255 time=0.630 ms
64 bytes from 192.168.0.1: icmp_seq=2 ttl=255 time=0.700 ms
64 bytes from 192.168.0.1: icmp_seq=3 ttl=255 time=0.791 ms
64 bytes from 192.168.0.1: icmp_seq=4 ttl=255 time=0.525 ms
^C
--- 192.168.0.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2997ms
rtt min/avg/max/mdev = 0.525/0.661/0.791/0.100 ms
test@ubuntu-server:~$ ping -r yahoo.co.jp
PING yahoo.co.jp (182.22.59.229) 56(84) bytes of data.
ping: sendmsg: Network is unreachable
ping: sendmsg: Network is unreachable
ping: sendmsg: Network is unreachable
ping: sendmsg: Network is unreachable
^C
--- yahoo.co.jp ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3023ms

6.pingの実行間隔を指定する

「-i」オプションで、pingの実行間隔を秒単位で指定することができる。 「-i 0.1」で0.1秒となる。デフォルトでは1秒。

ping -i 実行間隔(秒) 相手先のホスト名(IPアドレス)

7.pingで送信するパケットサイズを指定する

「-s」オプションを指定することで、pingで送信するパケットのサイズを指定することができる。

ping -s パケットサイズ 相手先のホスト名(IPアドレス)
test@ubuntu-server:~$ ping -s 60000 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 60000(60028) bytes of data.
60008 bytes from 192.168.0.1: icmp_seq=1 ttl=255 time=11.6 ms
60008 bytes from 192.168.0.1: icmp_seq=2 ttl=255 time=11.6 ms
60008 bytes from 192.168.0.1: icmp_seq=3 ttl=255 time=11.5 ms
60008 bytes from 192.168.0.1: icmp_seq=4 ttl=255 time=11.5 ms
^C
--- 192.168.0.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 11.513/11.582/11.648/0.146 ms

8.ping実行時のttl値を指定する

「-t」オプションを使用することで、pingコマンド実行時に送信側(ping実行側)のTTL値を指定する事が出来る。

ping -t TTL値 相手先のホスト名(IPアドレス)
test@ubuntu-server:~$ ping -t 0 192.168.0.1
ping: can't set unicast time-to-live: Invalid argument
test@ubuntu-server:~$ ping -t 1 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_seq=1 ttl=255 time=0.507 ms
64 bytes from 192.168.0.1: icmp_seq=2 ttl=255 time=0.443 ms
64 bytes from 192.168.0.1: icmp_seq=3 ttl=255 time=0.391 ms
64 bytes from 192.168.0.1: icmp_seq=4 ttl=255 time=0.496 ms
^C
--- 192.168.0.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2997ms
rtt min/avg/max/mdev = 0.391/0.459/0.507/0.048 ms

9.ping実行時のタイムアウト値を指定する

「-w」オプションを用いる事で、pingコマンドのタイムアウト値(秒)を指定出来る。

ping -w タイムアウト値(秒) 相手先のホスト名(IPアドレス)

10.ping実行時のループバックを抑制する

「-L」オプションを用いる事で、pingのループバックを抑制することができる。

ping -L 相手先のホスト名(IPアドレス)

11.ping実行時の開始時・終了時のメッセージのみ出力させる

「-q」オプションを用いると、pingの開始・終了時のメッセージのみを表示させるようにできる。

ping -q 相手先のホスト名(IPアドレス)
test@ubuntu-server:~$ ping -q -c 5 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.

--- 192.168.0.1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 3996ms
rtt min/avg/max/mdev = 0.390/0.505/0.591/0.077 ms

12.ping実行中に「Ctrl+\」を押下し、実行状況を表示させる

pingの実行中に「Ctrl + \」キーを押下することで、実行状況(パケットロスの発生数など)を表示させることが出来る。

test@ubuntu-server:~$ ping 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_seq=1 ttl=255 time=0.456 ms
64 bytes from 192.168.0.1: icmp_seq=2 ttl=255 time=0.648 ms
2/2 packets, 0% loss, min/avg/ewma/max = 0.456/0.552/0.480/0.648 ms
64 bytes from 192.168.0.1: icmp_seq=3 ttl=255 time=0.621 ms
64 bytes from 192.168.0.1: icmp_seq=4 ttl=255 time=0.545 ms
4/4 packets, 0% loss, min/avg/ewma/max = 0.456/0.567/0.503/0.648 ms
64 bytes from 192.168.0.1: icmp_seq=5 ttl=255 time=0.629 ms
64 bytes from 192.168.0.1: icmp_seq=6 ttl=255 time=0.588 ms
6/6 packets, 0% loss, min/avg/ewma/max = 0.456/0.581/0.528/0.648 ms
64 bytes from 192.168.0.1: icmp_seq=7 ttl=255 time=0.416 ms
64 bytes from 192.168.0.1: icmp_seq=8 ttl=255 time=0.593 ms
8/8 packets, 0% loss, min/avg/ewma/max = 0.416/0.562/0.523/0.648 ms
64 bytes from 192.168.0.1: icmp_seq=9 ttl=255 time=0.429 ms
64 bytes from 192.168.0.1: icmp_seq=10 ttl=255 time=0.624 ms
^C
--- 192.168.0.1 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 8999ms
rtt min/avg/max/mdev = 0.416/0.554/0.648/0.089 ms

13.ネットワークのルートを表示する

tracerouteに比べあまり利用されておらず、サポートもされていないようだが、「-R」オプションを利用することで対象ホストまでのネットワークルートを出力させることが出来る。

ping -R 対象のホスト名(IPアドレス)
$ ping -R 192.168.1.63
PING 192.168.1.63 (192.168.1.63) 56(84) bytes of data.
64 bytes from 192.168.1.63: icmp_seq=1 ttl=61 time=2.05 ms
RR:   192.168.9.118
        192.168.3.25
        192.168.10.35
        192.168.1.26
        192.168.1.63
        192.168.1.63
        192.168.10.4
        192.168.3.10
        192.168.4.25
64 bytes from 192.168.1.63: icmp_seq=2 ttl=61 time=2.00 ms      (same route)

14.for、arpと組み合わせ、連続でpingを実行し現在疎通可能なホスト一覧を取得する

for、arpと組み合わせてpingを実行し、連続で総当りにpingを実行、疎通可能なホストの一覧を取得させることも可能だ。 (こちらのページから紹介)

for a in `seq 1 254`; do ping -c 1 -w 0.5 対象セグメント(第3オクテットまで).$a > /dev/null && arp -a 対象セグメント(第3オクテットまで).$a | grep ether; done
test@ubuntu-server:~$ for a in `seq 1 254`; do ping -c 1 -w 0.5 192.168.0.$a > /dev/null && arp -a 192.168.0.$a | grep ether; done
? (192.168.0.1) at 1c:bX:7f:X4:2d:3c [ether] on eth0
? (192.168.0.XX) at 00:X5:b7:03:X3:X7 [ether] on eth0
・
・
・

もしくは、以下のようにxargsと組み合わせることで、パラレルで一気にpingを実行して疎通確認を行う方法もある。

echo 192.168.0.{1..255} | xargs -P256 -n1 ping -c1 -t1 | grep ttl

15.pingの実行結果から相手先のOSを推測する

以前こちらにも記述したが、pingの応答メッセージに記述されるTTL値から、相手先のOSをある程度推測することが可能となっている。 応答時のTTL値が、以下の数字に近ければそのOSになるだろう。

  • Linux:64
  • Windows:128
  • UNIX(NW機器も):255
test@ubuntu-server:~$ ping -c 1 192.168.0.240
PING 192.168.0.240 (192.168.0.240) 56(84) bytes of data.
64 bytes from 192.168.0.240: icmp_seq=1 ttl=64 time=0.625 ms

--- 192.168.0.240 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.625/0.625/0.625/0.000 ms

なお、ここで出来るのはあくまでも推測でしか無い。 こちらでも記述したが、この応答時のTTLはカーネル値(Windowsの場合はレジストリ)で変更可能だからだ。

16.複数のホストに同時にpingを実行する

複数のホストに同時にpingを実行し、死活監視を行いたい場合、pingよりはその派生であるfpingを用いると良いだろう。 fpingについては、こちらのページに記述している。

pingコマンドで常時監視をするならば、以下のようにコマンドを実行しバックグラウンドでpingを連続実行させ、その結果を別途ファイルに出力させておくことで、数秒ごとのpingのexitコードを確認することが出来る。

while true; do ping -c 1 IPアドレス > /dev/null ;echo $? > 出力ファイル名 ; sleep 2; done &

OK、NGで確認するならば、以下のようにする。

while true; do ping -c 1 相手先ホスト名(IPアドレス) > /dev/null && echo OK > 出力先ファイル名 || echo NG > 出力先ファイル名; sleep 2; done &

ホストごとにファイルを作成し、疎通確認時は、以下のようにgrepコマンドなどで確認すれば良いだろう。

[root@dctest01 ~]# grep ""  test_ping*
test_ping_192.168.0.1:OK
test_ping_192.168.0.15:NG
test_ping_192.168.0.245:OK

むろん、別途cronなどでhttpファイルの生成スクリプトを実行させ、そこで各ファイルを読み込ませる方式でもいいだろう。


2016/03/29 追記

17.タイムスタンプを付与する

以前こちらにも記述したが、pingの実行結果にタイムスタンプを付与させる事も出来る(ping単体ではムリ)。

ping 対象ホスト | while read pi; do echo "$(date '+[%Y/%m/%d %H:%M:%S]') $pi"; done

[root@localhost ~]# ping 8.8.8.8 | while read pi; do echo "$(date '+[%Y/%m/%d %H:%M:%S]') $pi"; done
[2016/01/04 07:37:33] PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
[2016/01/04 07:37:33] 64 bytes from 8.8.8.8: icmp_seq=1 ttl=54 time=6.44 ms
[2016/01/04 07:37:34] 64 bytes from 8.8.8.8: icmp_seq=2 ttl=54 time=6.06 ms
[2016/01/04 07:37:35] 64 bytes from 8.8.8.8: icmp_seq=3 ttl=54 time=7.00 ms
[2016/01/04 07:37:36] 64 bytes from 8.8.8.8: icmp_seq=4 ttl=54 time=7.75 ms
[2016/01/04 07:37:37] 64 bytes from 8.8.8.8: icmp_seq=5 ttl=54 time=13.0 ms
[2016/01/04 07:37:38] 64 bytes from 8.8.8.8: icmp_seq=6 ttl=54 time=4.65 ms
[2016/01/04 07:37:39] 64 bytes from 8.8.8.8: icmp_seq=7 ttl=54 time=5.12 ms

18.pingが通る場合・通らない場合でビープ音を鳴らす

「-A(ping失敗時にBeep音)」「-a(ping成功時にBeep音)」オプションを付与することで、疎通成功・失敗時にビープ音を鳴らす事が出来る。 なお、毎回なるので連続実行時は正直うるさいので注意。