AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 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

Equivalente a `ping -o` no Linux

  • 772

Aparentemente, o MacOs pingtem uma -oopção que significa "retornar assim que a primeira resposta bem-sucedida for recebida" ou algo assim. Consulte: https://stackoverflow.com/a/6119327/4561887 .

Existe um equivalente no Linux Ubuntu? Como podemos alcançar melhor o mesmo resultado?

Minha versão é ping utility, iputils-s20161105, conforme retornado por ping -V.

Atualização: encontrei a documentação do MacOs aqui: https://ss64.com/osx/ping.html

-o         Exit successfully after receiving one reply packet.
linux ping
  • 3 3 respostas
  • 761 Views

3 respostas

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

    Pode haver várias soluções alternativas para tentar fazer com que pingse comporte como o do Mac, ping -omas há o comando fpingque faz exatamente isso e deve ser usado em scripts e para vários destinos ao mesmo tempo. Do manual :

    [...]

    No modo padrão, se um alvo responder, ele será anotado e removido da lista de alvos a serem verificados; se um alvo não responder dentro de um determinado limite de tempo e/ou limite de tentativas, ele é designado como inalcançável.

    [...]

    Exemplos:

    $ 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
    Usando ping:
    ping -c 1 ping_address
    ping -c 1 192.168.1.68 #example
    
    • cargumento é para contar pacotes, então você só precisa 1disso -->-c 1

    • Se você tiver sucesso usando o comando $?(status de saída) imediatamente após usar o ping, deverá obter 0 (sucesso, OK). Caso contrário, você obtém 1ou 2digitando $?, ou seja, error .

    PING retorna a saída com:

    1 received, 0% packet loss--> sucesso echo $? retorno 0

    0 received, 100% packet loss--> falha echo $? retorna 1

    Para loop infinito e STOP quando o serviço estiver disponível, precisa ser pipe in while loop

    while ! ping -c1 -W1 192.168.1.68; :;done
    
    • enquanto NÃO estiver vivo, mantenha o loop e sempre saia com o status de saída bem- sucedido :
    • -W1é para esperar 1 segundo

    copie isso em um arquivo com o nomepingo

    #!/usr/bin/bash
    while ! ping -c1 -W1 "$1"; do
        : && echo "NOT ALIVE"
    done
    
    • :é um comando nulo ou sem efeito, o comando não faz nada ou sai do status sempre é bem-sucedido, neste caso, semelhante a digitar true. É um Bourne Shell embutido
    • o $1argumento significa [endereço de ping neste caso], exemplo pingo $1-> neste caso é um endereço numérico.pingo 192.168.1.68

    Isso significa --> criar uma pasta com name bin, dentro dessa pasta faça um arquivo com name pingoe permita a execução do arquivo como programa

    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
    
    • a /home/user/binpasta é o padrão para seus próprios programas e pode ser exec no terminal qualquer que seja, assim como ping

    É isso, agora você pode rodar pingocom qualquer endereço, assim como ping -o.

    Do manual do PING:
    • Se o ping não receber nenhum pacote de resposta , ele sairá com o código 1 .
    • Se uma contagem de pacotes e um prazo final forem especificados e menos do que a contagem de pacotes forem recebidos no momento em que o prazo chegar, ele também sairá com o código 1 . Em outro erro , ele sai com o código 2. Exemplo:
      • conte 1 e espere 2 segundos MAS nada chegou no segundo 2, ENTÃO saia com erro
    • Caso contrário, ele sai com o código 0 . [ OK ]

    Isso torna possível usar o código de saída para ver se um host está ativo ou não .

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

    Após meu próprio estudo, além de revisar as duas outras respostas aqui, concluí: não há equivalente no Linux ao ping -ocomando que existe no MacOS. Nem ping -c 1 nem fping têm o mesmo comportamento. O melhor que você pode fazer é emular seu comportamento usando fpingou pingem um loop que retorna assim que o código de retorno de qualquer uma dessas funções for 0, indicando um ping bem-sucedido.

    Como coloquei no meu comentário aqui :

    depois de testar fping, posso dizer o seguinte: fping 192.168.0.1se comporta como ping -c 4 -W 1 192.168.0.1quando a rede está inoperante e como ping -c 1 192.168.0.1quando a rede está ativa. fpingretorna imediatamente se a rede estiver ativa e tenta 4 vezes (1 tentativa inicial mais 3 tentativas, com um tempo limite de 1 segundo após cada tentativa) se a rede estiver inativa, retornando após 4 tempos limite = 4 segundos no total. ping -o retornaria imediatamente se a rede estivesse ativa, mas faria um loop para sempre até que a rede fosse ativada e, em seguida, retornaria, se a rede estivesse inativa.

    Então, aproveitando o bom trabalho de @AlexPixel , aqui está minha resposta. Este formulário captura o sinal Ctrl+ Ckill para permitir que você saia com força do whileloop infinito, garante que você insira um parâmetro para o endereço IP ao executá-lo e imprime uma contagem de tentativas e uma mensagem quando o endereço IP fica ativo.

    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
    

    Torne executável com chmod +x ping_loop.sh. "Instale" assim:

    1. Crie um link simbólico ~/binpara este script para que você possa executá-lo de qualquer lugar:
      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. Agora você pode usar o comando ping_loopou gs_ping_loopdiretamente em qualquer lugar que desejar. Isso pressupõe que ~/binestá em seu PATH. Se estiver usando o Ubuntu e esta for a primeira vez ~/binque cria , talvez seja necessário sair e fazer login novamente para que seu ~/.profilearquivo tenha efeito, pois ele adicionará automaticamente esse diretório ao seu caminho.

    Teste com:

    ping_loop 10.0.0.1
    

    Agora você pode ler essas outras respostas aqui para ver como forçar a ativação e desativação desse endereço IP para pingteste: Como criar uma interface Ethernet em um endereço IP específico que eu possa pingar e forçar a responder às vezes e às vezes não? .

    Uma abordagem é esta:

    # 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
    

    Saída de amostra. Comecei com o tráfego bloqueado através do comando acima e, em seguida, desbloqueei-o com o outro comando acima para pingpassar e permitir que o script terminasse. Você pode ver a == DEVICE AT IP '10.0.0.1' IS ALIVE! ==impressão no final.

    $ 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! ==
    

    Aqui está minha forma final de ping_loop.sh no meu repositório eRCaGuy_dotfiles : https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/blob/master/useful_scripts/ping_loop.sh <-- é aqui que vou manter as últimas e mais- versão atualizada deste código!

    Veja também:

    1. As 3 respostas aqui, incluindo a minha, sobre como ativar e desativar a "capacidade de ping" de um endereço IP. Isso permite que você teste o ping_loopscript acima: Como criar uma interface Ethernet em um endereço IP específico que eu possa fazer ping e forçar às vezes a responder e às vezes não?
    • 0

relate perguntas

  • Existe uma maneira de fazer ls mostrar arquivos ocultos apenas para determinados diretórios?

  • Inicie/pare o serviço systemd usando o atalho de teclado [fechado]

  • Necessidade de algumas chamadas de sistema

  • astyle não altera a formatação do arquivo de origem

  • Passe o sistema de arquivos raiz por rótulo para o kernel do Linux

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

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

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve