Python найти первый сетевой прыжок - PullRequest
1 голос
/ 10 февраля 2011

Мне нужно найти первый сетевой переход в программе на Python для Linux. Я не могу просто полагаться на то, что шлюз по умолчанию является первым прыжком, потому что некоторые сетевые программы на коробке могут (или не могут) вставлять перехват всех маршрутов:

0.0.0.0/1
128.0.0.0/1

Я думал о том, чтобы открыть tracepath -m 1 <some ip> и проанализировать вывод, но мне не нравится зависеть от формата вывода другой программы. Чтение таблицы маршрутизации из / proc и применение к ней логики маршрутизации, я думаю, немного выходит за рамки моих возможностей сценариев, хотя я, вероятно, попробую ее в какой-то момент. Есть ли более простой способ (кто-то еще изобрел это колесо в модуле, о котором я не знаю)?

1 Ответ

1 голос
/ 10 февраля 2011

Что делают маршруты «поймать все»? Если это просто маршруты шлюзов, поиск маршрута все равно будет работать. Вы можете сделать что-то вроде:

$ ip route get <ip> | head -1 | awk '{ print $3 }'

Это напечатало бы адрес шлюза для маршрута без связи:

$ ip route get 8.8.8.8 | head -1 | awk '{ print $3 }'
192.168.0.1

... или имя интерфейса для связанного маршрута:

$ ip route get 192.168.0.2 | head -1 | awk '{ print $3 }'
eth0

И, кстати (как и следует из моего ответа), я согласен с комментарием о том, что принцип , а не , опирающийся на внешнюю программу, в этом случае слишком осторожен. =) Сомневаюсь, что вывод ip изменится.

Лично я бы использовал поиск маршрута, поскольку tracepath или traceroute полагался бы на хост 1-го перехода, который фактически отправлял бы вам сообщение TTL expired ICMP (оно могло бы его отбросить). Я не знаю, какой у вас вариант использования.

Если вам нужна библиотека python для этого, я бы посмотрел на libdnet .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...