Найти - Пользователи
Полная версия: как получить шлюз по умолчанию, ping, tracert
Начало » Network » как получить шлюз по умолчанию, ping, tracert
1 2
qman
Всем привет,
1) подскажите возможно ли на питоне получить шлюз по умолчанию?
Пока вижу только решение - запускать процесс
cmd /c "route print"
и выводимый им ответ - разобрать, в куче которого будет шлю по умолчанию.
Вобщем как получить шлюз по умолчанию.
2) возможно ли на питоне делать подобное ping и tracert, а также анализировать ходят пинги или нет? Для tracert возможно ли получить список имент хостов через которые прошел пакет?
Скрипты должны работать под windows xp.
Спасибо за советы
truporez
про пинг вот тема http://python.su/forum/viewtopic.php?id=30
igor.kaist
Присоединяюсь к вопросу насчет tracert. На днях пытался искать. Был один пример, но под виндой не завелся. Хотелось бы pure python :)
truporez
здесь есть рабочий traceroute:
http://pypi.python.org/pypi/pyip/0.7
qman
truporez
здесь есть рабочий traceroute:
http://pypi.python.org/pypi/pyip/0.7
Запустил питоновский tracert:
C:\temp\pyip-0.7>traceroute.py 192.168.0.1
traceroute to HOME-S (192.168.0.1), 30 hops max, 38 byte packets
1 * * *
2 * * *
3 * * *
4 * * *
5 * * *
6 * * *
7 * * *
8 * * *
9 * * *
10 * * *
11 * * *
12 * * *
13 * * *
14 * * *
15 * * *
16 * * *
17 * * *
18 * * *
19 * * *
20 * * *
21 * * *
22 * * *
23 * * *
24 * * *
25 * * *
26 * * *
27 * * *
28 * * *
29 * * *
30 * * *
Из выше приведенного списка мне не понятно через какие хосты проходит пакет? И доходит ли он до назначения!
а родной виндовый tracert нормально отработал:
C:\Documents and Settings\user>tracert 192.168.0.1
Трассировка маршрута к 192.168.0.1 с максимальным числом прыжков 30
1 <1 мс <1 мс <1 мс 192.168.0.1
Трассировка завершена.
C:\Documents and Settings\user>
Может народ объяснит в чем я ошибаюсь?
Как получить на питоне список хостов через которые проходит пакет?
truporez
для наглядности лучше цель выбрать подальше. а то что трассировать не прекращает - надо код смотреть. почему-то не срабатывает icmp_reply.get_type() == icmp.ICMP_UNREACH.

получить список хостов - как вариант в месте отладки вместо print влепить добавление к списку. и по окончанию трассировки его возвращать.
qman
Всем привет,
у меня ping из пакета pyip (http://pypi.python.org/pypi/pyip/0.7) вызывал exception в случае когда ни одного пакета не дошло до хоста! Проблема возникала потому, что автор пытался расчитать min, max, avg в случае когда ни один пакет не дошел.
Я немного переправил код процедуры get_summary.
Мой рабочий код
    def get_summary(self):
if len(self.deltas) > 0 :
dmin = min(self.deltas)
dmax = max(self.deltas)
davg = reduce(lambda x, y: x + y, self.deltas) / len(self.deltas)
else :
dmin = dmax = davg = '-'
sent = self.num
recv = sent - len(self.times.values())
loss = float(sent - recv) / float(sent)
return dmin, davg, dmax, sent, recv, loss
было
    def get_summary(self):
dmin = min(self.deltas)
dmax = max(self.deltas)
davg = reduce(lambda x, y: x + y, self.deltas) / len(self.deltas)
sent = self.num
recv = sent - len(self.times.values())
loss = float(sent - recv) / float(sent)
return dmin, davg, dmax, sent, recv, loss
А также изменил код вывода статистика пинга. Мой рабочий код:
if __name__ == "__main__":    
try:
who = sys.argv[1]
except IndexError:
print "ping.py host [#packets]"
sys.exit(0)
try:
num = string.atoi(sys.argv[2])
except ValueError:
print "ping.py host [#packets]"
sys.exit(0)
except IndexError:
num = 32

p = CmdlinePinger(who, num)
p.ping()
summary = p.get_summary()
print "---Ping statistics---"
lost_packet_percent = int(summary[5] * 100.)
print "%d packets transmitted, %d packets received, %d%% packet loss" % \
(summary[3], summary[4], lost_packet_percent)
if lost_packet_percent < 100 :
print "round-trip (ms) min/avg/max = %d/%d/%d" % \
(summary[0], summary[1], summary[2])
Было:
if __name__ == "__main__":    
try:
who = sys.argv[1]
except IndexError:
print "ping.py host [#packets]"
sys.exit(0)
try:
num = string.atoi(sys.argv[2])
except ValueError:
print "ping.py host [#packets]"
sys.exit(0)
except IndexError:
num = 32

p = CmdlinePinger(who, num)
p.ping()
summary = p.get_summary()
print "---Ping statistics---"
print "%d packets transmitted, %d packets received, %d%% packet loss" % \
(summary[3], summary[4], int(summary[5] * 100.))
print "round-trip (ms) min/avg/max = %d/%d/%d" % \
(summary[0], summary[1], summary[2])
Прошу покритиковать мой код. Если все верно мной исправлено то подскажите как обновить этот код на сайте
http://pypi.python.org/pypi/pyip/0.7
?
P.S. сам я новичок, в питоне не силен.
qman
Весь код
#
# pyip is a Python package offering assembling/disassembling of raw ip packet
# including ip, udp, and icmp. Also it includes 2 utilities based on raw ip,
# traceroute and ping.
#
# pyip is released under PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2, and is
# a project inspired by 'ping' written by Jeremy Hylton.
#
# Author: Kenneth Jiang, kenneth.jiang@gmail.com
#


"""Ping. Round-trip delay measurement utility.

Uses ICMP ECHO_REQEST messages to measure the delay between two
Internet hosts.
"""

import icmp, ip
import socket
import time
import select
import string
import os, sys

TimedOut = 'TimedOut'

class PingSocket:

def __init__(self, addr):
self.dest = (socket.gethostbyname(addr), 0)
self.open_icmp_socket()

def open_icmp_socket(self):
self.socket = socket.socket(socket.AF_INET, socket.SOCK_RAW,
socket.IPPROTO_ICMP)
self.socket.setblocking(1)

def sendto(self, packet):
self.socket.sendto(packet, self.dest)

def recvfrom(self, maxbytes):
return self.socket.recvfrom(maxbytes)

class Pinger:

def __init__(self, addr, num):
self.num = num
self.last = 0
self.sent = 0
self.times = {}
self.deltas = []
self.sock = PingSocket(addr)
self.pid = os.getpid()
self.addr = addr
name, aliases, ipaddr = socket.gethostbyaddr(addr)
if aliases:
self.destinfo = (aliases[0], ipaddr[0])
else:
self.destinfo = (name, ipaddr[0])

def send_packet(self):
pkt = icmp.Echo(id=self.pid, seq=self.sent, data='python pinger')
buf = icmp.assemble(pkt)
self.times[self.sent] = time.time()
self.sock.sendto(buf)
self.plen = len(buf)
self.sent = self.sent + 1

def recv_packet(self, pkt, when):
try:
sent = self.times[pkt.get_seq()]
del self.times[pkt.get_seq()]
except KeyError:
return
# limit to ms precision
delta = int((when - sent) * 1000.)
self.deltas.append(delta)
self.recv_output(self.plen, self.destinfo[0],
self.destinfo[1], pkt.get_seq(), delta)
if pkt.get_seq() > self.last:
self.last = pkt.get_seq()

def recv_output(self, bytes, dest, addr, seq, delta):
"Place holder for subclass output/collector method"
pass

def ping(self):
# don't wait more than 10 seconds from now for first reply
self.last_arrival = time.time()
while 1:
if self.sent < self.num:
self.send_packet()
elif not self.times and self.last == self.num - 1:
break
else:
now = time.time()
if self.deltas:
# Wait no more than 10 times the longest delay so far
if (now - self.last_arrival) > max(self.deltas) / 100.:
break
else:
# Wait no more than 10 seconds
if (now - self.last_arrival) > 10.:
break
self.wait()

def wait(self):
start = time.time()
timeout = 1.0
while 1:
rd, wt, er = select.select([self.sock.socket], [], [], timeout)
if rd:
# okay to use time here, because select has told us
# there is data and we don't care to measure the time
# it takes the system to give us the packet.
arrival = time.time()
try:
pkt, who = self.sock.recvfrom(4096)
except socket.error:
continue
# could also use the ip module to get the payload
repip = ip.disassemble(pkt)
try:
reply = icmp.disassemble(repip.data)
except ValueError:
continue
if reply.get_id() == self.pid:
self.recv_packet(reply, arrival)
self.last_arrival = arrival
timeout = (start + 1.0) - time.time()
if timeout < 0:
break

def get_summary(self):
if len(self.deltas) > 0 :
dmin = min(self.deltas)
dmax = max(self.deltas)
davg = reduce(lambda x, y: x + y, self.deltas) / len(self.deltas)
else :
dmin = dmax = davg = '-'
sent = self.num
recv = sent - len(self.times.values())
loss = float(sent - recv) / float(sent)
return dmin, davg, dmax, sent, recv, loss

class CollectorPinger(Pinger):

def __init__(self, host, num):
Pinger.__init__(self, host, num)
self.results = {}

def recv_output(self, bytes, dest, addr, seq, delta):
self.results[seq] = delta

class CmdlinePinger(Pinger):

def recv_output(self, bytes, dest, addr, seq, delta):
print "%d bytes from %s (%s): icmp_seq=%d. time=%d. ms" % \
(bytes, dest, addr, seq, delta)

def ping(self):
print "PING %s" % self.destinfo[0]
Pinger.ping(self)

if __name__ == "__main__":
try:
who = sys.argv[1]
except IndexError:
print "ping.py host [#packets]"
sys.exit(0)
try:
num = string.atoi(sys.argv[2])
except ValueError:
print "ping.py host [#packets]"
sys.exit(0)
except IndexError:
num = 32

p = CmdlinePinger(who, num)
p.ping()
summary = p.get_summary()
print "---Ping statistics---"
lost_packet_percent = int(summary[5] * 100.)
print "%d packets transmitted, %d packets received, %d%% packet loss" % \
(summary[3], summary[4], lost_packet_percent)
if lost_packet_percent < 100 :
print "round-trip (ms) min/avg/max = %d/%d/%d" % \
(summary[0], summary[1], summary[2])
ZZZ
qman
dmin = dmax = davg = ‘-’
Поидее в self.deltas храняться числа. Как-то это не айс так делать. Никогда не смешивай данные и отображение. Лучше приравняй к нулю или None (как будет логичнее?), а потом обработай вывод. А то я хочу получить в программе эти значения, а получаю строку… Не логично. да и не корректно.

qman
А также изменил код вывода статистика пинга.
ИМХО, если уж делать вывод, то в таком виде:
Last login: Fri May 29 09:56:44 on console
ttys000 /Users/zzz $ ping -i10 -c6 72.14.205.100
PING 72.14.205.100 (72.14.205.100): 56 data bytes
64 bytes from 72.14.205.100: icmp_seq=0 ttl=239 time=895.480 ms
64 bytes from 72.14.205.100: icmp_seq=1 ttl=239 time=1344.195 ms
64 bytes from 72.14.205.100: icmp_seq=2 ttl=239 time=1160.868 ms
64 bytes from 72.14.205.100: icmp_seq=3 ttl=239 time=1517.706 ms
64 bytes from 72.14.205.100: icmp_seq=4 ttl=239 time=941.263 ms
64 bytes from 72.14.205.100: icmp_seq=5 ttl=239 time=1081.249 ms

— 72.14.205.100 ping statistics —
6 packets transmitted, 6 packets received, 0% packet loss
round-trip min/avg/max/stddev = 895.480/1156.793/1517.706/218.265 ms
ttys000 /Users/zzz $
qman
подскажите как обновить этот код на сайте
Словарик в зубы и пиши автору письмо. А то если бы каждый мог сам что угодно поправить, начился бы хаос.
Само собой полный код ему не нужен, а только изменения – тут ты правильно показал.

P.S. И вообще, от меня спасибо скажи: мне этот молуль как-то помог… Хотя я в нём тоже что-то правил… :-)
ak847
Друзья, прошу помощи.

Стабильно не открываются определенные сайты. Попробовал их протрейсить.

Tracert c первого хопа выводит звездочки. Фаерволов нет. Проблема возникла после завирусовки компа. Вирусы вычистил, но проблема осталась. Где искать причину? Как исправить?

Заранее всем спасибо.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB