Pinging servers in Python
icmp, ping, python, python-3.x
Solution
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'])`.
Problem
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?