Поиск локальных IP-адресов с использованием Python's stdlib - PullRequest
480 голосов
/ 03 октября 2008

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

Ответы [ 43 ]

2 голосов
/ 08 июня 2012
import socket
socket.gethostbyname(socket.getfqdn())
2 голосов
/ 26 апреля 2012

Мне пришлось решить проблему «Определить, является ли IP-адрес локальным или нет», и моей первой мыслью было создать список IP-адресов, которые были локальными, а затем сопоставить их. Это то, что привело меня к этому вопросу. Однако позже я понял, что есть более простой способ сделать это: попробуйте привязать этот IP и посмотреть, работает ли он.

_local_ip_cache = []
_nonlocal_ip_cache = []
def ip_islocal(ip):
    if ip in _local_ip_cache:
        return True
    if ip in _nonlocal_ip_cache:
        return False
    s = socket.socket()
    try:
        try:
            s.bind((ip, 0))
        except socket.error, e:
            if e.args[0] == errno.EADDRNOTAVAIL:
                _nonlocal_ip_cache.append(ip)
                return False
            else:
                raise
    finally:
        s.close()
    _local_ip_cache.append(ip)
    return True

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

1 голос
/ 06 апреля 2016

Версия Python 3.4, использующая недавно представленный пакет asyncio.

async get_local_ip():
    loop = asyncio.get_event_loop()
    transport, protocol = await loop.create_datagram_endpoint(
        asyncio.DatagramProtocol,
        remote_addr=('8.8.8.8', 80))
    result = transport.get_extra_info('sockname')[0])
    transport.close()
    return result

Это основано на превосходном ответе UnkwnTech .

1 голос
/ 17 апреля 2012

Хорошо, так что это специфично для Windows и требует установки модуля WMI на python, но это выглядит гораздо менее хакерским, чем постоянная попытка вызова внешнего сервера. Это просто еще один вариант, поскольку уже есть много хороших, но он может хорошо подойти для вашего проекта.

Import WMI

def getlocalip():
    local = wmi.WMI()
    for interface in local.Win32_NetworkAdapterConfiguration(IPEnabled=1):
        for ip_address in interface.IPAddress:
            if ip_address != '0.0.0.0':
                localip = ip_address
    return localip







>>>getlocalip()
u'xxx.xxx.xxx.xxx'
>>>

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

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

Для получения списка IP-адресов в системах * nix,

import subprocess
co = subprocess.Popen(['ifconfig'], stdout = subprocess.PIPE)
ifconfig = co.stdout.read()
ip_regex = re.compile('((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-4]|2[0-5][0-9]|[01]?[0-9][0-9]?))')
[match[0] for match in ip_regex.findall(ifconfig, re.MULTILINE)]

Хотя этот ответ немного запоздал, я подумал, что кто-то еще может найти его полезным: -)

PS: будут возвращены широковещательные адреса и маска сети.

0 голосов
/ 26 апреля 2019

Для linux env прочитайте / proc / net / tcp, второй (локальный адрес) и третий (удаленный адрес) дадут IP в формате hexa.

Совет. Если второй столбец обнуляется (00000000: 0000), значит, это порт прослушивания:)

https://github.com/romol0s/python/blob/master/general/functions/getTcpListenIpsByPort.py

https://www.kernel.org/doc/Documentation/networking/proc_net_tcp.txt

0 голосов
/ 01 декабря 2013

Простой, но сладкий!

def getip():

    import socket
    hostname= socket.gethostname()
    ip=socket.gethostbyname(hostname)

    return(ip)
0 голосов
/ 24 апреля 2019

Еще один вариант предыдущих ответов можно сохранить в исполняемый скрипт с именем my-ip-to:

#!/usr/bin/env python

import sys, socket

if len(sys.argv) > 1:
    for remote_host in sys.argv[1:]:
        # determine local host ip by outgoing test to another host
        # use port 9 (discard protocol - RFC 863) over UDP4
        with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
            s.connect((remote_host, 9))
            my_ip = s.getsockname()[0]
            print(my_ip, flush=True)
else:
    import platform

    my_name = platform.node()
    my_ip = socket.gethostbyname(my_name)
    print(my_ip)

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

$ my-ip-to z.cn g.cn localhost
192.168.11.102
192.168.11.102
127.0.0.1
$

И печатать лучшую ставку, когда аргумент не указан.

$ my-ip-to
192.168.11.102
0 голосов
/ 23 июня 2011

Машина может иметь несколько сетевых интерфейсов (включая локальную обратную связь 127.0.0.1), которую вы упомянули. Что касается ОС, то это также «реальный IP-адрес».

Если вы хотите отслеживать все интерфейсы, взгляните на следующий пакет Puthon: http://alastairs -place.net / netifaces /

Я думаю, что вы можете избежать возврата gethostbyname 127.0.0.1, если пропустите запись loopback из вашего файла hosts. (подлежит проверке).

0 голосов
/ 20 июля 2017
import socket
print(socket.gethostbyname(socket.getfqdn()))
...