HOWTO · Python
Python Ping
Este tutorial demonstra como executar ping em um servidor em Python
Nesta página
Para verificar se um host responde a solicitações ICMP echo a partir do Python, execute o comando ping do sistema operacional com subprocess.call() ou os.system(), ou use a função ping3.ping(). Uma resposta pode indicar que o host está acessível e fornecer o tempo de ida e volta, mas não comprova que um aplicativo ou serviço específico esteja disponível. Os resultados também dependem do sistema operacional, das ferramentas instaladas, das regras do firewall e das políticas da rede.
Como testar o ping de um servidor em Python com subprocess.call()
subprocess.call() executa um programa e retorna o código de saída do processo. Passar o comando como uma lista evita montar um comando de shell a partir do texto do host. A opção que define a quantidade de pacotes varia conforme a plataforma: implementações comuns de ping usam -n no Windows e -c em sistemas semelhantes ao Unix.
import platform
import shutil
import subprocess
def ping_host(host):
ping = shutil.which("ping")
if ping is None:
return None # The ping program is not installed or on PATH.
count_option = "-n" if platform.system() == "Windows" else "-c"
try:
status = subprocess.call(
[ping, count_option, "1", host],
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL,
timeout=5,
)
except (OSError, subprocess.TimeoutExpired):
return None
return status == 0
result = ping_host("example.com")
if result is None:
print("ping is unavailable")
else:
print("host responded" if result else "no successful response")
Saída observada no ambiente de execução fornecido:
ping is unavailable
Como mostra a saída fornecida, o ambiente de execução não tinha ping disponível. O bloco de saída está preservado em inglês, sem alterações. Em um ambiente onde o programa esteja instalado, este exemplo também exige acesso à rede. A saída do comando é suprimida, e a função retorna True quando o processo termina com código zero, False quando termina com um código diferente de zero, ou None quando o programa não está disponível ou ocorre um tempo limite. Um código diferente de zero não revela se a causa foi perda de pacotes, filtragem, resolução de nomes ou outra condição específica do sistema. Ajuste o host e a opção de quantidade de pacotes ao seu ambiente.
Como testar o ping de um servidor em Python com os.system()
os.system() executa uma cadeia de comando por meio de um shell e retorna um status codificado pela plataforma. É menos flexível que subprocess.call(), e concatenar texto de host não confiável ao comando pode permitir injeção de shell. Para valores que possam vir de usuários, prefira passar uma lista de argumentos com subprocess.call(). Se usar os.system() com um host fixo e confiável, escolha a opção de quantidade de pacotes adequada à plataforma atual:
import os
import platform
import shutil
host = "example.com" # Keep this fixed or validate it before use.
ping = shutil.which("ping")
if ping is None:
print("ping is unavailable")
else:
count_option = "-n" if platform.system() == "Windows" else "-c"
status = os.system(f'"{ping}" {count_option} 1 {host} > "{os.devnull}" 2>&1')
print("host responded" if status == 0 else "no successful response")
Saída observada no ambiente de execução fornecido:
ping is unavailable
Como mostra a saída fornecida, o ambiente de execução não tinha ping disponível. O bloco de saída está preservado em inglês, sem alterações. Quando o programa está disponível, este exemplo depende do shell local, da implementação de ping e da rede. Colocar o caminho do executável entre aspas resolve problemas com espaços nesse caminho, mas cadeias de comando de shell ainda exigem cuidado; não substitua host por dados arbitrários fornecidos pelo usuário. O status indica o resultado do comando executado pelo shell, não se um serviço, como um servidor web, está aceitando conexões.
Como testar o ping de um servidor em Python com ping3.ping()
A terceira opção é a função ping3.ping(), que envia uma solicitação ICMP echo sem executar o comando ping do sistema. Instale o pacote ping3 no ambiente Python usado pelo seu script com python -m pip install ping3. Dependendo do sistema operacional e das permissões, o envio de pacotes ICMP pode exigir privilégios adicionais.
try:
from ping3 import ping
except ImportError:
print("Install ping3 with: python -m pip install ping3")
else:
host = "example.com"
response = ping(host)
if response is None or response is False:
print("no response reported")
else:
print(f"round-trip time: {response} seconds")
Saída observada no ambiente de execução fornecido:
Install ping3 with: python -m pip install ping3
Como mostra a saída fornecida, ping3 não estava instalado no ambiente de execução. O bloco de saída está preservado em inglês, sem alterações. Depois de instalá-lo, este exemplo também exige permissões adequadas para ICMP e acesso à rede. Uma resposta numérica representa o tempo de ida e volta em segundos. Interprete a falta de resposta de acordo com o comportamento da biblioteca instalada e do ambiente; não suponha que ela diferencie um host inacessível de pacotes filtrados ou perdidos.
Escolha subprocess.call() quando quiser passar argumentos com segurança e usar o utilitário ping já disponível no sistema. os.system() é uma opção mais curta, baseada em shell, para um comando fixo e confiável. ping3.ping() mantém a chamada em Python e pode retornar informações de tempo, mas exige instalar um pacote e considerar as permissões necessárias. Nos três casos, o ping testa apenas a acessibilidade por ICMP; para saber se um serviço específico está funcionando, faça uma verificação no nível da aplicação.