Linuxの「ping -o」と同じ

Linuxの「ping -o」と同じ

明らかに、MacOsには「最初の成功した応答を受信した後に返す」または同様のオプションがpingあります。-o望むより:https://stackoverflow.com/a/6119327/4561887

Linux Ubuntuにも対応するものはありますか?どうすれば同じ結果が得られますか?

私のバージョンはです。ping utility, iputils-s20161105から返されましたping -V

アップデート:ここでMacOsドキュメントを見つけました。https://ss64.com/osx/ping.html

-o         Exit successfully after receiving one reply packet.

答え1

pingの使用:
ping -c 1 ping_address
ping -c 1 192.168.1.68 #example
  • cパラメータはパケット数を計算するために使用されるため、1これが必要な理由は -->-c 1

  • コマンドを実行した後、その内容を表示できます。終了ステータス$?コマンドを使用して 。 pingを使用した後は、次のように表示されます。0(成功、わかった)。それ以外の場合は、orと入力して1orを取得します。これは次のことを意味します。2$?間違い

PING出力は次を返しますecho
1 received, 0%   packet loss -> (Success echo $? #returns 0
0 received, 100% packet loss -> (Failure)echo $? #returns 1

サービスが利用可能になったら、停止してそれをwhileループに渡す無限ループです。

while ! ping -c1 -W1 192.168.1.68; :;done
  • しかし、いいえ !生き続け、繰り返し、常に終了状態で終了します。成功 :
  • -W11秒だけ待ってください。

名前付きファイルにコピーします。pingo

#!/usr/bin/bash
while ! ping -c1 -W1 "$1"; do
    : && echo "NOT ALIVE"
done
  • :NULL コマンドであるか効果がありません。コマンドが何も実行しないか、終了ステータスが常に成功します。この場合、trueと入力するのと似ています。は Bourne Shell 内蔵
  • この変数$1最初のコマンドラインパラメータ、この場合IPアドレス。たとえば、pingo 192.168.1.68交換1指定されたIPアドレスに。 」
ユーザーのbinディレクトリ

という名前のフォルダを作成します。ゴミ箱。そのフォルダに次のファイルを作成します。ピンゴファイルをプログラムとして実行できます。

mkdir ~/bin    # make directory at /home/user/bin
cd ~/bin       # change to /home/user/bin directory
touch pingo    # create file pingo copy the above command and save it
chmod +x pingo # give permission to execute
  • この/home/user/binフォルダは、「ping」コマンドのように、端末でどこでも実行できるプログラムのデフォルトの場所です。

これで、pingoどんなアドレスでも実行できますping -o

PINGマニュアルから:
  • pingが成功するといいえ 受け取る どの返信するデータパックとにかく終了しますコード1
  • パケットの場合計算そして締め切り指定され、最終期限に達するまで受信されたパケット数より少なくても終了します。コード1。存在するその他のエラー、終了したときコード2.例:
    • 1を数えて2秒待ちますしかし、2番目の2つはまだありません。それからエラーが発生したため終了
  • それ以外の場合は終了します。コード0。 [いいね]

これにより、次のことが可能になります。終了コード確認してください所有者はい生きるまたはいいえ

答え2

pingMacのように動作しようとするいくつかの回避策がありますが、ping -o次のコマンドがあります。fpingまさにそれを行い、スクリプトと複数のターゲットに同時に使用するように設計されています。 ~から手動:

[...]

デフォルトモードでは、宛先が応答すると記録され、宛先リストから削除され確認されます。ターゲットが特定の時間制限および/または再試行制限内に応答しない場合、到達不能として指定されます。

[...]

例:

$ time fping example.com
example.com is alive

real    0m0.074s
user    0m0.000s
sys 0m0.004s
$ echo $?
0

$ fping 192.0.2.3 127.0.0.1
ICMP Host Unreachable from 203.0.113.1 for ICMP Echo sent to 192.0.2.3
127.0.0.1 is alive
ICMP Host Unreachable from 203.0.113.1 for ICMP Echo sent to 192.0.2.3
ICMP Host Unreachable from 203.0.113.1 for ICMP Echo sent to 192.0.2.3
192.0.2.3 is unreachable
$ echo $?
1
$ fping -q 192.0.2.3
$ echo $?
1

答え3

私自身の研究を行い、ここにある他の2つの答えを検討した後、次の結論に達しました。Linux には、MacOS に存在するコマンドとping -o同じコマンドはありません。どちらもありませんping -c 1 ...でもない fping同じ行動をします。最善の方法は、これらの関数の戻りコードがpingが成功したことを示す戻りfpingループでまたはを使用してその動作をシミュレートすることです。ping0

私がここにコメントしたように:

テスト後、fping次のように言うことができます。fping 192.168.0.1動作は、ネットワークがオフにping -c 4 -W 1 192.168.0.1なっているときと同じで、ネットワークがオンにping -c 1 192.168.0.1なっているときと同じです。fpingネットワークが稼働している場合はすぐに返され、ネットワークが停止した場合は4回試行し(初期試行1回+再試行3回、各試行後タイムアウト1秒)、4回タイムアウト=合計4秒後に返されます。ping -oネットワークが稼働している場合はすぐに返されますが、永久に繰り返されます。インターネットが登場するまで、ネットワークに障害が発生した場合に返されます。

だから、使用お疲れ様です、これが私の答えです。このフォームはCtrl+ CKillシグナルをキャプチャして無限ループを強制終了し、実行時whileにIPアドレスのパラメータを入力し、IPアドレスがアクティブになったときに試行回数とメッセージを印刷します。

ping_loop.sh:

#!/bin/bash

IP_ADDR="$1"
if [ -z $IP_ADDR ]; then
    echo "You must enter the IP Address as the first parameter!"
    exit 1
fi

# to enable Ctrl + C inside the infinite while loop
trap 'printf "%s\n" "Ctr + C"; exit 2' SIGINT
count=0
while true; do
    echo "Attempt: $count"
    ((count++))
    ping -c 1 -W 5 "$IP_ADDR"
    return_code=$?
    if [ $return_code -eq 0 ]; then
        echo "== DEVICE AT IP '$IP_ADDR' IS ALIVE! =="
        break;
    fi
done

次のように実行可能ファイルを作成してchmod +x ping_loop.sh「インストール」します。

  1. ~/binどこでも実行できるように、このスクリプトにシンボリックリンクを作成します。
    cd /path/to/here
    mkdir -p ~/bin
    ln -si "${PWD}/ping_loop.sh" ~/bin/gs_ping_loop
    ln -si "${PWD}/ping_loop.sh" ~/bin/ping_loop
    
  2. これで、どこでも直接またはコマンドを使用できますping_loop。 Ubuntuを使用して初めて作成する場合は、ファイルが自動的にパスに追加されるため、ログアウトしてgs_ping_loop再度~/binログインする必要があります。PATH~/bin~/.profile

テストしてみてください:

ping_loop 10.0.0.1

これで、テストのためにそのIPアドレスを強制的に変更する方法についての他の答えをここで読むことができますping特定のIPアドレスからイーサネットインターフェイスを作成してpingを送信し、時には応答し、時には応答しないようにするにはどうすればよいですか?

1つの方法は次のとおりです。

# block traffic to 10.0.0.1
sudo iptables -I OUTPUT 1 -p icmp --icmp-type echo-request -d 10.0.0.1 -j DROP

# allow traffic to 10.0.0.1 
# NB: you must run this as many times as you ran the cmd above in order to 
# allow traffic. So, if you ran the cmd above an unknown number of times,
# run this command as many times as it takes until you see:
#
#         iptables: Bad rule (does a matching rule exist in that chain?).
#
sudo iptables -D OUTPUT -p icmp --icmp-type echo-request -d 10.0.0.1 -j DROP

サンプル出力。まず、上記のコマンドを使用してトラフィックをブロックし、次に上記の他のコマンドを使用してトラフィックのブロックを解除してトラフィックが通過し、スクリプトが終了するようにpingしました。== DEVICE AT IP '10.0.0.1' IS ALIVE! ==最後に印刷された内容を見ることができます。

$ gs_ping_loop 10.0.0.1
Attempt: 0
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
ping: sendmsg: Operation not permitted

--- 10.0.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

Attempt: 1
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
ping: sendmsg: Operation not permitted

--- 10.0.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

Attempt: 2
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
ping: sendmsg: Operation not permitted

--- 10.0.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

Attempt: 3
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
ping: sendmsg: Operation not permitted

--- 10.0.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

Attempt: 4
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=4.20 ms

--- 10.0.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 4.204/4.204/4.204/0.000 ms
== DEVICE AT IP '10.0.0.1' IS ALIVE! ==

これは私の最終形態です。ping_loop.sh私のeRCAGuy_dotファイル買戻契約:https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/blob/master/useful_scripts/ping_loop.sh<-- このコードの最新バージョンをアーカイブする場所です!

また見なさい:

  1. 以下は、IPアドレスの「pingの可能性」をオン/オフする方法に対する私の答えを含む3つの答えです。これにより、ping_loop上記のスクリプトをテストできます。特定のIPアドレスからイーサネットインターフェイスを作成してpingを送信し、時には応答し、時には応答しないようにするにはどうすればよいですか?

関連情報