Определить реальный IP-адрес, когда на машине установлено несколько сетевых карт - PullRequest
0 голосов
/ 15 мая 2019

Я пытался использовать эту команду:

name = socket.gethostname()
address_info = socket.gethostbyname(name)

Но это возвращает IP-адрес 169.x.x.x вместо моего реального адреса (192.168.x.x), и это потому, что на моей машине установлено несколько network карт.

Как определить мой реальный IP-адрес?

Ответы [ 4 ]

1 голос
/ 15 мая 2019

Вы можете использовать пакет netifaces: Doc

Существует путаница в отношении того, что вы подразумеваете под "реальным" адресом: все сетевые интерфейсы имеют право на один или несколько IP-адресов иони реальны.

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

Может быть, этот код будет полезен:

import netifaces

def main():
    for item in netifaces.interfaces():
        print(netifaces.ifaddresses(item))
        print("\n")

if __name__== "__main__":
    main()

Если вы хотите знать внешний интерфейс вашей внешней сети, используйте следующий код:

print(netifaces.gateways()['default'][netifaces.AF_INET][0])
1 голос
/ 15 мая 2019

Вы можете использовать netifaces .это упростит вашу задачу

import netifaces
netifaces.interfaces()

Вывод будет список всех сопряженных

['lo0', 'gif0', 'stf0', 'en0', 'en1', 'fw0']

Вы можете углубиться в это, например, так -

netifaces.ifaddresses('en0')

Вывод будет:

{18: [{'addr': '00:12:34:56:78:9a'}], 2: [{'broadcast':
 '10.255.255.255', 'netmask': '255.0.0.0', 'addr': '10.16.1.4'}],
 30: [{'netmask': 'ffff:ffff:ffff:ffff::', 'addr':
 'fe80::123:4567:89ab:cdef%en0'}]}

найти адрес интерфейса

netifaces.ifaddresses('en0')[netifaces.AF_LINK]

Вывод

[{'addr': '00:12:34:56:78:9a'}]

Вы можете перебрать весь интерфейс и получить IP-адрес, например, так -

for interface in netifaces.interfaces():
...   for link in netifaces.ifaddresses(interface)[netifaces.AF_INET]:
...     print link['addr']
0 голосов
/ 15 мая 2019

Это у вас работает?

from pyroute2 import IPRoute

with IPRoute() as ipr:
    op = ipr.route('get', dst='8.8.8.8') #Find route to the google dns server
    for tup in op[0]['attrs']:
        if tup[0] == 'RTA_PREFSRC': # Preferred source address will be your ip address
            print(tup[1])
0 голосов
/ 15 мая 2019

Может быть, вы можете решить проблему таким образом.

import socket

def my_ip():
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    try:
        s.connect(('stackoverflow.com', 1027))
    except socket.error:
        return None
    return s.getsockname()[0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...