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?
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.
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)
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
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".
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()
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."
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)
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.
Eine aktualisierte Version des genannten Skripts finden Sie unter Windows und Linux hier
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"
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.
Ich benutze das Ping-Modul von Lars Strand. Google für "Lars Strand Python Ping" und Sie finden viele Referenzen.
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
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)