![相当于 Linux 上的“ping -o”](https://linux22.com/image/198604/%E7%9B%B8%E5%BD%93%E4%BA%8E%20Linux%20%E4%B8%8A%E7%9A%84%E2%80%9Cping%20-o%E2%80%9D.png)
显然 MacOsping
有一个-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(成功,确定)。否则,您会在输入1
或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
- 尽管不是
!
活着,保持循环并始终以退出状态退出成功:
-W1
等待1秒
将其复制到名为的文件中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。
- 如果一个数据包数数和最后期限都指定了,并且在截止日期到达时收到的数据包少于 count 个,它也会退出代码1。在其他错误,它退出时代码2。例子:
- 数1并等待2秒但第二个 2 还没有到达,然后错误退出
- 否则,它退出代码0。 [ 好的 ]
这使得可以使用退出代码看看是否主持人是活或者不是。
答案2
可以有多种解决方法来尝试使ping
行为像 Mac 一样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
经过我自己的研究并回顾了这里的其他两个答案,我得出的结论是:Linux 上没有与ping -o
MacOS 上存在的命令等效的命令。两者都不ping -c 1
也不 fping
有相同的行为。您能做的最好的事情就是通过在循环中使用fping
或来模拟其行为ping
,一旦这些函数的返回代码为 ,该循环就会返回0
,表示 ping 成功。
经过测试
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
如果网络启动,将立即返回,但永远循环直到网络出现,如果网络出现故障,则返回。
所以,利用@AlexPixel 的出色工作,这是我的答案。此形式捕获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
.像这样“安装”它:
- 在此脚本中创建一个符号链接
~/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
- 现在您可以在任何地方直接使用
ping_loop
or命令。gs_ping_loop
这假设~/bin
在你的PATH
.如果使用 Ubuntu 并且这是第一次创建~/bin
,您可能需要注销并重新登录才能~/.profile
使文件生效,因为它会自动将该目录添加到您的路径中。
测试它:
ping_loop 10.0.0.1
现在,您可以在此处阅读其他答案,了解如何强制更改该 IP 地址以进行ping
测试:如何在特定 IP 地址创建以太网接口,我可以 ping 并强制有时回复有时不回复?。
一种方法是这样的:
# 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_dotfiles回购协议:https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/blob/master/useful_scripts/ping_loop.sh<-- 这是我保存此代码的最新版本的地方!
也可以看看:
- 这里有 3 个答案,包括我自己的,关于如何打开和关闭 IP 地址的“pingability”。这允许您测试
ping_loop
上面的脚本:如何在特定 IP 地址创建以太网接口,我可以 ping 并强制有时回复有时不回复?