AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 678045
Accepted
Gabriel Staples
Gabriel Staples
Asked: 2021-11-18 21:59:40 +0800 CST2021-11-18 21:59:40 +0800 CST 2021-11-18 21:59:40 +0800 CST

相当于 Linux 上的 ping -o

  • 772

显然,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.
linux ping
  • 3 3 个回答
  • 761 Views

3 个回答

  • Voted
  1. A.B
    2021-11-19T00:02:51+08:002021-11-19T00:02:51+08:00

    可以有各种变通方法来尝试使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
    
    • 4
  2. AlexPixel
    2021-11-19T10:04:57+08:002021-11-19T10:04:57+08:00
    使用 ping:
    ping -c 1 ping_address
    ping -c 1 192.168.1.68 #example
    
    • c参数用于计算数据包,所以你只需要1这就是为什么 -->-c 1

    • 如果您$?在使用 ping 后立即使用命令(退出状态)成功,您应该得到0(成功,OK)。否则,您会得到1或2来自输入$?,含义,错误。

    PING 返回输出:

    1 received, 0% packet loss-->成功 echo $?返回0

    0 received, 100% packet loss-->失败 echo $?返回1

    对于无限循环和服务可用时停止,需要在while循环中进行管道

    while ! ping -c1 -W1 192.168.1.68; :;done
    
    • while NOT alive 继续循环并始终以退出状态成功退出 :
    • -W1等待 1 秒

    将其复制到具有名称的文件中pingo

    #!/usr/bin/bash
    while ! ping -c1 -W1 "$1"; do
        : && echo "NOT ALIVE"
    done
    
    • :是 Null 命令或无效果,命令什么也不做或退出状态总是成功,在这种情况下,类似于键入 true。是 内置的 Bourne Shell
    • 意思是参数[在这种情况下是$1ping地址],例如pingo $1->在这种情况下是一个数字地址。pingo 192.168.1.68

    这意味着 --> 创建一个具有 name 的文件夹bin,在该文件夹中创建一个具有 name 的文件pingo并允许将文件作为程序执行

    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 秒没有到达,然后退出并出现错误
    • 否则,它以代码 0退出。[ 好的 ]

    这使得可以使用退出代码来查看主机是否处于活动状态。

    • 4
  3. Best Answer
    Gabriel Staples
    2021-11-19T16:16:12+08:002021-11-19T16:16:12+08:00

    在我自己的研究以及在这里查看其他两个答案之后,我得出结论:Linux 上没有与ping -oMacOS 上存在的命令等效的命令。两者都ping -c 1 没有 fping相同的行为。您可以做的最好的事情是通过使用fpingorping在循环中模拟其行为,一旦这些函数的返回码为 ,则返回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 1 "$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_looporgs_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! ==
    

    这是我的eRCaGuy_dotfiles 存储库中 ping_loop.sh的最终形式:https ://github.com/ElectricRCAaircraftGuy/eRCaGuy_dotfiles/blob/master/useful_scripts/ping_loop.sh此代码的最新版本!

    也可以看看:

    1. 这里有 3 个答案,包括我自己的,关于如何打开和关闭 IP 地址的“pingability”。这允许您测试ping_loop上面的脚本:如何在特定的 IP 地址创建以太网接口,我可以 ping 并强制有时回复,有时不回复?
    • 0

相关问题

  • 有没有办法让 ls 只显示某些目录的隐藏文件?

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

  • 需要一些系统调用

  • astyle 不会更改源文件格式

  • 通过标签将根文件系统传递给linux内核

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve