Em Python, existe uma maneira de executar ping em um servidor através do ICMP e retornar VERDADEIRO se o servidor responder, ou FALSO se não houver resposta?
python
python-3.x
ping
icmp
Kudu
fonte
fonte
Respostas:
Essa função funciona em qualquer sistema operacional (Unix, Linux, macOS e Windows)
Python 2 e Python 3
EDITS:
Por @radato
os.system
foi substituído porsubprocess.call
. Isso evita a vulnerabilidade de injeção de shell nos casos em que a string do nome do host pode não ser validada.Observe que, de acordo com o @ikrase no Windows, essa função ainda retornará
True
se você receber umDestination Host Unreachable
erro.Explicação
O comando está
ping
nos sistemas Windows e Unix.A opção
-n
(Windows) ou-c
(Unix) controla o número de pacotes que neste exemplo foram definidos como 1.platform.system()
retorna o nome da plataforma. Ex.'Darwin'
no macOS.subprocess.call()
realiza uma chamada do sistema. Ex.subprocess.call(['ls','-l'])
.fonte
ping 8.8.8.8 -n 1
3)echo %ERRORLEVEL%
. Código: modifique a última linha do código Python parareturn system_call(command)
. Com conectividade adequada, você receberá 0 (zero). Com o modem desligado, você deve obter algum código de erro. Obviamente, os dois métodos devem retornar o mesmo código de erro nas mesmas condições.Se você não precisa oferecer suporte ao Windows, aqui está uma maneira realmente concisa de fazê-lo:
Isso funciona porque o ping retorna um valor diferente de zero se a conexão falhar. (O valor de retorno realmente difere dependendo do erro de rede.) Você também pode alterar o tempo limite do ping (em segundos) usando a opção '-t'. Observe que isso produzirá texto para o console.
fonte
response = os.system("ping -c 1 -w2 " + hostname + " > /dev/null 2>&1")
man ping
para ter certeza.hostname
string de um usuário, ele poderá facilmente invadir seu servidor, fornecendo a você um "URL"'google.com; rm -rf /*'
. Use emsubprocess.run(["ping", "-c", "1", hostname]).returncode
vez disso.Existe um módulo chamado pyping que pode fazer isso. Pode ser instalado com pip
É bastante simples de usar, no entanto, ao usar este módulo, você precisa de acesso root, pois ele está criando pacotes brutos sob o capô.
fonte
os.system('ping -c 1 -t 1 hostname')
solução. Além disso, apyping
lib é muito fácil de usar em comparação com o uso da biblioteca de soquetes TCP / IP. Escrevi meu programa de ping usando os dois epyping
, na minha opinião, é muito mais rápido e fácil de usar, especialmente se não estiver familiarizado com o uso da biblioteca de soquetes TCP / IP.pip install ping3
fonte
whereis ping
para obter o caminho correto.ping_response = subprocess.Popen(["ping", hostname, "-n", '1'], stdout=subprocess.PIPE).stdout.read()
Para python3, existe um módulo python muito simples e conveniente, ping3 : (
pip install ping3
, precisa de privilégios de root ).Este módulo também permite a personalização de alguns parâmetros.
fonte
Como eu gosto de ter meu programa Python universal nas versões 2.7 e 3.xe na plataforma Linux, Mac OS e Windows, tive que modificar os exemplos existentes.
fonte
False if platform.system().lower()=="windows" else True
você, é claro, também pode usarplatform.system().lower() != "windows"
.os.name!="nt"
Também não funciona? É certo que eu não tentei em todos os combos ver / plataforma!def ping(host): process = subprocess.Popen(["ping", "-n", "1",host], stdout=subprocess.PIPE, stderr=subprocess.PIPE) streamdata = process.communicate()[0] if 'unreachable' in str(streamdata): return 1 return process.returncode
unreachable
for encontrado no pipe, não?Depois de olhar em volta, acabei escrevendo meu próprio módulo de ping, projetado para monitorar um grande número de endereços, é assíncrono e não usa muitos recursos do sistema. Você pode encontrá-lo aqui: https://github.com/romana/multi-ping/ É licenciado pela Apache, para que você possa usá-lo em seu projeto da maneira que achar melhor.
As principais razões para implementar o meu próprio são as restrições das outras abordagens:
fonte
fonte
Verifique se o pyping está instalado ou instale-o pip install pyping
fonte
O ping programático do ICMP é complicado devido aos privilégios elevados necessários para o envio de pacotes ICMP brutos, e a chamada de
ping
binário é feia. Para monitoramento do servidor, você pode obter o mesmo resultado usando uma técnica chamada TCP ping :Internamente, isso simplesmente estabelece uma conexão TCP com o servidor de destino e a elimina imediatamente, medindo o tempo decorrido. Essa implementação em particular é um pouco limitada, pois não lida com portas fechadas, mas para seus próprios servidores funciona muito bem.
fonte
fonte
Eu resolvo isso com:
"TTL" é a maneira de saber se o ping está correto. Saludos
fonte
Minha redução usando idéias de respostas neste post, mas apenas usando o módulo de subprocesso recomendado mais recente e python3:
fonte
True if condition else False
para retornar True ou False com base em uma condição. Basta usar egshell_needed = operating_sys == 'Windows'
ereturn success == 0
Este script funciona no Windows e deve funcionar em outros sistemas operacionais: Ele funciona no Windows, Debian e macosx, precisa de um teste no solaris.
fonte
Acabei encontrando essa pergunta em um cenário semelhante. Eu experimentei o pyping, mas o exemplo dado por Naveen não funcionou para mim no Windows no Python 2.7.
Um exemplo que funcionou para mim é:
fonte
pyping
não parece ser um módulo padrão. Talvez você possa fornecer um link?Usando Multi-ping (
pip install multiPing
) eu criei este código simples ( basta copiar e colar, se você quiser! ):Uso:
Se você deseja uma única amostra, o segundo parâmetro "
10
" pode ser ignorado!Espero que ajude!
fonte
Minha versão de uma função ping:
Sinta-se livre para usá-lo como quiser.
fonte
Parece bastante simples, mas me deu ataques. Eu continuava recebendo "operação de soquete aberto icmp não permitida" ou as soluções seriam interrompidas se o servidor estivesse off-line. Se, no entanto, o que você deseja saber é que o servidor está ativo e você está executando um servidor Web nesse servidor, o curl fará o trabalho. Se você possui ssh e certificados, ssh e um comando simples serão suficientes. Aqui está o código:
fonte
Eu tinha requisitos semelhantes, então eu o implementei como mostrado abaixo. É testado no Windows 64 bits e Linux.
Quando o IP não está acessível, subprocess.check_output () gera uma exceção. Uma verificação extra pode ser feita extraindo informações da linha de saída 'Pacotes: Enviados = 2, Recebidos = 2, Perdidos = 0 (0% de perda)'.
fonte
Aqui está uma solução usando o
subprocess
módulo Python e aping
ferramenta CLI fornecida pelo sistema operacional subjacente. Testado no Windows e Linux. Suporte para definir um tempo limite de rede. Não precisa de privilégios de root (pelo menos no Windows e Linux).fonte
Use isso: ele é testado no python 2.7 e funciona bem; ele retorna o tempo de ping em milissegundos se for bem-sucedido e retornará False em caso de falha.
fonte
Uma coisa que muitas das respostas perdem é que (pelo menos no Windows) o
ping
comando retorna 0 (indicando êxito) se receber a resposta "Host de destino inacessível".Aqui está o meu código que verifica se
b'TTL='
está na resposta, uma vez que está presente apenas quando o ping chegou ao host. Nota: A maior parte desse código é baseada nas outras respostas aqui.Nota: Isso captura a saída em vez de imprimi-la; portanto, se você quiser ver a saída
ping
, precisará imprimircompletedPing.stdout
antes de retornar.fonte
APENAS PARA WINDOWS - Não é possível acreditar que ninguém abriu Win32_PingStatus Usando uma consulta WMI simples, retornamos um objeto cheio de informações realmente detalhadas gratuitamente
saída de amostra
fonte
Minha opinião é emprestada de outras respostas. Tente simplificar e minimizar as consultas.
fonte
Eu precisava de uma varredura de ping mais rápida e não queria usar nenhuma biblioteca externa, então resolvi usar a simultaneidade usando o built-in
asyncio
.Este código requer python 3.7+ e é feito e testado apenas no Linux . Não funcionará no Windows, mas tenho certeza de que você pode alterá-lo facilmente para funcionar no Windows.
Não sou especialista,
asyncio
mas usei este ótimo artigo Acelere seu programa Python com simultaneidade e criei essas linhas de códigos. Tentei torná-lo o mais simples possível, portanto é mais provável que você precise adicionar mais código para atender às suas necessidades.Não retorna verdadeiro ou falso, pensei que seria mais conveniente apenas imprimir o IP que responde a uma solicitação de ping. Eu acho que é bem rápido, pingando 255 ips em quase 10 segundos.
Saída de amostra:
Observe que os IPs não estão em ordem, pois o IP é impresso assim que responde, portanto, o que responder primeiro será impresso primeiro.
fonte
Um simples que acabei de preparar em um minuto ... usando o icmplib precisa de raiz privs, o abaixo funciona muito bem! HTH
fonte