Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ping a site in Python?

How do I ping a website or IP address with Python?

like image 920
user40572 Avatar asked Nov 25 '08 09:11

user40572


People also ask

How do I ping a specific website?

Using Ping on a Windows deviceIn the Command Prompt window, type 'ping' followed by the destination, either an IP Address or a Domain Name, and press Enter. The command will begin printing the results of the ping into the Command Prompt.


3 Answers

See this pure Python ping by Matthew Dixon Cowles and Jens Diemer. Also, remember that Python requires root to spawn ICMP (i.e. ping) sockets in linux.

import ping, socket try:     ping.verbose_ping('www.google.com', count=3)     delay = ping.Ping('www.wikipedia.org', timeout=2000).do() except socket.error, e:     print "Ping Error:", e 

The source code itself is easy to read, see the implementations of verbose_ping and of Ping.do for inspiration.

like image 174
orip Avatar answered Sep 22 '22 18:09

orip


Depending on what you want to achive, you are probably easiest calling the system ping command..

Using the subprocess module is the best way of doing this, although you have to remember the ping command is different on different operating systems!

import subprocess  host = "www.google.com"  ping = subprocess.Popen(     ["ping", "-c", "4", host],     stdout = subprocess.PIPE,     stderr = subprocess.PIPE )  out, error = ping.communicate() print out 

You don't need to worry about shell-escape characters. For example..

host = "google.com; `echo test` 

..will not execute the echo command.

Now, to actually get the ping results, you could parse the out variable. Example output:

round-trip min/avg/max/stddev = 248.139/249.474/250.530/0.896 ms 

Example regex:

import re matcher = re.compile("round-trip min/avg/max/stddev = (\d+.\d+)/(\d+.\d+)/(\d+.\d+)/(\d+.\d+)") print matcher.search(out).groups()  # ('248.139', '249.474', '250.530', '0.896') 

Again, remember the output will vary depending on operating system (and even the version of ping). This isn't ideal, but it will work fine in many situations (where you know the machines the script will be running on)

like image 34
dbr Avatar answered Sep 19 '22 18:09

dbr


You may find Noah Gift's presentation Creating Agile Commandline Tools With Python. In it he combines subprocess, Queue and threading to develop solution that is capable of pinging hosts concurrently and speeding up the process. Below is a basic version before he adds command line parsing and some other features. The code to this version and others can be found here

#!/usr/bin/env python2.5
from threading import Thread
import subprocess
from Queue import Queue

num_threads = 4
queue = Queue()
ips = ["10.0.1.1", "10.0.1.3", "10.0.1.11", "10.0.1.51"]
#wraps system ping command
def pinger(i, q):
    """Pings subnet"""
    while True:
        ip = q.get()
        print "Thread %s: Pinging %s" % (i, ip)
        ret = subprocess.call("ping -c 1 %s" % ip,
            shell=True,
            stdout=open('/dev/null', 'w'),
            stderr=subprocess.STDOUT)
        if ret == 0:
            print "%s: is alive" % ip
        else:
            print "%s: did not respond" % ip
        q.task_done()
#Spawn thread pool
for i in range(num_threads):

    worker = Thread(target=pinger, args=(i, queue))
    worker.setDaemon(True)
    worker.start()
#Place work in queue
for ip in ips:
    queue.put(ip)
#Wait until worker threads are done to exit    
queue.join()

He is also author of: Python for Unix and Linux System Administration

http://ecx.images-amazon.com/images/I/515qmR%2B4sjL._SL500_AA240_.jpg

like image 20
Ryan Cox Avatar answered Sep 22 '22 18:09

Ryan Cox