Определить IP-адрес CONNECTED интерфейса (Linux) в Python - PullRequest
1 голос
/ 07 октября 2010

На моей машине linux 1 из 3 сетевых интерфейсов может быть фактически подключен к Интернету.Мне нужно получить IP-адрес подключенного в данный момент интерфейса, учитывая, что другим двум моим интерфейсам могут быть назначены IP-адреса, но они не могут быть подключены.определить, какой из них имеет подключение, но я хотел бы получить это быстрее, чем ждать истечения времени пинга.И я бы не хотел полагаться на работоспособность внешнего веб-сайта.

Обновление:

Все мои интерфейсы могут иметь IP-адреса и шлюзы.Это для встроенного устройства.Поэтому мы позволяем пользователю выбирать между, скажем, eth0 и eth1.Но если на интерфейсе нет соединения, которое пользователь говорит нам использовать, мы отступаем, чтобы сказать eth2, который (в теории) всегда будет работать.

Итак, мне нужно сначала проверить,выбор пользователя связан, и если да, верните этот IP.В противном случае мне нужно получить IP eth2.Я могу получить IP-адреса интерфейсов просто отлично, он просто определяет, какой из них действительно подключен.

Ответы [ 2 ]

0 голосов
/ 07 октября 2010

решение здесь: http://code.activestate.com/recipes/439093-get-names-of-all-up-network-interfaces-linux-only/


import fcntl
import array
import struct
import socket
import platform
"""
global constants.  If you don't like 'em here,
move 'em inside the function definition.
"""
SIOCGIFCONF = 0x8912
MAXBYTES = 8096

def localifs():
    """
    Used to get a list of the up interfaces and associated IP addresses
    on this machine (linux only).

    Returns:
    List of interface tuples.  Each tuple consists of
    (interface name, interface IP)
    """
    global SIOCGIFCONF
    global MAXBYTES

    arch = platform.architecture()[0]

    # I really don't know what to call these right now
    var1 = -1
    var2 = -1
    if arch == '32bit':
        var1 = 32
        var2 = 32
    elif arch == '64bit':
        var1 = 16
        var2 = 40
    else:
        raise OSError("Unknown architecture: %s" % arch)

    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    names = array.array('B', '\0' * MAXBYTES)
    outbytes = struct.unpack('iL', fcntl.ioctl(
        sock.fileno(),
        SIOCGIFCONF,
        struct.pack('iL', MAXBYTES, names.buffer_info()[0])
        ))[0]

    namestr = names.tostring()
    return [(namestr[i:i+var1].split('\0', 1)[0], socket.inet_ntoa(namestr[i+20:i+24])) \
            for i in xrange(0, outbytes, var2)]


print localifs()

0 голосов
/ 07 октября 2010

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

...