web-dev-qa-db-ja.com

PythonでサイトをPingしますか?

PythonでWebサイトまたはIPアドレスにpingを実行するにはどうすればよいですか?

71
user40572

こちらをご覧ください pure Python ping by Matthew Dixon Cowles and Jens Diemer また、Pythonでは、LinuxでICMP(つまりping)ソケットを生成するためにrootが必要であることを忘れないでください。

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

ソースコード自体は読みやすいです。インスピレーションについては、verbose_pingおよびPing.doの実装を参照してください。

77
orip

達成したい内容によっては、おそらくシステムpingコマンドを呼び出すのが最も簡単です。

これを行うには、サブプロセスモジュールを使用するのが最善の方法です。ただし、pingコマンドはオペレーティングシステムによって異なることに注意する必要があります。

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

シェルエスケープ文字について心配する必要はありません。例えば..

Host = "google.com; `echo test`

..will not echoコマンドを実行します。

これで、実際にpingの結果を取得するために、out変数を解析できます。出力例:

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

正規表現の例:

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

繰り返しますが、出力はオペレーティングシステム(およびpingのバージョン)によって異なることに注意してください。これは理想的ではありませんが、多くの状況でうまく機能します(スクリプトが実行されるマシンを知っている場合)

40
dbr

Noah Gift's presentation Pythonを使用したアジャイルコマンドラインツールの作成 があります。その中で、サブプロセス、キュー、およびスレッドを組み合わせて、ホストに同時にpingを実行し、プロセスを高速化できるソリューションを開発します。以下は、コマンドライン解析およびその他の機能を追加する前の基本バージョンです。このバージョンと他のバージョンのコードは 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()

彼は次の著者でもあります: Python for Unix and Linux System Administration

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

39
Ryan Cox

あなたの質問が何であるかを言うのは難しいですが、いくつかの選択肢があります。

ICMP pingプロトコルを使用して文字通りリクエストを実行する場合は、ICMPライブラリを取得して、pingリクエストを直接実行できます。このようなものを見つけるためにGoogle "Python ICMP" icmplibscapy もご覧ください。

これは、os.system("ping " + ip )を使用するよりもはるかに高速です。

ボックスが一般的に「ping」されて起動しているかどうかを確認する場合は、ポート7でエコープロトコルを使用できます。

エコーの場合は、 socket ライブラリを使用してIPアドレスとポート7を開きます。そのポートに何かを書き込み、キャリッジリターン("\r\n")を送信してから応答を読み取ります。

Webサイトを「ping」してサイトが実行されているかどうかを確認する場合は、ポート80でhttpプロトコルを使用する必要があります。

Webサーバーを適切にチェックするには、 rllib2 を使用して特定のURLを開きます。 (/index.htmlは常に一般的です)、応答を読み取ります。

「traceroute」や「​​finger」など、「ping」にはさらに多くの潜在的な意味があります。

9
S.Lott

私はインスピレーションとしてこのように似たようなことをしました:

import urllib
import threading
import time

def pinger_urllib(Host):
  """
  helper function timing the retrival of index.html 
  TODO: should there be a 1MB bogus file?
  """
  t1 = time.time()
  urllib.urlopen(Host + '/index.html').read()
  return (time.time() - t1) * 1000.0


def task(m):
  """
  the actual task
  """
  delay = float(pinger_urllib(m))
  print '%-30s %5.0f [ms]' % (m, delay)

# parallelization
tasks = []
URLs = ['google.com', 'wikipedia.org']
for m in URLs:
  t = threading.Thread(target=task, args=(m,))
  t.start()
  tasks.append(t)

# synchronization point
for t in tasks:
  t.join()
8
Harald Schilly

subprocessを使用した短いスニペットです。 check_callメソッドは、成功すると0を返すか、例外を発生させます。このように、pingの出力を解析する必要はありません。 shlexを使用して、コマンドライン引数を分割しています。

  import subprocess
  import shlex

  command_line = "ping -c 1 www.google.comsldjkflksj"
  args = shlex.split(command_line)
  try:
      subprocess.check_call(args,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
      print "Website is there."
  except subprocess.CalledProcessError:
      print "Couldn't get a ping."
6
Moondoggy

ファイル名を読み取ると、ファイルには次のように1行に1つのURLが含まれます。

http://www.poolsaboveground.com/Apache/hadoop/core/
http://mirrors.sonic.net/Apache/hadoop/core/

コマンドを使用:

python url.py urls.txt

結果を得る:

Round Trip Time: 253 ms - mirrors.sonic.net
Round Trip Time: 245 ms - www.globalish.com
Round Trip Time: 327 ms - www.poolsaboveground.com

ソースコード(url.py):

import re
import sys
import urlparse
from subprocess import Popen, PIPE
from threading import Thread


class Pinger(object):
    def __init__(self, hosts):
        for Host in hosts:
            hostname = urlparse.urlparse(Host).hostname
            if hostname:
                pa = PingAgent(hostname)
                pa.start()
            else:
                continue

class PingAgent(Thread):
    def __init__(self, Host):
        Thread.__init__(self)        
        self.Host = Host

    def run(self):
        p = Popen('ping -n 1 ' + self.Host, stdout=PIPE)
        m = re.search('Average = (.*)ms', p.stdout.read())
        if m: print 'Round Trip Time: %s ms -' % m.group(1), self.Host
        else: print 'Error: Invalid Response -', self.Host


if __== '__main__':
    with open(sys.argv[1]) as f:
        content = f.readlines() 
    Pinger(content)
3
hustljian
import subprocess as s
ip=raw_input("Enter the IP/Domain name:")
if(s.call(["ping",ip])==0):
    print "your IP is alive"
else:
    print "Check ur IP"
2
Ibrahim Kasim

pingを呼び出すだけでなく、Pythonでより複雑で詳細な実装を行う必要がある場合は、 Jeremy Hyltonのコード をご覧ください。 。

2

実際にPythonで何かをしたい場合は、Scapyを見てください。

from scapy.all import *
request = IP(dst="www.google.com")/ICMP()
answer = sr1(request)

私の意見では、ファンキーなサブプロセス呼び出しよりもはるかに優れています(そして完全にクロスプラットフォームです)。また、パケット自体があるのと同じくらい、答えに関する情報(シーケンスID .....)を持つことができます。

1
Cukic0d

WindowsとLinuxの両方で動作する上記のスクリプトの更新バージョンを見つけることができます here

1
Born To Ride

Lars Strandのpingモジュールを使用します。 「Lars Strand python ping」のGoogleを使用すると、多くの参照が見つかります。

0
Andreas Kraft

これを使用してpython 2.7でテストされ、正常に動作し、成功するとping時間をミリ秒単位で返し、失敗するとFalseを返します。

import platform,subproccess,re
def Ping(hostname,timeout):
    if platform.system() == "Windows":
        command="ping "+hostname+" -n 1 -w "+str(timeout*1000)
    else:
        command="ping -i "+str(timeout)+" -c 1 " + hostname
    proccess = subprocess.Popen(command, stdout=subprocess.PIPE)
    matches=re.match('.*time=([0-9]+)ms.*', proccess.stdout.read(),re.DOTALL)
    if matches:
        return matches.group(1)
    else: 
        return False
0
MSS

system pingコマンドを使用してホストのリストにpingを実行します。

import re
from subprocess import Popen, PIPE
from threading import Thread


class Pinger(object):
    def __init__(self, hosts):
        for Host in hosts:
            pa = PingAgent(Host)
            pa.start()

class PingAgent(Thread):
    def __init__(self, Host):
        Thread.__init__(self)        
        self.Host = Host

    def run(self):
        p = Popen('ping -n 1 ' + self.Host, stdout=PIPE)
        m = re.search('Average = (.*)ms', p.stdout.read())
        if m: print 'Round Trip Time: %s ms -' % m.group(1), self.Host
        else: print 'Error: Invalid Response -', self.Host


if __== '__main__':
    hosts = [
        'www.pylot.org',
        'www.goldb.org',
        'www.google.com',
        'www.yahoo.com',
        'www.techcrunch.com',
        'www.this_one_wont_work.com'
       ]
    Pinger(hosts)
0
Corey Goldberg