pythonpingicmp

Pinging servers in Python


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?


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']).