How to get the physical interface IP address from an interface

前端 未结 3 1171
孤城傲影
孤城傲影 2020-11-29 03:56

What I have done so far, using PyQt classes:

all_Addresses = QNetworkInterface.allAddresses()    #list-of-QHostAddress

for addr in all_Addresses:
    print(         


        
相关标签:
3条回答
  • 2020-11-29 04:43

    You should use netifaces. It is designed to be cross-platform and contains specialised code for Windows together with a variety of generic versions that work on different UNIX/UNIX-like platforms.

    As of netifaces version 0.10.0, Python3 is supported.

    Usage Summary

    >>> from netifaces import AF_INET, AF_INET6, AF_LINK, AF_PACKET, AF_BRIDGE
    >>> import netifaces as ni
    >>> ni.interfaces()
    ['lo', 'eth0', 'eth1', 'vboxnet0', 'dummy1']
    >>>
    >>> ni.ifaddresses('eth0')[AF_LINK]   # NOTE: AF_LINK is an alias for AF_PACKET
    [{'broadcast': 'ff:ff:ff:ff:ff:ff', 'addr': '00:02:55:7b:b2:f6'}]
    >>> ni.ifaddresses('eth0')[AF_INET]
    [{'broadcast': '172.16.161.7', 'netmask': '255.255.255.248', 'addr': '172.16.161.6'}]
    >>>
    >>> # eth0 ipv4 interface address
    >>> ni.ifaddresses('eth0')[AF_INET][0]['addr']
    '172.16.161.6'
    >>>>
    

    Details

    Windows Support:

    No compiler required for most MS Windows installs. If you get warnings about installing MS Visual C++ for Windows, be very careful because you need to match the version of compiler used for your python with that used for the module.

    Detailed example of netifaces data structures:

    >>> import netifaces as ni
    >>> ni.interfaces()
    ['lo', 'eth0', 'eth1', 'vboxnet0', 'dummy1']
    >>> ni.ifaddresses('eth0')
    {
        17: [
            {
                'broadcast': 'ff:ff:ff:ff:ff:ff',
                'addr': '00:02:55:7b:b2:f6'
            }
        ],
        2: [
            {
                'broadcast': '172.16.161.7',
                'netmask': '255.255.255.248',
                'addr': '172.16.161.6'
            }
        ],
        10: [
            {
                'netmask': 'ffff:ffff:ffff:ffff::',
                'addr': 'fe80::202:55ff:fe7b:b2f6%eth0'
            }
        ]
    }
    >>> 
    >>> print(ni.ifaddresses.__doc__)
    Obtain information about the specified network interface.
    
    Returns a dict whose keys are equal to the address family constants,
    e.g. netifaces.AF_INET, and whose values are a list of addresses in
    that family that are attached to the network interface.
    >>>
    >>> # for the IPv4 address of eth0
    >>> ni.ifaddresses('eth0')[2][0]['addr']
    '172.16.161.6'
    

    The numbers used to index protocols are from /usr/include/linux/socket.h (in Linux)... EDIT: my 3.2 kernel has them here: /usr/src/linux-headers-3.2.0-4-common/include/linux/socket.h

    #define AF_INET         2       /* Internet IP Protocol         */
    #define AF_INET6        10      /* IP version 6                 */
    #define AF_PACKET       17      /* Packet family                */
    

    The good news is that you don't have to remember all those header constants, they are included with netifaces:

    >>> from netifaces import AF_INET, AF_INET6, AF_LINK, AF_PACKET, AF_BRIDGE
    >>> import netifaces as ni
    
    0 讨论(0)
  • 2020-11-29 04:47

    I use this solution. It's a little bit tricky actually, and it's only works on linux family.

    import commands
    intf = 'eth0'
    intf_ip = commands.getoutput("ip address show dev " + intf).split()
    intf_ip = intf_ip[intf_ip.index('inet') + 1].split('/')[0]
    print intf_ip
    

    Those code utilize ip command on linux family operating system. It split the output from ip command and only take the IPv4 address of those interface. You can change the value intf to eth1 or p2p1.

    0 讨论(0)
  • 2020-11-29 04:48

    Uses the Linux SIOCGIFADDR ioctl to find the IP address associated with a network interface, given the name of that interface, e.g. "eth0". The address is returned as a string containing a dotted quad.

    import socket
    import fcntl
    import struct
    
    def get_ip_address(ifname):
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        return socket.inet_ntoa(fcntl.ioctl(
            s.fileno(),
            0x8915,  # SIOCGIFADDR
            struct.pack('256s', ifname[:15])
        )[20:24])
    
    >>> get_ip_address('lo')
    '127.0.0.1'
    
    >>> get_ip_address('eth0')
    '38.113.228.130'
    

    For more

    0 讨论(0)
提交回复
热议问题