복붙노트

[PYTHON] 파이썬에서 eth0의 IP 주소를 얻으려면 어떻게해야합니까?

PYTHON

파이썬에서 eth0의 IP 주소를 얻으려면 어떻게해야합니까?

Unix의 Python 스크립트에서 오류가 발생하면 전자 메일이 전송됩니다.

IP 주소가 테스트 서버 인 192.168.100.37 인 경우 전자 메일의 제목 줄에 {테스트 환경}을 추가하라는 요청을 받았습니다. 이 방법으로 우리는 한 버전의 스크립트와 전자 메일이 테스트 서버의 엉망인 데이터에서 왔는지 여부를 알 수 있습니다.

그러나, 내가 구글이 코드를 찾는 계속 :

import socket
socket.gethostbyname(socket.gethostname())

그러나, 그것은 나에게 127.0.1.1의 IP 주소를주고있다. 내가 ifconfig를 사용할 때 나는 이것을 얻는다.

eth0      Link encap:Ethernet  HWaddr 00:1c:c4:2c:c8:3e
          inet addr:192.168.100.37  Bcast:192.168.100.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:75760697 errors:0 dropped:411180 overruns:0 frame:0
          TX packets:23166399 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:59525958247 (59.5 GB)  TX bytes:10142130096 (10.1 GB)
          Interrupt:19 Memory:f0500000-f0520000

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:25573544 errors:0 dropped:0 overruns:0 frame:0
          TX packets:25573544 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:44531490070 (44.5 GB)  TX bytes:44531490070 (44.5 GB)

첫째로, 나는 그것이 127.0.1.1을 어디에서 얻었는지 모르지만, 내가 원하는 바가 아니다. 제가 구글로 올 때 동일한 구문, Bash 스크립트 또는 넷 포일을 계속 사용하고 있으며 표준 라이브러리를 사용하려고합니다.

그렇다면 어떻게하면 파이썬에서 eth0의 IP 주소를 얻을 수 있습니까?

해결법

  1. ==============================

    1.두 가지 방법 :

    두 가지 방법 :

    eth0 인터페이스에 바인딩 된 IP 주소를 요청해야합니다. 이것은 netifaces 패키지에서 사용할 수 있습니다.

    import netifaces as ni
    ni.ifaddresses('eth0')
    ip = ni.ifaddresses('eth0')[ni.AF_INET][0]['addr']
    print ip  # should print "192.168.100.37"
    

    또한 사용 가능한 모든 인터페이스 목록을 통해

    ni.interfaces()
    

    파이썬 패키지를 사용하지 않고 IP 주소를 얻는 방법은 다음과 같습니다.

    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('eth0')  # '192.168.0.110'
    

    참고 : 사용중인 환경을 확인하기 위해 IP 주소를 탐지하는 것은 상당히 해킹입니다. 거의 모든 프레임 워크는 현재 환경을 나타 내기 위해 환경 변수를 설정 / 수정하는 아주 간단한 방법을 제공합니다. 시도하고 이것에 대한 설명서를보십시오. 하고있는 것처럼 간단해야합니다.

    if app.config['ENV'] == 'production':
      #send production email
    else:
      #send development email
    
  2. ==============================

    2.또는 이름을 알지 못해도 네트워크에 연결하는 데 사용되는 인터페이스의 IP 주소를 얻으려면 다음을 사용할 수 있습니다.

    또는 이름을 알지 못해도 네트워크에 연결하는 데 사용되는 인터페이스의 IP 주소를 얻으려면 다음을 사용할 수 있습니다.

    import socket
    def get_ip_address():
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.connect(("8.8.8.8", 80))
        return s.getsockname()[0]
    

    나는 그것이 당신의 질문과 조금 다르다는 것을 안다. 그러나 다른 사람들은 여기에 도착하여 이것을 유용하게 생각할지도 모른다. 이것을 사용하려면 8.8.8.8의 경로가 필요하지 않습니다. 소켓을 열고 있지만 데이터를 전송하지 않는 것뿐입니다.

  3. ==============================

    3.인터페이스에 대해 ip-address가있는 문자열을 반환하는 간단한 방법은 다음과 같습니다.

    인터페이스에 대해 ip-address가있는 문자열을 반환하는 간단한 방법은 다음과 같습니다.

    from subprocess import check_output
    
    ips = check_output(['hostname', '--all-ip-addresses'])
    

    자세한 내용은 hostname을 참조하십시오.

  4. ==============================

    4.유닉스에서만 작업해야한다면 시스템 콜을 사용할 수있다. (Stack Overflow 질문 ifconfig를 분석하여 Bash를 사용하여 내 IP 주소를 얻는다.)

    유닉스에서만 작업해야한다면 시스템 콜을 사용할 수있다. (Stack Overflow 질문 ifconfig를 분석하여 Bash를 사용하여 내 IP 주소를 얻는다.)

    import os
    f = os.popen('ifconfig eth0 | grep "inet\ addr" | cut -d: -f2 | cut -d" " -f1')
    your_ip=f.read()
    
  5. ==============================

    5.대부분의 응답은 ifconfig를 사용하여 eth0 인터페이스에서 IPv4를 추출합니다 (ipaddr 대신 사용되지 않음). 대신 다음 코드를 사용할 수 있습니다.

    대부분의 응답은 ifconfig를 사용하여 eth0 인터페이스에서 IPv4를 추출합니다 (ipaddr 대신 사용되지 않음). 대신 다음 코드를 사용할 수 있습니다.

    import os
    
    ipv4 = os.popen('ip addr show eth0 | grep "\<inet\>" | awk \'{ print $2 }\' | awk -F "/" \'{ print $1 }\'').read().strip()
    ipv6 = os.popen('ip addr show eth0 | grep "\<inet6\>" | awk \'{ print $2 }\' | awk -F "/" \'{ print $1 }\'').read().strip()
    

    또는 grep 및 awk 대신 split ()을 사용하여 구문 분석 작업의 일부를 Python 인터프리터로 옮길 수 있습니다. @serg는 주석에서 가리 킵니다.

    import os
    
    ipv4 = os.popen('ip addr show eth0').read().split("inet ")[1].split("/")[0]
    ipv6 = os.popen('ip addr show eth0').read().split("inet6 ")[1].split("/")[0]
    

    그러나이 경우 각 split () 호출에서 반환 된 배열의 경계를 확인해야합니다.

    regex를 사용하는 다른 버전 :

    import os
    import re
    
    ipv4 = re.search(re.compile(r'(?<=inet )(.*)(?=\/)', re.M), os.popen('ip addr show eth0').read()).groups()[0]
    ipv6 = re.search(re.compile(r'(?<=inet6 )(.*)(?=\/)', re.M), os.popen('ip addr show eth0').read()).groups()[0]
    
  6. ==============================

    6.아래 코드를 시도해 보면 Mac10.10.2에서 저에게 적합합니다.

    아래 코드를 시도해 보면 Mac10.10.2에서 저에게 적합합니다.

    import subprocess
    
    if __name__ == "__main__":
        result = subprocess.check_output('ifconfig en0 |grep -w inet', shell=True) # you may need to use eth0 instead of en0 here!!!
        print 'output = %s' % result.strip()
        # result = None
        ip = ''
        if result:
            strs = result.split('\n')
            for line in strs:
                # remove \t, space...
                line = line.strip()
                if line.startswith('inet '):
                    a = line.find(' ')
                    ipStart = a+1
                    ipEnd = line.find(' ', ipStart)
                    if a != -1 and ipEnd != -1:
                        ip = line[ipStart:ipEnd]
                        break
        print 'ip = %s' % ip
    
  7. ==============================

    7.그것은 나를 위해 일했다.

    그것은 나를 위해 일했다.

     import subprocess
     my_ip = subprocess.Popen(['ifconfig eth0 | awk "/inet /" | cut -d":" -f 2 | cut -d" " -f1'], stdout=subprocess.PIPE, shell=True)
     (IP,errors) = my_ip.communicate()
     my_ip.stdout.close()
     print IP
    
  8. ==============================

    8.ifconfig에서 실행중인 첫 번째 eth / wlan 항목의 IP 주소를 찾으십시오.

    ifconfig에서 실행중인 첫 번째 eth / wlan 항목의 IP 주소를 찾으십시오.

    import itertools
    import os
    import re
    
    def get_ip():
        f = os.popen('ifconfig')
        for iface in [' '.join(i) for i in iter(lambda: list(itertools.takewhile(lambda l: not l.isspace(),f)), [])]:
            if re.findall('^(eth|wlan)[0-9]',iface) and re.findall('RUNNING',iface):
                ip = re.findall('(?<=inet\saddr:)[0-9\.]+',iface)
                if ip:
                    return ip[0]
        return False
    
  9. from https://stackoverflow.com/questions/24196932/how-can-i-get-the-ip-address-of-eth0-in-python by cc-by-sa and MIT license