Listar as máquinas/dispositivos online em determinada rede
Dica publicada em Linux / Comandos
Listar as máquinas/dispositivos online em determinada rede
Vou apresentar uma sequência de comandos à la administrador de sistemas raiz para listar todas as máquinas ou dispositivos online em determinada rede.
Como exemplo vou usar minha rede interna, que vai de 192.168.0.1 até 192.168.0.255:
echo 192.168.0.{1..255} | xargs -n1 -P0 ping -c1 | grep "bytes from" | sed -se 's/^.* from \([0-9\.]*\):.*$/\1/' | sort -V
Onde:
echo 192.168.0.{1..255}
Imprime de 192.168.0.1 até 192.168.0.255.
xargs -n1 -P0 ping -c1
O argumento -n1 diz que é para executar um comando para cada argumento. Como estou passando 255 argumentos via pipe, o xargs irá disparar 255 comandos ping, um para cada argumento. Você pode trocar o "1" pelo número que quiser, mas no caso do ping não irá funcionar.
E o argumento -P indica que execução paralela. Se eu quiser executar 3 pings por vez, a sintaxe seria -P3. Em nosso exemplo estamos usando -P0, que indica ao xargs para paralelizar quantos "ping" o sistema operacional permitir.
Por fim, temos a execução do comando "ping -c1 IP", que dispensa explicação... ou "man ping" se não entendeu né minha filha! rsrs
grep "bytes from"
Filtrar a saída do ping apenas pela linha de resposta, a que contém o seguinte formato:
64 bytes from xxx (xxx): icmp_seq=1 ttl=53 time=14.7 ms
Logo, se o IP informado estiver offline, o grep acima irá retornar vazio.
sed -se 's/^.* from \([0-9\.]*\):.*$/\1/'
Lembram da linha acima filtrada pelo grep? Este sed extrai o endereço IP que está entre parêntesis.
sort -V
Ordenar por versão. Um número de IP é similar a um número de versão. O sort consegue identificar isso e ordenar corretamente.
Por exemplo, em um sort normal teríamos:
192.168.0.1
192.168.0.10
192.168.0.14
192.168.0.2
192.168.0.3
Já em um "sort -V":
192.168.0.1
192.168.0.2
192.168.0.3
192.168.0.10
192.168.0.14
NOTA: eu sei, é possível fazer isso de forma bem mais simples utilizando o nmap, mas aí eu não teria a oportunidade de explicar o recurso de multi-threads do xargs por exemplo... já conhecia ele? :)
Como exemplo vou usar minha rede interna, que vai de 192.168.0.1 até 192.168.0.255:
echo 192.168.0.{1..255} | xargs -n1 -P0 ping -c1 | grep "bytes from" | sed -se 's/^.* from \([0-9\.]*\):.*$/\1/' | sort -V
Onde:
echo 192.168.0.{1..255}
Imprime de 192.168.0.1 até 192.168.0.255.
xargs -n1 -P0 ping -c1
O argumento -n1 diz que é para executar um comando para cada argumento. Como estou passando 255 argumentos via pipe, o xargs irá disparar 255 comandos ping, um para cada argumento. Você pode trocar o "1" pelo número que quiser, mas no caso do ping não irá funcionar.
E o argumento -P indica que execução paralela. Se eu quiser executar 3 pings por vez, a sintaxe seria -P3. Em nosso exemplo estamos usando -P0, que indica ao xargs para paralelizar quantos "ping" o sistema operacional permitir.
Por fim, temos a execução do comando "ping -c1 IP", que dispensa explicação... ou "man ping" se não entendeu né minha filha! rsrs
grep "bytes from"
Filtrar a saída do ping apenas pela linha de resposta, a que contém o seguinte formato:
64 bytes from xxx (xxx): icmp_seq=1 ttl=53 time=14.7 ms
Logo, se o IP informado estiver offline, o grep acima irá retornar vazio.
sed -se 's/^.* from \([0-9\.]*\):.*$/\1/'
Lembram da linha acima filtrada pelo grep? Este sed extrai o endereço IP que está entre parêntesis.
sort -V
Ordenar por versão. Um número de IP é similar a um número de versão. O sort consegue identificar isso e ordenar corretamente.
Por exemplo, em um sort normal teríamos:
192.168.0.1
192.168.0.10
192.168.0.14
192.168.0.2
192.168.0.3
Já em um "sort -V":
192.168.0.1
192.168.0.2
192.168.0.3
192.168.0.10
192.168.0.14
NOTA: eu sei, é possível fazer isso de forma bem mais simples utilizando o nmap, mas aí eu não teria a oportunidade de explicar o recurso de multi-threads do xargs por exemplo... já conhecia ele? :)
Bem legal.
___________________________________
Conhecimento não se Leva para o Túmulo.