Como posso executar ping em vários endereços IP ao mesmo tempo?

22

Estou ciente dos métodos em que você pode executar um forloop Bash e pingvários servidores. Existe uma ferramenta Linux CLI que eu possa usar que me permita fazer isso sem precisar recorrer à gravação de um script Bash em pinguma lista de servidores um por vez?

Algo assim:

$ ping host1 host2 host3

NOTA: Estou procurando especificamente pelo CentOS / Fedora, mas se ele funcionar em outras distros, tudo bem também.

slm
fonte
8
Por que você é contra um pequeno script de uma linha fazendo isso - a beleza e a filosofia do Linux ;-)? (Tenha programas pequenos e simples e escreva a cola para necessidades especiais.)
Peter - Restabelece Monica
1
É muito mais fácil instalar um pacote de um repositório vs. copiar um script para mais de 2000 VMs 8-). Eu poderia escrever facilmente uma solução de script para mim. Além disso, desde que eu respondi a isso automaticamente, estou criando conteúdo na Internet, pois tenho usuários que solicitam um único cmd x um script de shell e não conseguiram encontrar um A'er simples para o que eles consideram um Q básico.
slm
3
Se sua intenção é fazer um ping múltiplo a partir de mais de 2000 VMs, ... ainda posso coçar a cabeça
Hagen von Eitzen
@HagenvonEitzen - não, estou instalando ferramentas em mais de 2000 VMs para que os usuários tenham ferramentas disponíveis para isso.
slm
1
Por que você precisaria disso?
Tvde1 17/06

Respostas:

32

Se você olhar para o projeto NMAP, verá que ele inclui ferramentas adicionais nmap. Uma dessas ferramentas é a npingque inclui a seguinte capacidade:

O Nping possui uma interface de linha de comando muito flexível e poderosa que concede aos usuários controle total sobre os pacotes gerados. Os recursos de Nping incluem:

  • Geração personalizada de pacotes TCP, UDP, ICMP e ARP.
  • Suporte para várias especificações de host de destino.
  • Suporte para especificação de várias portas de destino.
  • ...

nping está nos repositórios EPEL padrão para inicializar.

$ repoquery -qlf nmap.x86_64 | grep nping
/usr/bin/nping
/usr/share/man/man1/nping.1.gz

Uso

Para executar ping em vários servidores, basta informar npingos nomes / IPs e qual protocolo você deseja usar. Aqui, como queremos imitar o que a pingCLI tradicional faz, usaremos o ICMP.

$ sudo nping -c 2 --icmp scanme.nmap.org google.com

Starting Nping 0.7.70 ( https://nmap.org/nping ) at 2019-06-14 13:43 EDT
SENT (0.0088s) ICMP [10.3.144.95 > 45.33.32.156 Echo request (type=8/code=0) id=42074 seq=1] IP [ttl=64 id=57921 iplen=28 ]
RCVD (0.0950s) ICMP [45.33.32.156 > 10.3.144.95 Echo reply (type=0/code=0) id=42074 seq=1] IP [ttl=46 id=24195 iplen=28 ]
SENT (1.0091s) ICMP [10.3.144.95 > 45.33.32.156 Echo request (type=8/code=0) id=42074 seq=2] IP [ttl=64 id=57921 iplen=28 ]
SENT (2.0105s) ICMP [10.3.144.95 > 45.33.32.156 Echo request (type=8/code=0) id=42074 seq=2] IP [ttl=64 id=57921 iplen=28 ]
RCVD (2.0107s) ICMP [45.33.32.156 > 10.3.144.95 Echo reply (type=0/code=0) id=42074 seq=2] IP [ttl=46 id=24465 iplen=28 ]
SENT (3.0138s) ICMP [10.3.144.95 > 64.233.177.100 Echo request (type=8/code=0) id=49169 seq=2] IP [ttl=64 id=57921 iplen=28 ]

Statistics for host scanme.nmap.org (45.33.32.156):
 |  Probes Sent: 2 | Rcvd: 2 | Lost: 0  (0.00%)
 |_ Max rtt: 86.053ms | Min rtt: 0.188ms | Avg rtt: 43.120ms
Statistics for host google.com (64.233.177.100):
 |  Probes Sent: 2 | Rcvd: 0 | Lost: 2  (100.00%)
 |_ Max rtt: N/A | Min rtt: N/A | Avg rtt: N/A
Raw packets sent: 4 (112B) | Rcvd: 2 (108B) | Lost: 2 (50.00%)
Nping done: 2 IP addresses pinged in 3.01 seconds

A única desvantagem que encontrei com esta ferramenta é o uso do modo ICMP que requer privilégios de root.

$ nping -c 2 --icmp scanme.nmap.org google.com
Mode ICMP requires root privileges.
slm
fonte
3
O que há com essa saída? As estatísticas dizem que ele enviou 2 para cada host, mas a saída anterior mostra que ele enviou 3 para scanme.nmap.org (45.33.32.156) e 1 para google.com (64.233.177.100). Isso acontece comigo também quando eu o executo.
JoL 15/06
4
Encontra-se ... (é claro, pois é inconsistente consigo mesmo). Ao executá-lo com strace, posso vê-lo enviando um ping para google.com, mas exibindo uma linha dizendo que o enviou para scanme.nmap.org. Bug interessante. Nem sempre acontece, no entanto.
JoL 15/06
nmaptambém suporta ICMP diretamente pela opção de especificar -sn. Veja minha resposta para detalhes.
scai 17/06
@scai - obrigado pelo seu A'er. Eu encontrei esse também enquanto pesquisava isso. Achei minha abordagem a mais limpa.
slm
1
'A única desvantagem que encontrei com esta ferramenta é o uso do modo ICMP que requer privilégios de root.' Sim, isso é uma coisa interessante, mas tem a ver com recursos (pelo menos no Linux; você também pode executar o setuid exec para root). Não que eu recomendo usar setcap ou dando-lhe setuid ....
Pryftan
18

O fping está em um pacote Fedora com o mesmo nome e permite muitos hosts ou um conjunto de endereços IP.

$ fping -a -A -c 1 hosta hostb
192.168.0.20 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 0.64/0.64/0.64
192.168.1.3  : xmt/rcv/%loss = 1/1/0%, min/avg/max = 0.50/0.50/0.50

O fping enviará um pacote de ping e passará para o próximo destino de maneira alternada ... se um destino responder, ele será anotado e removido da lista

meuh
fonte
9
oping host1 host2 host3

Descrição:

O oping usa pacotes ICMP (mais conhecidos como "pacotes de ping") para testar a acessibilidade dos hosts de rede. Ele suporta ping de vários hosts em paralelo usando IPv4 e / ou IPv6 de forma transparente.

Este pacote contém dois aplicativos de linha de comando: "oping" é um substituto para ferramentas como ping (1), ping6 (1) e fping (1). "noping" é uma ferramenta baseada em ncurses que exibe estatísticas durante o ping e destaca os tempos de ida e volta aberrantes.

GAD3R
fonte
Só para ser pedante: tecnicamente, o ICMP é para relatórios de erros em geral e existem muitos recursos diferentes. De fato, o ping usa os tipos de ICMP ECHO_REQUEST / ECHO_REPLY (8 para o ex-iirc, mas já faz muito tempo - e estou com preguiça de verificar). Talvez a descrição que você cita seja realmente para a opção em si, mas de qualquer forma não é estritamente correta (ou é muito mais simplificada do que deveria ser ... Ou talvez não, eu acho que para muitos provavelmente é melhor assim, mas não para mim de qualquer maneira) )
Pryftan 18/06
7

Eu sugeriria o uso do GNU Parallel

parallel -u ping ::: host1 host2 host3

a saída será intercalada

Diaa Sami
fonte
6

Eu sei que é especificamente não o que você está pedindo, mas um script para fazer isso:

#!/bin/bash

for host; do
    ping -c5 "$host" 2>&1 | tail -3 &
done

wait

Isso usará seus pontos de extremidade como argumentos de linha de comando e enviará um ping de 5 contagens para cada um como um processo em segundo plano e, em seguida, espere que todos terminem antes de sair. Ele imprimirá as três últimas linhas da saída do ping, que contém estatísticas úteis sobre a taxa de sucesso e a latência.

Jesse_b
fonte
3
Você não precisa se lembrar dos pids. Um simples waitaguardará todos os processos filhos ativos, para que você possa evitar o segundo loop. Acho que parte da razão pela qual foi solicitado que não fosse necessário escrever um script bash é ter uma solução que funcione em qualquer máquina sem ter que carregar ou escrever um script. Torná-lo curto parece mais favorável, por isso acho melhor evitar essa atribuição de argumentos e apenas fazê-lo for host; dono seu primeiro ciclo. Se isso fosse zsh, você poderia evitar o doe donee apenas fazer, interatively:for host in google.com; ping -c5 "$host" |& tail -3 & wait
JOL
4
Uma armadilha SIGINT tornaria esse script muito mais prático.
Gilles 'SO- stop be evil'
2
Para utilização interactiva, este é simplesmente utilizando o comando de fundo (ou seja command &) em uma subcamada (embrulho ou seja, com parênteses) e com waita combinar qualquer número de comandos para um comando artificial, por exemplo: (for f in google.com yahoo.com microsoft.com; do ping $f & done; wait). Suas saídas serão intercaladas e, quando você pressionar Ctrl + c após este comando, todos os três processos filhos serão eliminados. O shell possui muitas construções poderosas de controle de tarefas e esse é um deles.
Lie Ryan
2
Obrigado a todos. Sim, eu hesitava em publicá-lo, mas acho que as perguntas e respostas aqui não são apenas para OP, mas para todos que estão enfrentando um problema semelhante, e acho que haverá pessoas que tropeçarão nessa questão e não querem instalar software adicional para realizar a tarefa.
Jesse_b 15/06
@JoL Mas certamente essas ferramentas não são instaladas por padrão em todos os hosts. Isso não faz com que você diga falso, é claro, mas ...
Pryftan 18/06
2

Suponho que isso possa fazer por você?

eval $(printf 'ping "%s" & ' host1 host2 host3)

Ele tira proveito da printfcapacidade de "iterar automaticamente" seus argumentos enquanto reutiliza sua cadeia de caracteres de formato sobre cada argumento. O printfitem acima, portanto, produz uma sequência de seqüências de ping <hostname> &caracteres para cada host fornecido como argumento e alimenta essa sequência de comandos por meio da Substituição de Comando no evalcomando para executá-los imediatamente.

printfe evalcomandos são padrão POSIX, bem como substituição de comandos.

Incluindo todo esse comando em um subshell compreendendo um e-ed waitcomo este:

(eval $(printf 'ping "%s" & ' host1 host2 host3) && wait)

fornece a capacidade de interromper tudo à vontade com um simples Ctrl+C.

Caso contrário, você pode controlar cada pingcomando individualmente através do controle de trabalho usual do shell.

Se o seu shell também oferece suporte para Substituições de Processo, você também pode usar o seguinte:

. <(printf 'ping "%s" & ' host1 host2 host3)

por alguns caracteres a menos para digitar.

A essência é a mesma que para o eval, mas alimenta a sequência de pings para o comando .(aka source) através da Substituição de Processo.

LL3
fonte
2

O Nmap suporta varreduras de ping (ICMP) e vários hosts:

nmap -sn -n 127.0.0.1 8.8.8.8

Você também pode criar um arquivo contendo todos os seus IPs de destino (separados por espaços ou novas linhas) chamados targets.txt. Então corra:

nmap -sn -n -iL targets.txt

Opções explicadas:

  • -sn Ping Scan.
  • -n Desabilite a resolução DNS.
  • -iL Nome do arquivo de entrada.

Outras opções interessantes, caso você queira executar ping em um número muito grande de destinos:

  • -T4 Aumente o tempo para reduzir a duração da verificação.
  • --min-parallelism 100 Aumente o número de sondas paralelas.
  • -oG <file> Grave os resultados da verificação em um arquivo no formato Grepable.

Sem criar um arquivo

Lembre-se de que você também pode renunciar à criação de um arquivo e usar a -para receber entradas de um canal |ou através de métodos tradicionais para redirecionar a saída via STDIN.

Exemplos:

$ ( echo www.google.com; echo www.yahoo.com ) | sudo nmap -sn -n -iL -

-ou-

$ sudo nmap -sn -n -iL - < <(echo www.google.com; echo www.yahoo.com)

-ou-

$ sudo nmap -sn -n -iL - <<< $'www.google.com\nwww.yahoo.com'

Referências

scai
fonte
2

Usando o xargscomando comum para construir uma execução de várias pingsolicitações:

echo host1 host2 host3 | xargs -n1 -P0 ping -c 4

Onde host1 host2 host3pode haver um número variável de hosts (qualquer combinação de IP ou nome do host).

Isso altera os xargspadrões para forçar 1 argumento de entrada por execução de ping e permitir um número ilimitado de processos filhos paralelos (1 por host ping). Provavelmente, é aconselhável definir -P(também conhecido como --max-procs) um valor sensato se pretender executar ping em um grande número de hosts (todos serão processados; apenas menos simultaneamente).

É curto o suficiente para ser usado diretamente, pode ser adicionado como uma função ao seu perfil de shell ou arquivo rc ou transformado em um pequeno script no seu $PATH. Nos exemplos abaixo, -Pfoi definido como 10 para evitar o consumo excessivo de recursos.

Script de exemplo: /usr/bin/mping

#!/bin/sh

echo $@ | xargs -n1 -P10 ping -c4

Exemplo de função dentro ~/.bashrc

function mping() {
    echo $@ | xargs -n1 -P10 ping -c4
} 

E use como:

mping host1 host2 host3 ...
Jason Musgrove
fonte
1
Você pode considerar usar -w 2 para fazer o ping aguardar mais de 2 segundos. O padrão é 10 segundos, que é por invocação de ping, portanto, isso pode levar mais de 30 segundos para ser concluído.
Criggie 18/06
1
Sim, é uma boa ideia se você executar ping em mais hosts do que você configurou para --max-procs/ -P. No entanto, para contagens de host menores que -P, todos os pings estão sendo executados em paralelo - o que significa que levará o tempo da execução de ping mais longa, em vez da soma de todos.
Jason Musgrove
1

Não sei exatamente o que você deseja, mas você pode alterar o último conjunto de 8 bits para o decimal 255, para que seus hosts recebam uma transmissão; na verdade, ele transmitirá pacotes de ping para todos os dispositivos existentes em uma rede.

ping -c 1 xx.xx.xx.255
CriticalSYS
fonte
1
Não é isso que estou procurando.
slm
8
Bem-vindo ao site - Este é um bom pensamento e mostra uma compreensão do IP de broadcast e seu objetivo em uma rede IP, e está completamente correto. No entanto, ele não corresponde ao requisito específico do OP nesse caso estritamente definido. Por favor, continue e tenha uma rachadura ao responder a outras perguntas.
Criggie 16/06
0
ping google.com && ping localhost

Saída

Pinging google.com [xxxxxxx] with 32 bytes of data:
Reply from xxxxxxx: bytes=32 time=210ms TTL=49
Reply from ::1: time<1ms
Reply from xxxxxxx: bytes=32 time=212ms TTL=49
Reply from ::1: time<1ms
Reply from xxxxxxx: bytes=32 time=211ms TTL=49
Reply from ::1: time<1ms
Manish
fonte
O lado negativo disso é 1) que o &&operador apenas permite que o segundo comando seja executado se o primeiro comando for concluído com êxito (ou seja, um código de saída 0) E 2) o primeiro ping nunca terminará sem um ^ C para interrompê-lo. Considere adicionar um parâmetro -c e -w. Bem vindo ao site!
Criggie 18/06
-1

Apenas por diversão e lucro ...

#!/bin/sh -

# sends six "pings" to a list of hosts defined in "hosts" below

hosts="
host.a
host.b
host.c
host.d
host.e
"

for p in $hosts
do
# ONLY CHOOSE ONE OF THE FOLLOWING, NOT BOTH
# dump results to file
    ping -c 6 $p >>./PINGED
# dump output to console
    ping -c 6 $p
done

exit

Isso pode ser facilmente aprimorado. O que o torna bastante útil. :)

Para opções adicionais, consulte as páginas de manual para bsd ping e Linux ping

HTH

EDIT: ligeiramente atualizado para finalizar as consultas de ping @ 6 pings cada e adicionar opções da página de manual.

alguém
fonte
A primeira pingchamada nunca retorna, a menos que atinja um erro fatal.
Gilles 'SO- stop be evil'
Sério? Eu testei isso antes de publicá-lo aqui e funcionou como descrito. Você sabe que nem todo host responderá ao ping. Talvez os hosts que você consultou não estejam respondendo. Em qualquer caso. Em um esforço para fornecer um feedback mais rápido, limitei as consultas a 6 solicitações por host.
alguém
2
Agora, pelo menos, o script tem a chance de terminar na prática. Mas sem paralelismo, ainda é bastante inútil. Se o primeiro host responder, o usuário não receberá nenhuma informação sobre os outros hosts nos primeiros 5 segundos.
Gilles 'SO- stop be evil'
Bem, isso pretendia ser mais um exemplo a ser construído, conforme necessário. Eu poderia criar facilmente outro que sature totalmente o seu cachimbo. Mas é isso que você realmente quer? :)
alguém
1
O que eu deveria ter feito é criar um link para a página do manual ping. Honestamente. Eu apenas o criei como um modelo fácil para alguém modificar facilmente por seus próprios meios. o ping funciona drasticamente diferente em diferentes sistemas operacionais e sob inúmeras condições de rede nas quais cada indivíduo pode estar trabalhando. Portanto, não há padrão "perfeito" para todos. Cada um tem seu próprio "ponto ideal". :) Eu mencionei que funciona perfeitamente para mim? ;)
alguém
-2

Use abaixo o comando simples:

$ getip(){ ping -c 1 -t 1 $1 | head -1 | cut -d ' ' -f 3 | tr -d '()' 2>&1 | tee >> /tmp/result.log & }
$ getip 'hostname.number1.net'
$ getip 'hostname.number2.net'
$ getip 'hostname.number3.net'
$ getip 'hostname.number4.net'
$ getip 'hostname.number5.net'
$ getip 'hostname.number6.net'
$ getip 'hostname.number7.net'
$ getip 'hostname.number8.net'
$ cat /tmp/result.log
ABC.DEF.GHI.XY1
ABC.DEF.GHI.XY2
ABC.DEF.GHI.XY3
ABC.DEF.GHI.XY4
ABC.DEF.GHI.XY5
ABC.DEF.GHI.XY6
ABC.DEF.GHI.XY7
ABC.DEF.GHI.XY8
Kevin Li
fonte