Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Network
  • » как получить шлюз по умолчанию, ping, tracert [RSS Feed]

#1 Май 19, 2009 16:12:25

qman
От:
Зарегистрирован: 2007-07-02
Сообщения: 444
Репутация: +  0  -
Профиль   Отправить e-mail  

как получить шлюз по умолчанию, ping, tracert

Всем привет,
1) подскажите возможно ли на питоне получить шлюз по умолчанию?
Пока вижу только решение - запускать процесс

cmd /c "route print"
и выводимый им ответ - разобрать, в куче которого будет шлю по умолчанию.
Вобщем как получить шлюз по умолчанию.
2) возможно ли на питоне делать подобное ping и tracert, а также анализировать ходят пинги или нет? Для tracert возможно ли получить список имент хостов через которые прошел пакет?
Скрипты должны работать под windows xp.
Спасибо за советы



Офлайн

#2 Май 19, 2009 23:11:15

truporez
От:
Зарегистрирован: 2009-05-08
Сообщения: 266
Репутация: +  6  -
Профиль   Адрес электронной почты  

как получить шлюз по умолчанию, ping, tracert

про пинг вот тема http://python.su/forum/viewtopic.php?id=30



Офлайн

#3 Май 20, 2009 09:44:17

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

как получить шлюз по умолчанию, ping, tracert

Присоединяюсь к вопросу насчет tracert. На днях пытался искать. Был один пример, но под виндой не завелся. Хотелось бы pure python :)



Офлайн

#4 Май 20, 2009 16:01:21

truporez
От:
Зарегистрирован: 2009-05-08
Сообщения: 266
Репутация: +  6  -
Профиль   Адрес электронной почты  

как получить шлюз по умолчанию, ping, tracert

здесь есть рабочий traceroute:
http://pypi.python.org/pypi/pyip/0.7



Офлайн

#5 Май 20, 2009 20:34:45

qman
От:
Зарегистрирован: 2007-07-02
Сообщения: 444
Репутация: +  0  -
Профиль   Отправить e-mail  

как получить шлюз по умолчанию, ping, tracert

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>
Может народ объяснит в чем я ошибаюсь?
Как получить на питоне список хостов через которые проходит пакет?



Отредактировано (Май 20, 2009 20:41:04)

Офлайн

#6 Май 21, 2009 08:42:33

truporez
От:
Зарегистрирован: 2009-05-08
Сообщения: 266
Репутация: +  6  -
Профиль   Адрес электронной почты  

как получить шлюз по умолчанию, ping, tracert

для наглядности лучше цель выбрать подальше. а то что трассировать не прекращает - надо код смотреть. почему-то не срабатывает icmp_reply.get_type() == icmp.ICMP_UNREACH.

получить список хостов - как вариант в месте отладки вместо print влепить добавление к списку. и по окончанию трассировки его возвращать.



Офлайн

#7 Май 29, 2009 06:37:39

qman
От:
Зарегистрирован: 2007-07-02
Сообщения: 444
Репутация: +  0  -
Профиль   Отправить e-mail  

как получить шлюз по умолчанию, ping, tracert

Всем привет,
у меня 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. сам я новичок, в питоне не силен.



Отредактировано (Май 29, 2009 06:40:01)

Офлайн

#8 Май 29, 2009 08:04:36

qman
От:
Зарегистрирован: 2007-07-02
Сообщения: 444
Репутация: +  0  -
Профиль   Отправить e-mail  

как получить шлюз по умолчанию, ping, tracert

Весь код

#
# 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])



Офлайн

#9 Май 29, 2009 09:31:05

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

как получить шлюз по умолчанию, ping, tracert

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. И вообще, от меня спасибо скажи: мне этот молуль как-то помог… Хотя я в нём тоже что-то правил… :-)



Отредактировано (Май 29, 2009 09:36:56)

Офлайн

#10 Фев. 5, 2010 19:59:15

ak847
От:
Зарегистрирован: 2010-02-05
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

как получить шлюз по умолчанию, ping, tracert

Друзья, прошу помощи.

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

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

Заранее всем спасибо.



Офлайн

  • Начало
  • » Network
  • » как получить шлюз по умолчанию, ping, tracert[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version