En Python, ¿hay alguna forma de hacer ping a un servidor a través de ICMP y devolver VERDADERO si el servidor responde, o FALSO si no hay respuesta?
python
python-3.x
ping
icmp
Kudu
fuente
fuente
Respuestas:
Esta función funciona en cualquier sistema operativo (Unix, Linux, macOS y Windows)
Python 2 y Python 3
EDICIONES:
Por @radato
os.system
fue reemplazado porsubprocess.call
. Esto evita la vulnerabilidad de inyección de shell en los casos en que su cadena de nombre de host podría no estar validada.Tenga en cuenta que, según @ikrase en Windows, esta función seguirá regresando
True
si obtiene unDestination Host Unreachable
error.Explicación
El comando está
ping
en Windows y en sistemas similares a Unix.La opción
-n
(Windows) o-c
(Unix) controla la cantidad de paquetes que en este ejemplo se estableció en 1.platform.system()
devuelve el nombre de la plataforma. Ex.'Darwin'
en macOSsubprocess.call()
realiza una llamada al sistema. Ex.subprocess.call(['ls','-l'])
.fuente
ping 8.8.8.8 -n 1
3)echo %ERRORLEVEL%
. Código: modifique la última línea del código de Python areturn system_call(command)
. Con la conectividad adecuada obtendrá 0 (cero). Con su módem apagado, debe obtener un código de error. Por supuesto, ambos métodos deben devolver el mismo código de error en las mismas condiciones.Si no necesita admitir Windows, esta es una forma muy concisa de hacerlo:
Esto funciona porque ping devuelve un valor distinto de cero si falla la conexión. (El valor de retorno en realidad difiere según el error de la red). También puede cambiar el tiempo de espera de ping (en segundos) utilizando la opción '-t'. Tenga en cuenta que esto enviará texto a la consola.
fuente
response = os.system("ping -c 1 -w2 " + hostname + " > /dev/null 2>&1")
man ping
para asegurarse.hostname
cadena de un usuario, podría hackear fácilmente su servidor dándole un "url" como'google.com; rm -rf /*'
. Usar en susubprocess.run(["ping", "-c", "1", hostname]).returncode
lugar.Hay un módulo llamado pyping que puede hacer esto. Se puede instalar con pip
Es bastante simple de usar, sin embargo, al usar este módulo, necesita acceso a la raíz debido al hecho de que está creando paquetes sin procesar bajo el capó.
fuente
os.system('ping -c 1 -t 1 hostname')
solución. Además, lapyping
lib es muy fácil de usar en comparación con el uso de la biblioteca de sockets TCP / IP. Escribí mi programa de ping usando ambos, ypyping
es mucho más rápido y fácil de usar, en mi opinión, especialmente si uno no está familiarizado con el uso de la biblioteca de sockets TCP / IP.pip install ping3
fuente
whereis ping
para obtener el camino correcto.ping_response = subprocess.Popen(["ping", hostname, "-n", '1'], stdout=subprocess.PIPE).stdout.read()
Para python3 hay un módulo de python muy simple y conveniente ping3 : (
pip install ping3
, necesita privilegios de root ).Este módulo también permite la personalización de algunos parámetros.
fuente
Como me gusta que mi programa Python sea universal en la versión 2.7 y 3.xy en la plataforma Linux, Mac OS y Windows, tuve que modificar los ejemplos existentes.
fuente
False if platform.system().lower()=="windows" else True
usted, por supuesto, también podría usarloplatform.system().lower() != "windows"
.os.name!="nt"
funciona también? ¡Es cierto que no lo he probado en todos los 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
se encuentra en la tubería, ¿no?Después de mirar alrededor, terminé escribiendo mi propio módulo de ping, que está diseñado para monitorear grandes cantidades de direcciones, es asíncrono y no utiliza muchos recursos del sistema. Puede encontrarlo aquí: https://github.com/romana/multi-ping/ Tiene licencia de Apache, por lo que puede usarlo en su proyecto de la manera que mejor le parezca.
Las principales razones para implementar el mío son las restricciones de los otros enfoques:
fuente
fuente
Asegúrese de que pyping esté instalado o instálelo pip install pyping
fuente
El ping programático ICMP es complicado debido a los elevados privilegios necesarios para enviar paquetes ICMP sin procesar, y llamar a
ping
binarios es feo. Para la supervisión del servidor, puede lograr el mismo resultado utilizando una técnica llamada ping de TCP :Internamente, esto simplemente establece una conexión TCP con el servidor de destino y la deja de inmediato, midiendo el tiempo transcurrido. Esta implementación particular es un poco limitada ya que no maneja puertos cerrados, pero para sus propios servidores funciona bastante bien.
fuente
fuente
Resuelvo esto con:
"TTL" es la forma de saber si el ping es correcto. Saludos
fuente
Mi reducción usando ideas de respuestas en esta publicación pero solo usando el módulo de subproceso más nuevo recomendado y python3:
fuente
True if condition else False
para devolver Verdadero o Falso en función de una condición. Solo use egshell_needed = operating_sys == 'Windows'
yreturn success == 0
Este script funciona en Windows y debería funcionar en otros sistemas operativos: funciona en Windows, Debian y Macosx, necesita una prueba en Solaris.
fuente
Terminé encontrando esta pregunta con respecto a un escenario similar. Probé pyping pero el ejemplo dado por Naveen no funcionó para mí en Windows en Python 2.7.
Un ejemplo que funcionó para mí es:
fuente
pyping
no parece ser un módulo estándar. Tal vez podría proporcionar un enlace?Usando Multi-ping (
pip install multiPing
) hice este código simple (¡ simplemente copie y pegue si lo desea! ):Uso:
Si desea una sola muestra,
10
¡puede ignorar el segundo parámetro " "!¡Espero eso ayude!
fuente
Mi versión de una función de ping:
Siéntase libre de usarlo como lo desee.
fuente
Parece bastante simple, pero me dio ataques. Seguía recibiendo "no se permite la operación de socket abierto de icmp" o de lo contrario las soluciones se colgarían si el servidor estuviera fuera de línea. Sin embargo, si lo que quiere saber es que el servidor está vivo y está ejecutando un servidor web en ese servidor, entonces curl hará el trabajo. Si tiene ssh y certificados, entonces ssh y un simple comando serán suficientes. Aquí está el código:
fuente
Tenía un requisito similar, así que lo implementé como se muestra a continuación. Está probado en Windows 64 bit y Linux.
Cuando no se puede acceder a IP, subprocess.check_output () genera una excepción. La verificación adicional se puede hacer extrayendo información de la línea de salida 'Paquetes: Enviado = 2, Recibido = 2, Perdido = 0 (0% de pérdida)'.
fuente
Aquí hay una solución que utiliza el
subprocess
módulo de Python y laping
herramienta CLI proporcionada por el SO subyacente. Probado en Windows y Linux. Soporte para establecer un tiempo de espera de red. No necesita privilegios de root (al menos en Windows y Linux).fuente
Use esto, se probó en Python 2.7 y funciona bien, devuelve el tiempo de ping en milisegundos si tiene éxito y devuelve False en caso de error.
fuente
Una cosa que muchas de las respuestas pierden es que (al menos en Windows)
ping
comando devuelve 0 (lo que indica éxito) si recibe la respuesta "Host de destino inalcanzable".Aquí está mi código que verifica si
b'TTL='
está en la respuesta, ya que solo está presente cuando el ping llegó al host. Nota: La mayor parte de este código se basa en las otras respuestas aquí.Nota: Esto captura el resultado en lugar de imprimirlo, por lo que si desea ver el resultado
ping
, deberá imprimircompletedPing.stdout
antes de regresar.fuente
SOLO WINDOWS: no puedo creer que nadie haya abierto Win32_PingStatus. Mediante una simple consulta WMI, devolvemos un objeto lleno de información realmente detallada de forma gratuita
salida de muestra
fuente
Mi toma prestada de otras respuestas. Intente simplificar y minimizar las consultas.
fuente
Necesitaba un barrido de ping más rápido y no quería usar ninguna biblioteca externa, así que decidí usar la simultaneidad usando el incorporado
asyncio
.Este código requiere python 3.7+ y está hecho y probado solo en Linux . No funcionará en Windows, pero estoy seguro de que puede cambiarlo fácilmente para que funcione en Windows.
No soy un experto
asyncio
pero utilicé este excelente artículo Acelere su programa Python con concurrencia y se me ocurrieron estas líneas de códigos. Traté de hacerlo lo más simple posible, por lo que lo más probable es que necesite agregar más código para satisfacer sus necesidades.No devuelve verdadero o falso, pensé que sería más conveniente hacer que imprima la IP que responde a una solicitud de ping. Creo que es bastante rápido, haciendo ping a 255 ips en casi 10 segundos.
Salida de muestra:
Tenga en cuenta que las IP no están en orden, ya que la IP se imprime tan pronto como responde, por lo que el que responde primero se imprime primero.
fuente
Una simple que acabo de cocinar en un minuto ... ¡usar icmplib necesita root privs, el siguiente funciona bastante bien! HTH
fuente