Как я могу выполнить ping или traceroute, используя родной python? - PullRequest
6 голосов
/ 20 июля 2009

Я хотел бы иметь возможность выполнять пинг и трассировку из Python без необходимости выполнения соответствующих команд оболочки, поэтому я бы предпочел собственное решение Python.

Ответы [ 7 ]

8 голосов
/ 11 августа 2011

Если вы не возражаете против использования внешнего модуля и без использования UDP или TCP, scapy - простое решение:

from scapy.all import *
target = ["192.168.1.254"]
result, unans = traceroute(target,l4=UDP(sport=RandShort())/DNS(qd=DNSQR(qname="www.google.com")))

Или вы можете использовать версию TCP

from scapy.all import *
target = ["192.168.1.254"]
result, unans = traceroute(target,maxttl=32)

Обратите внимание, что вам нужно будет запустить scapy от имени пользователя root, чтобы иметь возможность выполнять эти задачи, иначе вы получите:

socket.error: [Errno 1] Operation not permitted
3 голосов
/ 27 июля 2015

Библиотека Webb очень удобна для выполнения всех видов извлечений, связанных с сетью ... и с ее помощью можно легко выполнить ping и traceroute. Просто укажите URL-адрес, по которому вы хотите отследить маршрут:

import webb
webb.traceroute("your-web-page-url")

Если вы хотите автоматически сохранить журнал traceroute в текстовом файле, используйте следующую команду:

webb.traceroute("your-web-page-url",'file-name.txt')

Аналогичным образом IP-адрес URl (сервера) можно получить с помощью следующих строк кода:

print(webb.get_ip("your-web-page-url"))

Надеюсь, это поможет!

3 голосов
/ 20 июля 2009

Запуск интерпретаторов от имени root часто вызывает недовольство по соображениям безопасности (и, конечно, вам НУЖНО иметь разрешение root для доступа к «сырым» соединениям, как это требуется спецификациями ICMP ping и traceroute!), Но если у вас нет проблемы с этим не сложны - например, этот пост дает работоспособный пинг, а старая страница Джереми Хилтона имеет все еще используемый базовый код для ICMP (как ping, так и traceroute), хотя написан для очень старых версий Python и нуждается в небольшой подтяжке лица, чтобы сиять современными - но концепции есть в обоих URL-адресах, которые я вам дал!

0 голосов
/ 14 февраля 2019

Пакет mtrpacket можно использовать для отправки сетевых проб, которые могут выполнять пинг или трассировку. Поскольку он использует бэкэнд для инструмента командной строки mtr, он не требует, чтобы ваш скрипт выполнялся от имени пользователя root.

Он также использует цикл событий Asyncio, так что вы можете иметь несколько текущих трассировок или эхо-запросов одновременно и обрабатывать их результаты по мере их завершения.

Вот скрипт Python для трассировки на example.com:

import asyncio
import mtrpacket

async def trace():
    async with mtrpacket.MtrPacket() as mtr:
        for ttl in range(1, 256):
            result = await mtr.probe('example.com', ttl=ttl)
            print(result)

            if result.success:
                break

asyncio.get_event_loop().run_until_complete(trace())

Цикл с 'ttl' используется, потому что «время жизни» исходящего пакета определяет количество сетевых скачков, которые будет проходить пакет до истечения срока его действия, и отправки ошибки обратно в исходный источник.

0 голосов
/ 27 марта 2013

Я написал простой tcptraceroute на python, который не нуждается в привилегиях root http://www.thomas -guettler.de / scripts / tcptraceroute.py.txt

Но он не может отображать IP-адреса промежуточных прыжков. Но иногда это полезно, так как вы можете догадаться, где находится блокирующий брандмауэр: либо в начале, либо в конце маршрута.

0 голосов
/ 04 июня 2010

ICMP Ping является стандартным компонентом протокола ICMP.

Traceroute использует функции ICMP и IP для определения пути через значения времени жизни. Используя значения TTL, вы можете выполнять трассировку в различных протоколах, пока работает IP / ICMP, поскольку именно сообщения ICMP TTL EXceeded сообщают вам о прыжке в пути.

Если вы попытаетесь получить доступ к порту, где нет прослушивателя, по правилам протокола ICMP хост должен отправить сообщение ICMP Port Unreachable.

0 голосов
/ 20 июля 2009

Вы можете проверить пакет scapy . это швейцарский армейский нож сетевых инструментов для python.

...