Python узнать ip адрес

Python узнать ip адрес

Модуль ipaddress упрощает работу с IP-адресами.

С версии Python 3.3 модуль ipaddress входит в стандартную библиотеку Python.

ipaddress.ip_address() ¶

Функция ipaddress.ip_address() позволяет создавать объект IPv4Address или IPv6Address соответственно:

У объекта есть несколько методов и атрибутов:

С помощью атрибутов is_ можно проверить, к какому диапазону принадлежит адрес:

С полученными объектами можно выполнять различные операции:

ipaddress.ip_network() ¶

Функция ipaddress.ip_network() позволяет создать объект, который описывает сеть (IPv4 или IPv6):

Как и у адреса, у сети есть различные атрибуты и методы:

Метод hosts() возвращает генератор, поэтому, чтобы посмотреть все хосты, надо применить функцию list:

Метод subnets позволяет разбивать на подсети. По умолчанию он разбивает сеть на две подсети:

Параметр prefixlen_diff позволяет указать количество бит для подсетей:

С помощью параметра new_prefix можно указать, какая маска должна быть у подсетей:

По IP-адресам в сети можно проходиться в цикле:

Или обращаться к конкретному адресу:

Таким образом можно проверять, находится ли IP-адрес в сети:

ipaddress.ip_interface() ¶

Функция ipaddress.ip_interface() позволяет создавать объект IPv4Interface или IPv6Interface соответственно:

Используя методы объекта IPv4Interface, можно получать адрес, маску или сеть интерфейса:

Пример использования модуля¶

Так как в модуль встроены проверки корректности адресов, можно ими пользоваться, например, чтобы проверить, является ли адрес адресом сети или хоста:

Как я могу найти локальные IP-адреса (т. е. 192.168.x. x или 10.0.x. x) в платформе Python самостоятельно и с использованием только стандартной библиотеки?

30 ответов:

Это не будет работать всегда (возвращает 127.0.0.1 на машинах, имеющих имя в /etc/hosts как 127.0.0.1 ), палиатив будет то, что показывает гимель, используйте . Конечно, ваша машина нуждается в разрешимом имени хоста.

Я только что нашел это, но это кажется немного хакерским, однако они говорят, что попробовали его на *nix, и я сделал на windows, и это сработало.

это предполагает, что у вас есть доступ в интернет, и что нет локального прокси-сервера.

как псевдоним называется myip , это должно работать везде:

  • корректно работает с Python 2.x, Python 3.X, современные и старые дистрибутивы Linux, OSX / macOS и Windows для поиска текущего адреса IPv4.
  • не вернет правильный результат для машин с несколькими IP-адресами, IPv6, без настроенного IP-адреса или без доступа в интернет.
Читайте также:  Что значит платиновый альбом

то же, что и выше, но только питон код:

  • это вызовет исключение, если IP-адрес не настроен.

версия, которая также будет работать на локальных сетях без подключения к интернету:

фон:

используя socket.gethostbyname(socket.gethostname()) не работал здесь, потому что один из компьютеров, на котором я был, имел /etc/hosts с повторяющимися записями и ссылки на себя. socket.gethostbyname() возвращает только последнюю запись в /etc/hosts .

это была моя первая попытка, которая отсеивает все адреса, начиная с "127." :

это работает с Python 2 и 3, на Linux и Windows, но не имеет дело с несколькими сетевыми устройствами или IPv6. Однако он перестал работать на последних дистрибутивах Linux, поэтому я попробовал этот альтернативный метод вместо этого. Он пытается подключиться к DNS-серверу Google по адресу 8.8.8.8 в порт 53 :

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

С ростом популярности IPv6 и для серверов с несколькими сетевыми интерфейсами использование стороннего модуля Python для поиска IP-адреса, вероятно, является более надежным и надежным, чем любой из перечисленных здесь методов.

этот метод возвращает" первичный " IP на локальном поле (тот, который имеет маршрут по умолчанию).

  • не нужен маршрутизируемый сетевой доступ или любое соединение вообще.
  • работает, даже если все интерфейсы отключены от сети.
  • не нужно или даже пытаться получить нигде.
  • работает с NAT, публичными, частными, внешними и внутренними IP-адресами
  • чистый питон 2 (или 3) без внешнего зависимости.
  • работает на Linux, Windows и OSX.

Это возвращает один IP, который является основным (тот, с маршрутом по умолчанию). Если вам нужно вместо этого все IP-адреса, подключенные ко всем интерфейсам (включая localhost и т. д.), см. ответ.

Если вы находитесь за брандмауэром NAT, как ваш wifi box дома, то это не покажет ваш публичный NAT IP, но вместо этого ваш частный NAT IP на локальном сеть, которая имеет маршрут по умолчанию для вашего локального маршрутизатора WIFI; получение внешнего IP-адреса вашего маршрутизатора wifi либо потребует запуска этого на этом поле, либо подключения к внешней службе, такой как whatismyip.com/whatismyipaddress.com это может отражать обратно IP. но это совершенно отличается от первоначального вопроса. 🙂

Читайте также:  На смартфоне не работает кнопка назад

обновленный connect () вызов по предложению Педро в комментариях. (Если вам нужна конкретная лицензия, это общественное достояние / бесплатно для любого использования, или MIT / CC2-BY-SA для каждой лицензии на код/контент переполнения стека по вашему выбору.)

можно использовать netifaces модуль. Просто введите:

в командной оболочке, и он будет установлен на Установка Python по умолчанию.

тогда вы можете использовать его следующим образом:

на моем компьютере она напечатала:

автор этого модуля утверждает, что он должен работать на Windows, UNIX и Mac OS X.

метод API сокета

  • не кросс-платформенный.
  • требуется больше резервного кода, привязанного к наличию определенных адресов в интернете
  • это также не будет работать, если вы находитесь за NAT
  • вероятно, создает соединение UDP, не зависящее от доступности DNS (обычно ISP) (см. другие ответы на такие идеи, как использование 8.8.8.8: сервер Google (по совпадению также DNS))
  • убедитесь, что адрес назначения недоступен, например, числовой IP-адрес, который гарантированно не используется. Не используйте некоторые домены, как fakesubdomain.google.com или somefakewebsite.com; вы все равно будете спамить эту партию (сейчас или в будущем), а также спамить свои собственные сетевые коробки.

отражатель метод

(обратите внимание, что это не отвечает на вопрос OP о локальном IP-адресе, например 192.168. ; это дает вам ваш публичный IP-адрес, который может быть более желательным в зависимости от варианта использования.)

вы можете запросить какой-то сайт, как whatismyip.com (но с API), например:

или при использовании python2:

  • одним из преимуществ этого метода является кросс-платформы
  • он работает из-за уродливых Натс (например, ваш домашний маршрутизатор).

недостатки (и их решения):

  • требуется, чтобы этот сайт был включен, формат не менялся (почти наверняка не будет), а ваши DNS-серверы работали. Можно уменьшить эту проблему, также запрашивая другие сторонние отражатели IP-адресов в случае сбоя.
  • возможный вектор атаки, если вы не запрашиваете несколько отражателей (чтобы предотвратить скомпрометированный отражатель от вас, что ваш адрес-это то, чего нет), или если вы не используете HTTPS (чтобы предотвратить атаку человека в середине, притворяющуюся сервером)
Читайте также:  Несвязанные аннотации autocad убрать

edit: хотя изначально я думал, что эти методы были действительно плохими (если вы не используете много резервных копий, код может быть неуместным через много лет), он ставит вопрос "Что такое интернет?". Компьютер может иметь множество интерфейсов, указывающих на множество различных сетей. Для более подробного описания тема, Google для gateways and routes . Компьютер может иметь доступ к внутренней сети через внутренний шлюз или к всемирной паутине через шлюз, например, на маршрутизаторе (обычно это так). Локальный IP-адрес, о котором спрашивает OP, четко определен только в отношении одного уровня канала, поэтому вам нужно указать это ("это сетевая карта или кабель ethernet, о котором мы говорим?"). На этот вопрос может быть несколько неуникальных ответов. Однако в глобальных системах охраны ИС адрес во всемирной паутине, вероятно, хорошо определен (в отсутствие массовой фрагментации сети): вероятно, обратный путь через шлюз, который может получить доступ к дву.

В документации нашел socket.gethostbyname(socket.gethostname()) . Но у меня выдает ошибку. Не работает gethostbyname , не знаю почему. Версия питона 3.2. Подскажите, из-за чего может не работать или другое решение поставленной задачи.

6 ответов 6

Чтобы узнать свой публичный IP адрес, можно DNS запрос сделать, например на Windows:

Достоинства DNS по сравнению с HTTP, чтобы свой внешний IP адрес узнать:

  • шансов что DNS сервис дольше жить будет больше (практика это подтверждает: достаточно на старые ответы на похожие вопросы посмотреть—за годы многие http-сервисы возвращающие IP адрес компьютера в интернете пришли и ушли)
  • DNS имеет стандартный результат (формат вывода со временем стабильный)—больше шансов ваша программа правильно продолжит результат распознавать со временем
  • DNS запрос как правило быстрее чем HTTP запрос—если это имеет значение в вашем случае.
Ссылка на основную публикацию
Html элементы в тексте указаны некорректно
Валидация является одним из самых важных аспектов хорошего веб-дизайна. Давайте рассмотрим, что это такое и как проверить HTML код на...
300 Символов это сколько слов
Счетчики букв Это бесплатный онлайн калькулятор, который подсчитывает количество символов или букв в тексте, что понадобится при публикациях в Twitter...
503 Not allowed access taskalfa 181
Логин-пасс по умолчанию: с пульта – 2800, web – admin00 Перевод в импульсный режим – только через инженерное меню (в...
Icare data recovery как пользоваться
Неразрушающее восстановление данных, которое позволяет извлекать удаленные, отформатированные или потерянные иным путем данные с ПК и съемных устройств хранения данных....
Adblock detector