2017-02-23 11 views
0

Мне нужно создать скрипт Python, который запрашивает сетевые интерфейсы и возвращает мне имя хоста, IP-адрес и адрес mac.Сканирование сетевого интерфейса Python

#!/usr/bin/env python3 
import netifaces 

x = netifaces.interfaces() 
i = x[0] 

for i in x: 
    if i != 'lo': 

     print(i) 
     face = netifaces.ifaddresses(i) 

     print(face) 
     i += i 
    else: 
     continue 

Это одна из версий программы, с которой я работаю. Кажется, это захватывает все данные, которые мне нужны, но я не могу заставить их печатать чистыми или правильно! Я ищу что-то вроде: «Nic: wlan0, ipaddr: 10.0.0.1, mac: 4651168584541»

Я новичок в программировании и очень новичок в python, поэтому, пожалуйста, любая помощь приветствуется!

ответ

0

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

import netifaces 

x = netifaces.interfaces() 


for i in x: 
    if i != 'lo': 
    print('\nInterface: ' + i) 
    mac = netifaces.ifaddresses(i)[netifaces.AF_LINK][0]['addr'] 
    print('Mac addr: ' + mac) 

    try: 
     ip = netifaces.ifaddresses(i)[netifaces.AF_INET][0]['addr'] 

     print('IP addr: {0} '.format(ip)) 
    except KeyError: 
     print('NO IP') 
     continue 

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

Interface: eth0 
Mac add: eo:ie:9:38:ri 
No IP 

Interface: wlan0 
Mac addr: 34:po:iu:66 
IP addr: 10.0.0.1 
+0

Что произойдет, если вы подключаетесь к протоколу, который не использует MAC-адреса, например. PPP или HDLC? Работает ли он с протоколами, использующими 64-разрядные MAC-адреса? Как насчет IPv6? –

+0

Не уверен, что никогда не тестировал его в этих условиях. Я бы предположил, что IPv6 будет работать нормально. Это было домашнее задание, так что это было достаточно хорошо. Я бы предположил, что документы 'netifaces' могут охватывать это. Даже если протокол не использует mac addrs, он не должен иметь значения bc, интерфейс должен иметь одно право? – Joe

+0

Только интерфейсы, использующие протоколы IEEE LAN, будут иметь MAC-адреса, а некоторые будут использовать 48-битные MAC-адреса, а некоторые будут использовать 64-разрядные MAC-адреса. Многие библиотеки допускают только 48-битные MAC-адреса, но более новые протоколы IEEE LAN используют 64-разрядные MAC-адреса.Если вы подключаетесь к интерфейсу, который не использует протоколы IEEE LAN, то MAC-адрес отсутствует. Не предполагайте, что все это ethernet или Wi-Fi. Я просто указывал, что принятие предположений, как это делают многие программисты в сетях, может привести к проблемам, ошибкам и дырам в безопасности. Я просто вижу так много программного обеспечения дерьма, выпущенного для сетей. –

0

Пожалуйста, проверьте ссылки:

  1. @ ответ camflan в в Getting MAC Address

  2. How to get the physical interface IP address from an interface

    import netifaces 
    
    x = netifaces.interfaces() 
    
    
    for i in x: 
        if i != 'lo': 
         print(i) 
         print("mac:" + netifaces.ifaddresses(i)[netifaces.AF_LINK][0]['addr'] + "  ipaddr:" + netifaces.ifaddresses(i)[netifaces.AF_INET][0]['addr']) 
         i += i 
        else: 
         continue 
    
+0

По какой-то причине это не работает для меня. Ошибка в строке 9, где мы объявляем лицо – Joe

+0

Извинения Джо. Не могли бы вы попробовать обновленный код – vvanarasi

+0

, все еще получая эту синтаксическую ошибку. face = "mac:" + netifaces.ifaddresses (i) [netifaces.AF_LINK] [0] ['addr'] + "; ipaddr:" netifaces.ifaddresses (i) [netifaces.AF_INET] [0] ['addr' ] – Joe