Ping de la escritura - si la respuesta

votos
0

Sólo estoy tratando de armar un simple servidor arriba / abajo de la escritura como acabo de empezar a aprender Python.

A continuación se muestra la secuencia de comandos ... pero no puedo conseguirlo para dar salida al Servidor abajo sección de código. la if response == 0que supongo está recogiendo el destino inaccesible respuesta y está haciendo un falso positivo.

lo que puedo hacer para evitar esto?

# Server up/down Script

import os

hostname1 = input ( Please Enter IP Address: )

response = os.system(echo ping -a -c 1  + hostname1)

#and then check the response...
if response == 0: # This will check the host repeatedly
    print (hostname1, '\033[1;32m [ **SERVER ALIVE** ] \033[1;m')
    # As long as the server is up it will print the UP response in green text
else:
    print(hostname1, '[ **SERVER DOWN** ]')
print( 30 * -)
Publicado el 07/11/2018 a las 23:49
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
0

response = os.system("echo ping -a -c 1 " + hostname1)

El comando del sistema se está ejecutando es sólo una echo, que se acaba de imprimir " ping -a -c 1 <hostname>" a la salida estándar, y luego regresar 0. En realidad, no hace ningún ping. Puede probarlo mediante la ejecución de los comandos del sistema directamente en un terminal y comprobar el valor de retorno:

$ echo ping -a -c 1 8.8.8.8 
ping -a -c 1 8.8.8.8
$ echo $?  # returns 0
$ echo ping -a -c 1 <some.invalid.ip> 
<some.invalid.ip>
$ echo $?  # still returns 0

Debe eliminar echoy simplemente hacer:

response = os.system("ping -a -c 1 " + hostname1)

Que debe devolver el resultado correcto:

# VALID IP

>>> response = os.system("ping -a -c 1 8.8.8.8")
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=119 time=5.80 ms

--- 8.8.8.8 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 5.803/5.803/5.803/0.000 ms
>>> print(response)
0

# INVALID IP

>>> response = os.system("ping -a -c 1 5.5.5.5")
PING 5.5.5.5 (5.5.5.5) 56(84) bytes of data.

--- 5.5.5.5 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

>>> print(response)
256

Para las llamadas al sistema, recomiendo utilizar el subprocesspaquete en su lugar, lo que incluye subprocess.runla función que puede imprimir la salida del comando y luego devolver un objeto que contiene código de retorno del comando.

# VALID IP

>>> response = subprocess.run(["ping", "-c", "1", "8.8.8.8"])
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=119 time=5.19 ms

--- 8.8.8.8 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 5.194/5.194/5.194/0.000 ms
>>> response.returncode
0

# INVALID IP

>>> response = subprocess.run(["ping", "-c", "1", "5.5.5.5"])
PING 5.5.5.5 (5.5.5.5) 56(84) bytes of data.

--- 5.5.5.5 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

>>> response.returncode
1

Si quería ocultar la salida del pingcomando, se puede pasar subprocess.PIPEa la stdoutde subprocess.run:

>>> response = subprocess.run(["ping", "-c", "1", "5.5.5.5"], stdout=subprocess.PIPE)
>>> response.returncode
1

La recomendación de uso subprocessse señala en el os.systemdocumento :

El subproceso módulo proporciona más potentes instalaciones para el desove nuevos procesos y la recuperación de sus resultados; usando ese módulo es preferible al uso de esta función. Ver las funciones más antiguas Sustitución con el módulo de subproceso sección en el subproceso documentación para algunas recetas votos

Respondida el 08/11/2018 a las 00:23
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more