Как мне пропинговать сайт или IP-адрес с помощью Python?
Ping сайт в Python?
Ответ 1
Смотрите чистый Python ping Matthew Dixon Cowles и Jens Diemer. Кроме того, помните, что Python требует, чтобы root запускал ICMP (то есть ping) сокеты в 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
Исходный код легко читается, см. реализации verbose_ping
и Ping.do
для вдохновения.
Ответ 2
В зависимости от того, что вы хотите достичь, вы, вероятно, проще всего вызываете команду 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`
.. будет не выполнять команду эхо.
Теперь, чтобы получить результаты ping, вы можете проанализировать переменную out
. Пример вывода:
round-trip min/avg/max/stddev = 248.139/249.474/250.530/0.896 ms
Пример 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')
Опять же, помните, что выход будет зависеть от операционной системы (и даже версии ping
). Это не идеальный вариант, но во многих ситуациях он будет работать нормально (где вы знаете машины, на которых будет работать script)
Ответ 3
Вы можете найти презентацию Noah Gift Создание гибких инструментов командной строки с помощью Python. В нем он объединяет подпроцесс, очередь и многопоточность для разработки решения, способного одновременно пинговать хосты и ускорять процесс. Ниже приведена базовая версия, прежде чем он добавит синтаксический анализ командной строки и некоторые другие функции. Код этой версии и другие можно найти здесь
#!/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 для системного администрирования Unix и Linux
http://ecx.images-amazon.com/images/I/515qmR%2B4sjL._SL500_AA240_.jpg
Ответ 4
Трудно сказать, каков ваш вопрос, но есть некоторые альтернативы.
Если вы хотите буквально выполнить запрос с использованием протокола ping ICMP, вы можете получить библиотеку ICMP и выполнить запрос ping напрямую. Google "Python ICMP", чтобы найти такие вещи icmplib. Возможно, вы захотите посмотреть scapy.
Это будет намного быстрее, чем при использовании os.system("ping " + ip )
.
Если вы хотите в общем случае "пинговать" поле, чтобы узнать, может ли он использоваться, вы можете использовать протокол эха на порте 7.
Для эха вы используете библиотеку socket, чтобы открыть IP-адрес и порт 7. Вы пишете что-то на этом порту, отправляете возврат каретки ("\r\n"
), а затем прочитать ответ.
Если вы хотите "ping" на веб-сайте, чтобы узнать, работает ли сайт, вам нужно использовать протокол http на порту 80.
Для правильной проверки веб-сервера вы используете urllib2, чтобы открыть определенный URL-адрес. (/index.html
всегда популярен) и читайте ответ.
Есть еще больше потенциального значения "ping", включая "traceroute" и "finger".
Ответ 5
Я сделал нечто подобное, как вдохновение:
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()
Ответ 6
Вот короткий фрагмент с использованием 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."
Ответ 7
прочитайте имя файла, файл содержит один 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 __name__ == '__main__':
with open(sys.argv[1]) as f:
content = f.readlines()
Pinger(content)
Ответ 8
Посмотрите код Джереми Хилтона, если вам нужно выполнить более сложную, детальную реализацию на Python, а не просто позвонить ping
.
Ответ 9
Вы можете найти обновленную версию упомянутого script, которая работает как на Windows, так и на Linux здесь
Ответ 10
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"
Ответ 11
Я использую модуль ping Lars Strand. Google для "Python ping pars" Lars Strand, и вы найдете много ссылок.
Ответ 12
используя команду 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 __name__ == '__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)
Ответ 13
Использовать его для тестирования на 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
Ответ 14
Если вы действительно хотите что-то в Python, с чем можно поиграть, взгляните на Scapy:
from scapy.all import *
request = IP(dst="www.google.com")/ICMP()
answer = sr1(request)