In Python, is there a way to ping a server through ICMP and return TRUE if the server responds, or FALSE if there is no response?
Advertisement
Answer
This function works in any OS (Unix, Linux, macOS, and Windows)
Python 2 and Python 3
EDITS:
By @radato os.system
was replaced by subprocess.call
. This avoids shell injection vulnerability in cases where your hostname string might not be validated.
import platform # For getting the operating system name import subprocess # For executing a shell command def ping(host): """ Returns True if host (str) responds to a ping request. Remember that a host may not respond to a ping (ICMP) request even if the host name is valid. """ # Option for the number of packets as a function of param = '-n' if platform.system().lower()=='windows' else '-c' # Building the command. Ex: "ping -c 1 google.com" command = ['ping', param, '1', host] return subprocess.call(command) == 0
Note that, according to @ikrase on Windows this function will still return True
if you get a Destination Host Unreachable
error.
Explanation
The command is ping
in both Windows and Unix-like systems.
The option -n
(Windows) or -c
(Unix) controls the number of packets which in this example was set to 1.
platform.system()
returns the platform name. Ex. 'Darwin'
on macOS.
subprocess.call()
performs a system call. Ex. subprocess.call(['ls','-l'])
.