Varredura de PING Utilizando o Python
Uma varredura de PING, conhecida como varredura ICMP, é uma técnica muito utilizada na TI para o diagnóstico, determinando quais endereços IP estão em uso dentro de uma rede, sendo eles normalmente computadores ou servidores. Neste material, explico melhor o que é uma varredura de PING e disponibilizo um script em Python com essa finalidade.
[ Hits: 15.541 ]
Por: Diego Mendes Rodrigues em 09/11/2020 | Blog: https://www.linkedin.com/in/diegomendesrodrigues/
"""
Script para realizar a verificação se IPs, ou Hosts, estão respondendo através do utilitário PING.
O ping é um utilitário que usa o protocolo ICMP para testar a conectividade entre equipamentos, sendo
ele um comando disponível praticamente em todos os sistemas operacionais atuais
-
Diego Mendes Rodrigues
"""
import socket
from subprocess import Popen, DEVNULL
def verificar_rede(ips_da_rede='192.168.0.%d', inicial=1, final=254, exibir_apenas_ativos=True):
"""Verificar uma rede/subrede
:param ips_da_rede: IPs da rede, no formato '192.168.0.%d'
:param inicial: Número inicial da rede/subrede, exemplo = 1
:param final: Número final da rede/subrede, exemplo = 254
:param exibir_apenas_ativos: True caso sejam impressos no terminal apenas os IPs ativos via PING
:return: True caso os testes tenham sido realizados, False caso contrário
"""
# Validação
if len(ips_da_rede) <= 0 or inicial < 1 or final < 2 or final > 254 or not isinstance(exibir_apenas_ativos, bool):
print('Todos os parâmetros devem ser informados de forma correta')
return False
# ip -> processo
p = {}
# Realizando a varredura
for n in range(inicial, final + 1):
ip = ips_da_rede % n
p = Popen(['ping', '-n', '1', '-w', '5', ip], stdout=DEVNULL)
return __verificar(p, exibir_apenas_ativos)
def verificar_hosts(hosts_verificados, exibir_apenas_ativos=True):
"""Verificar os hosts ao invés de IPs, sendo que os hosts serão convertidos para IPs
:param hosts_verificados: Lista com os hosts que serão verificados, exemplo = ['www.debian.org', 'www.ubuntu.com']
:param exibir_apenas_ativos: True caso sejam impressos no terminal apenas os IPs dos hosts ativos via PING
:return: True caso os testes tenham sido realizados, False caso contrário
"""
# Validação
if len(hosts_verificados) <= 0 or not isinstance(exibir_apenas_ativos, bool):
print('Todos os parâmetros devem ser informados de forma correta')
return False
ips =
for host in hosts_verificados:
try:
ip_do_host = socket.gethostbyname(host)
ips.append(ip_do_host)
except Exception as e:
ips.append(f'Erro ao resolver o IP do host \'{host}\': {e}')
pass
# ip -> processo
p = {}
for ip in ips:
if ip != 'Erro':
p = Popen(['ping', '-n', '1', '-w', '5', ip], stdout=DEVNULL)
else:
print(f'{ip}')
return __verificar(p, exibir_apenas_ativos)
def __verificar(p_itens, exibir_apenas_ativos=True):
"""Função Interna que realiza a verificação dos IPs utilizando o PING
:param p_itens: Itens que serão verificados
:param exibir_apenas_ativos: exibir_apenas_ativos: True caso sejam impressos no terminal apenas os IPs ativos
:return: True caso os testes tenham sido realizados, False caso contrário
"""
# Validação
if len(p_itens) <= 0 or not isinstance(exibir_apenas_ativos, bool):
print('Todos os parâmetros devem ser informados de forma correta')
return False
while p_itens:
for ip, proc in p_itens.items():
if proc.poll() is not None:
del p_itens
if proc.returncode == 0:
print('%s ativo' % ip)
elif proc.returncode == 1:
if not exibir_apenas_ativos:
print('%s sem resposta' % ip)
else:
print('%s erro' % ip)
break
return True
def main():
"""Função principal da aplicação que realiza a verificação dos IPs/Hosts utilizando o PING
"""
# Verificar a rede 192.168.0.0/24
print('VERIFICAR A REDE 192.168.0.0/24')
if not verificar_rede('192.168.0.%d', 1, 254, True):
print('Falha ao verificar a rede 192.168.0.0/24')
# Verificar diversos hosts
print('\nVERIFICAR DIVERSOS HOSTS')
hosts_para_verificar = ['www.debian.org',
'www.ubuntu.com',
'www.vivaolinux.com.br',
'urlerrada.io']
if not verificar_hosts(hosts_para_verificar, True):
print('Falha ao verificar os hosts')
if __name__ == "__main__":
"""Execução automática pelo terminal
"""
main()
MultiCD - Diversas Distribuições no mesmo DVD/Pendrive
Nmap - Escaneando sua Rede e Mantendo-a Segura
Instalar um LAMP com boa performance
Instalar o TeamViewer no Ubuntu/Debian
Como baixar vídeos do Facebook via terminal
RapidScan - Multi-Tool WEB Vulnerability Scanner
ISO8583py - Utilizando Python para o tratamento de mensagens ISO8583
Esteganografia e Esteganálise: transmissão e detecção de informações ocultas em imagens digitais
SynapSeq - programa para estimular as ondas cerebrais
Por que seu __DIR__ falhou ou o "inferno" dos caminhos no PHP
Preparando-se para certificações da LPI através do LPI Lab
Migração de Arch Linux para repositórios CachyOS (Uso de Instruções v3 e v4)
Jogando "Magic" gratuitamente no Linux
Zoxide e fzf no bash para incrementar o uso do Terminal
As diferencas entre o clipboard comum e a selecao ativa
Arch Linux com repos do CachyOS para otimização ou usar Gentoo?
O que você está ouvindo agora? [2] (243)
Abrir um arquivo URL pelo Clipper (7)
Eu aprendi o segredo das artes! hahaha (0)









