Как я могу найти локальные IP-адреса (то есть 192.168.xx или 10.0.xx) на платформе Python независимо и используя только стандартную библиотеку?
python
networking
ip-address
UnkwnTech
источник
источник
ifconfig -a
и использовать вывод оттуда ...ip addr
она гораздо более удобна (и ее легче анализировать, загружать).bind
сокету для конкретного интерфейса, то это вопрос политики. Если локальный IP-адрес необходим для передачи его одноранговому узлу, чтобы одноранговый узел мог «перезвонить», т. Е. Чтобы открыть соединение с локальной машиной, тогда ситуация зависит от того, есть ли NAT (трансляция сетевых адресов) коробки между ними. Если нет NAT,getsockname
это хороший выбор.Ответы:
Это не всегда будет работать (возвращается
127.0.0.1
на машинах с именем хоста в виде/etc/hosts
as127.0.0.1
), вместо того, чтобы показать gimel, следует использовать palitationsocket.getfqdn()
. Конечно, вашей машине нужно разрешаемое имя хоста.источник
socket.gethostbyname_ex(socket.gethostname())[-1]
Я только что нашел это, но это кажется немного хакерским, однако, говорят, попробовал это на * nix, а я сделал на Windows, и это сработало.
Это предполагает, что у вас есть доступ в Интернет, и что нет локального прокси.
источник
Этот метод возвращает «основной» IP-адрес локального ящика (тот, который имеет маршрут по умолчанию) .
Python 3 или 2:
Это возвращает единственный IP, который является основным (тот с маршрутом по умолчанию). Если вместо этого вам нужны все IP-адреса, подключенные ко всем интерфейсам (включая localhost и т. Д.), Посмотрите этот ответ .
Если вы находитесь за брандмауэром NAT, таким как домашний Wi-Fi, тогда он не будет показывать ваш общедоступный IP-адрес NAT, а вместо этого будет использовать ваш частный IP-адрес в локальной сети, который имеет маршрут по умолчанию к локальному маршрутизатору WIFI; Чтобы получить внешний IP-адрес вашего маршрутизатора Wi-Fi, потребуется либо запустить его в поле THAT, либо подключиться к внешней службе, такой как whatismyip.com/whatismyipaddress.com, которая может отражать IP-адрес ... но это полностью отличается от первоначального вопроса. :)
источник
socket.gethostbyname(socket.gethostname())
дает ужасные результаты.Как называется псевдоним
myip
, это должно работать везде:То же, что и выше, но только код Python:
Версия, которая также будет работать в локальных сетях без подключения к интернету:
(спасибо @ccpizza )
Фон :
Использование
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-адреса, вероятно, является одновременно более надежным и надежным, чем любой из перечисленных здесь методов.
источник
socket.getaddrinfo()
должно работать согласованно на всех платформах - но я проверял это только в Linux, не заботясь о других операционных системах./etc/resolve.conf: No such file or directory
и у меня есть локальный адрес IPv4, показанныйifconfig
.Вы можете использовать модуль netifaces . Просто введите:
в командной оболочке, и он будет установлен по умолчанию при установке Python.
Тогда вы можете использовать это так:
На моем компьютере было напечатано:
Автор этого модуля утверждает, что он должен работать в Windows, UNIX и Mac OS X.
источник
Метод Socket API
см. https://stackoverflow.com/a/28950776/711085
Недостатки:
Рефлекторный метод
(Обратите внимание, что это не отвечает на вопрос OP о локальном IP-адресе, например, 192.168 ...; он дает вам ваш публичный IP-адрес, который может быть более желательным в зависимости от варианта использования.)
Вы можете запросить какой-нибудь сайт, например whatismyip.com (но с API), например:
или если используется python2:
Преимущества:
Недостатки (и обходные пути):
редактировать : Хотя изначально я думал, что эти методы были действительно плохими (если вы не используете много запасных вариантов, код может быть неактуальным через много лет), он ставит вопрос «что такое Интернет?». Компьютер может иметь много интерфейсов, указывающих на множество различных сетей. Для более подробного описания темы, Google для
gateways and routes
, Компьютер может иметь доступ к внутренней сети через внутренний шлюз или к всемирной сети через шлюз, например, на маршрутизаторе (обычно это так). Локальный IP-адрес, о котором запрашивает OP, четко определен только для одного канального уровня, поэтому вы должны указать это («речь идет о сетевой карте или кабеле Ethernet, о которых мы говорим?») , На поставленный вопрос может быть несколько неуникальных ответов. Однако глобальный IP-адрес во всемирной сети, вероятно, четко определен (в отсутствие массовой фрагментации сети): возможно, обратный путь через шлюз, который может получить доступ к TLD.источник
Если у компьютера есть маршрут к Интернету, он всегда будет работать для получения предпочтительного локального IP-адреса, даже если / etc / hosts настроена неправильно.
источник
8.8.8.8
Является Google DNS - сервер , мы можем сделать это с локальным сервером DNS?В Linux:
источник
ioctl
). Сокет не ограничен интерфейсом, для которого вы хотите узнать информацию об адресе, - это просто механизм связи между пользовательским пространством и ядром. en.wikipedia.org/wiki/Ioctl lxr.free-electrons.com/source/net/socket.cstruct.pack('16sH14s', iface, socket.AF_INET, '\x00'*14)
должна быть заменена наstruct.pack('16sH14s', iface.encode('utf-8'), socket.AF_INET, b'\x00'*14)
ioctl
- это устаревший интерфейс, я не верю, что поддерживает IPv6 и, вероятно, никогда не будет. Я думаю, что «правильный» путь - через Netlink, который не очень прост в Python. Я думаю, что libc должна иметь функцию, кgetifaddrs
которой можно получить доступ черезctypes
модуль pythons,я использую следующий модуль:
Протестировано с Windows и Linux (и не требует дополнительных модулей для них), предназначенных для использования в системах, которые находятся в одной локальной сети на основе IPv4.
Фиксированный список имен интерфейсов не работает для последних версий Linux, которые приняли изменение systemd v197 в отношении предсказуемых имен интерфейсов, как указал Александр . В таких случаях вам необходимо вручную заменить список именами интерфейсов в вашей системе или использовать другое решение, такое как netifaces .
источник
enp0s25
. Для получения дополнительной информации см. Wiki.archlinux.org/index.php/Network_Configuration#Device_namesstruct.pack('256s', bytes(ifname[:15]))
Я использую это на моих машинах Ubuntu:
Это не работает
источник
Если вы не хотите использовать внешние пакеты и не хотите полагаться на внешние интернет-серверы, это может помочь. Это пример кода, который я нашел в поиске кода Google и изменил для получения необходимой информации:
Применение:
Как и полагается
windll
, это будет работать только на Windows.источник
На Debian (проверено), и я подозреваю, что большинство Linux ..
На MS Windows (проверено)
источник
hostname: illegal option -- I\nusage: hostname [-fs] [name-of-host]
Версия, которую я не верю, была опубликована. Я тестировал с python 2.7 на Ubuntu 12.04.
Нашел это решение по адресу: http://code.activestate.com/recipes/439094-get-the-ip-address-associated-with-a-network-inter/
Пример результата:
источник
Вариация на ответ ниндзягецко. Это должно работать в любой локальной сети, которая разрешает широковещательную рассылку UDP и не требует доступа к адресу в локальной сети или в Интернете.
источник
<broadcast>
действительное имя хоста? !! Сколько таких словесных имен хостов допустимо?Боюсь, что не существует хороших независимых от платформы способов сделать это, кроме как подключиться к другому компьютеру и заставить его отправить вам ваш IP-адрес. Например: findmyipaddress . Обратите внимание, что это не будет работать, если вам нужен IP-адрес, который находится за NAT, если только компьютер, к которому вы подключаетесь, не находится за NAT.
Вот одно решение, которое работает в Linux: получить IP-адрес, связанный с сетевым интерфейсом .
источник
Один простой способ произвести «чистый» вывод через утилиты командной строки:
Он покажет все IPv4-адреса в системе.
источник
К вашему сведению, я могу убедиться, что метод:
Работает в OS X (10.6,10.5), Windows XP и на хорошо управляемом сервере отдела RHEL. Он не работал на очень минимальной виртуальной машине CentOS, на которой я просто взломал ядро. Так что для этого экземпляра вы можете просто проверить адрес 127.0.0.1 и в этом случае сделать следующее:
А затем проанализировать IP-адрес из вывода. Следует отметить, что ifconfig не входит в PATH обычного пользователя по умолчанию, и поэтому я даю полный путь в команде. Надеюсь, это поможет.
источник
Это вариант ответа UnkwnTech - он предоставляет
get_local_addr()
функцию, которая возвращает основной IP-адрес локальной сети хоста. Я публикую его, потому что это добавляет ряд вещей: поддержку ipv6, обработку ошибок, игнорирование адресов localhost / linklocal и использование адреса TESTNET (rfc5737) для подключения.источник
None
get_local_addr(remove="www.google.com")
возвращение? Регистрацияsocket.error
выброса с помощью _get_local_addr () может помочь в диагностике.источник
['fe80::34e8:fe19:1459:2cde%22','fe80::d528:99fb:d572:e289%12', '192.168.56.1', '192.168.1.2']
на рабочий стол Windows.Это будет работать на большинстве Linux-коробок:
источник
Этот ответ является моей личной попыткой решить проблему получения IP-
socket.gethostbyname(socket.gethostname())
адреса локальной сети, так как также возвращается 127.0.0.1. Этот метод не требует подключения к Интернету только через локальную сеть. Код для Python 3.x, но может быть легко преобразован для 2.x. Использование UDP Broadcast:источник
127.0.1.1
это ваш реальный IP адрес. Вообще говоря, компьютер может иметь любое количество IP-адресов. Вы можете отфильтровать их для частных сетей - 127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12 и 192.168.0.0/16.Однако кроссплатформенного способа получения всех IP-адресов не существует. В Linux вы можете использовать
SIOCGIFCONF
ioctl.источник
Небольшое уточнение версии команд, которая использует команду IP и возвращает адреса IPv4 и IPv6:
источник
Ну, вы можете использовать команду «ip route» в GNU / Linux, чтобы узнать ваш текущий IP-адрес.
Это показывает IP, данный интерфейсу сервером DHCP, работающим на маршрутизаторе / модеме. Обычно «192.168.1.1/24» - это IP-адрес для локальной сети, где «24» означает диапазон возможных IP-адресов, заданных сервером DHCP в пределах диапазона маски.
Вот пример: обратите внимание, что PyNotify является лишь дополнением, чтобы понять мою точку зрения и не требуется вообще
Преимущество этого в том, что вам не нужно указывать сетевой интерфейс. Это очень полезно при запуске сервера сокетов
Вы можете установить PyNotify, используя easy_install или даже Pip:
или
или внутри скрипта / интерпретатора Python
источник
Если вы ищете IPV4-адрес, отличный от вашего IP-адреса локального хоста
127.0.0.1
, вот хороший фрагмент кода Python:Который также можно записать в одну строку:
Даже если вы кладете
localhost
в/etc/hostname
код все равно будет давать свой локальный IP - адрес.источник
Для Linux, вы можете просто использовать
check_output
вhostname -I
системных командах , как так:источник
Примечание: это не использует стандартную библиотеку, но довольно просто.
$ pip install pif
источник
netifaces доступен через pip и easy_install. (Я знаю, это не в базе, но это может стоить установки.)
netifaces имеет некоторые странности на разных платформах:
Вот код netifaces для игры:
Приведенный выше код не отображает адрес обратно на имя его интерфейса (полезно для генерации правил ebtables / iptables на лету). Итак, вот версия, которая хранит вышеуказанную информацию с именем интерфейса в кортеже:
И нет, я не влюблен в списки. Просто так работает мой мозг в эти дни.
Следующий фрагмент напечатает все это:
Наслаждайтесь!
источник
Версия Python 3.4, использующая недавно представленный пакет asyncio.
Это основано на превосходном ответе UnkwnTech .
источник
Чтобы получить IP-адрес, вы можете использовать команду оболочки прямо в Python :
источник