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.539 ]
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()
Alternativas ao Microsoft Visio para Linux
Gerar senhas seguras com Python
Instalando Nginx e PHP no Ubuntu
Instalando WPS Office no Debian, Linux Mint e Ubuntu
Linux Lite - Distribuição Leve baseada no Ubuntu
Qu1cksc0pe - All-in-One Static Malware Analysis Tool
Python - Usando requests anônimos através da rede Tor
Como isolar seus projetos Python com virtualenv (ambiente virtual)
Trabalhando com permutações em ordem lexicográfica crescente
Embutindo imagens nos scripts Python para aplicações Tkinter
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)









