[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.두 가지 방법 :
두 가지 방법 :
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.또는 이름을 알지 못해도 네트워크에 연결하는 데 사용되는 인터페이스의 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.인터페이스에 대해 ip-address가있는 문자열을 반환하는 간단한 방법은 다음과 같습니다.
인터페이스에 대해 ip-address가있는 문자열을 반환하는 간단한 방법은 다음과 같습니다.
from subprocess import check_output ips = check_output(['hostname', '--all-ip-addresses'])
자세한 내용은 hostname을 참조하십시오.
-
==============================
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.대부분의 응답은 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.아래 코드를 시도해 보면 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.그것은 나를 위해 일했다.
그것은 나를 위해 일했다.
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.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
from https://stackoverflow.com/questions/24196932/how-can-i-get-the-ip-address-of-eth0-in-python by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 두 목록 사이의 조합? (0) | 2018.10.04 |
---|---|
[PYTHON] NameError를주는 모듈을 다시로드하고 있습니다 : 'reload'이름이 정의되지 않았습니다. (0) | 2018.10.04 |
[PYTHON] 파이썬을 사용하여 한 쌍의 비선형 방정식을 푸는 방법? (0) | 2018.10.04 |
[PYTHON] dict를 적절하게 서브 클래스 화하고 __getitem__ & __setitem__을 재정의하는 방법 (0) | 2018.10.04 |
[PYTHON] Selenium에서 Javascript 코드의 반환 값 얻기 (0) | 2018.10.04 |