it-swarm.com.de

Pingen Sie eine Seite in Python?

Der grundlegende Code lautet:

from Tkinter import *
import os,sys

ana= Tk()
def ping1():
    os.system('ping')

a=Button(pen)
ip=("192.168.0.1")

a.config(text="PING",bg="white",fg="blue")
a=ping1.ip ??? 
a.pack()

ana.mainloop()

Wie kann ich eine Website oder Adresse anpingen?

69
user40572

Sehen Sie diese reine Python-Ping von Matthew Dixon Cowles und Jens Diemer . Denken Sie auch daran, dass Python root benötigt, um ICMP-Sockets (d. H. Ping-Sockets) in Linux zu erzeugen.

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

Der Quellcode selbst ist leicht zu lesen. Die Implementierungen von verbose_ping und Ping.do finden Sie hier.

78
orip

Je nachdem, was Sie erreichen möchten, rufen Sie den System-Ping-Befehl wahrscheinlich am einfachsten auf.

Die Verwendung des Subprozess-Moduls ist die beste Methode, obwohl der Ping-Befehl auf verschiedenen Betriebssystemen unterschiedlich ist!

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

Sie müssen sich nicht um Shell-Escape-Zeichen kümmern. Zum Beispiel..

Host = "google.com; `echo test`

..will not führt den Echo-Befehl aus.

Um nun die Ping-Ergebnisse zu erhalten, können Sie die Variable out analysieren. Beispielausgabe:

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

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

Denken Sie daran, dass die Ausgabe je nach Betriebssystem (und sogar der Version von ping) variieren kann. Dies ist nicht ideal, aber es funktioniert in vielen Situationen (wo Sie wissen, auf welchen Rechnern das Skript ausgeführt wird)

40
dbr

Sie finden Noah Gift's Präsentation Agile Commandline-Tools mit Python erstellen . Dabei kombiniert er Subprozess, Warteschlange und Threading, um eine Lösung zu entwickeln, die Hosts gleichzeitig pingen und den Prozess beschleunigen kann. Unten ist eine Basisversion, bevor er die Befehlszeilenanalyse und einige andere Funktionen hinzufügt. Den Code zu dieser und anderen Versionen finden Sie hier

#!/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()

Er ist auch Autor von: Python für Unix und Linux Systemadministration

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

39
Ryan Cox

Es ist schwer zu sagen, was Ihre Frage ist, aber es gibt einige Alternativen.

Wenn Sie eine Anforderung buchstäblich mit dem ICMP-Ping-Protokoll ausführen möchten, können Sie eine ICMP-Bibliothek erhalten und die Ping-Anforderung direkt ausführen. Google "Python ICMP", um solche Dinge zu finden icmplib . Vielleicht möchten Sie auch scapy anschauen.

Dies ist viel schneller als die Verwendung von os.system("ping " + ip )

Wenn Sie eine Box generisch "pingen" wollen, um zu sehen, ob sie aktiv ist, können Sie das Echo-Protokoll an Port 7 verwenden.

Für Echo verwenden Sie die Bibliothek socket , um die IP-Adresse und den Port 7 zu öffnen. Sie schreiben etwas an diesem Port, senden einen Wagenrücklauf ("\r\n") und lesen die Antwort.

Wenn Sie eine Website "pingen" möchten, um zu sehen, ob die Site ausgeführt wird, müssen Sie das HTTP-Protokoll an Port 80 verwenden.

Um einen Webserver zu überprüfen oder ordnungsgemäß zu überprüfen, verwenden Sie urllib2 , um eine bestimmte URL zu öffnen. (/index.html ist immer beliebt) und lesen Sie die Antwort. 

Es gibt noch mehr potenzielle Bedeutung von "Ping", einschließlich "Traceroute" und "Finger".

10
S.Lott

Ich habe so etwas als Inspiration gemacht:

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()
7
Harald Schilly

Hier ist ein kurzer Ausschnitt mit subprocess. Die check_call-Methode gibt entweder 0 für den Erfolg zurück oder löst eine Ausnahme aus. Auf diese Weise muss ich die Ausgabe von Ping nicht analysieren. Ich benutze shlex, um die Befehlszeilenargumente aufzuteilen.

  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

einen Dateinamen lesen, die Datei enthält eine URL pro Zeile, wie folgt:

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

befehl verwenden:

python url.py urls.txt

erhalte das Ergebnis:

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

quellcode (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

Werfen Sie einen Blick auf Jeremy Hylton's Code , wenn Sie eine komplexere und detailliertere Implementierung in Python durchführen möchten, als nur ping aufzurufen.

2

Eine aktualisierte Version des genannten Skripts finden Sie unter Windows und Linux hier

2
Born To Ride
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"
1
Ibrahim Kasim

Wenn Sie tatsächlich etwas in Python wollen, mit dem Sie spielen können, schauen Sie sich Scapy an:

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

Das ist meiner Meinung nach viel besser (und vollkommen plattformübergreifend) als manche funky Unterprozessaufrufe. Sie können auch so viele Informationen über die Antwort (Sequenz-ID .....) haben, wie Sie möchten, wie Sie das Paket selbst haben.

1
Cukic0d

Ich benutze das Ping-Modul von Lars Strand. Google für "Lars Strand Python Ping" und Sie finden viele Referenzen.

0
akr

Verwenden Sie diese Funktion, die auf Python 2.7 getestet wurde, und funktioniert einwandfrei. Sie gibt die Ping-Zeit in Millisekunden zurück, wenn der Fehler erfolgreich ist, und gibt False zurück.

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

verwenden des Systempingbefehls, um eine Liste von Hosts zu pingen:

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