Python을 사용하여 시스템의 외부 IP 주소 가져오기
시스템의 현재 외부 IP #을(를) 가져올 수 있는 더 나은 방법을 찾고 있습니다.아래 작업은 가능하지만 외부 사이트에 의존하여 정보를 수집하지는 않을 것입니다.Mac OS X 10.5.x와 함께 번들로 제공되는 표준 Python 2.5.1 라이브러리만 사용할 수 있습니다.
import os
import urllib2
def check_in():
fqn = os.uname()[1]
ext_ip = urllib2.urlopen('http://whatismyip.org').read()
print ("Asset: %s " % fqn, "Checking in from IP#: %s " % ext_ip)
저는 http://ipify.org 이 마음에 들었습니다.그들은 API를 사용하기 위한 파이썬 코드도 제공합니다.
# This example requires the requests library be installed. You can learn more
# about the Requests library here: http://docs.python-requests.org/en/latest/
from requests import get
ip = get('https://api.ipify.org').content.decode('utf8')
print('My public IP address is: {}'.format(ip))
Python3, 표준 라이브러리만 사용
앞서 언급했듯이, 라우터의 외부 IP 주소를 검색하기 위해 ident.me 와 같은 외부 서비스를 사용할 수 있습니다.
사용 방법은 다음과 같습니다.python3
표준 라이브러리만 사용:
import urllib.request
external_ip = urllib.request.urlopen('https://ident.me').read().decode('utf8')
print(external_ip)
가용성 및 클라이언트 기본 설정에 따라 IPv4 및 IPv6 주소를 모두 반환할 수 있습니다. IPv4의 경우 https://v4.ident.me/ 만 사용하고 IPv6의 경우 https://v6.ident.me/ 만 사용합니다.
외부 IP를 얻는 라우터 뒤에 있다면, 유감스럽게도 당신처럼 외부 서비스를 이용하는 것 외에는 다른 선택의 여지가 없습니다.라우터 자체에 쿼리 인터페이스가 있는 경우 이를 사용할 수 있지만 솔루션은 환경에 따라 매우 다르며 신뢰할 수 없습니다.
다음 Amazon AWS 끝점을 선호합니다.
import requests
ip = requests.get('https://checkip.amazonaws.com').text.strip()
UPnP 프로토콜을 사용하여 라우터에 이 정보를 쿼리해야 합니다.가장 중요한 것은 이 질문에 대한 다른 모든 대답이 시사하는 것처럼 보이는 외부 서비스에 의존하지 않는다는 것입니다.
miniupnp라는 Python 라이브러리가 있으며 이를 수행할 수 있습니다(예: miniupnpc/testupnpigd.py 참조).
pip install miniupnpc
이러한 예를 바탕으로 다음과 같은 작업을 수행할 수 있어야 합니다.
import miniupnpc
u = miniupnpc.UPnP()
u.discoverdelay = 200
u.discover()
u.selectigd()
print('external ip address: {}'.format(u.externalipaddress()))
내 생각에 가장 간단한 해결책은
import requests
f = requests.request('GET', 'http://myip.dnsomatic.com')
ip = f.text
이상입니다.
Python3에서 이것을 실행하는 것만큼 간단합니다.
import os
externalIP = os.popen('curl -s ifconfig.me').readline()
print(externalIP)
사용 요청 모듈:
import requests
myip = requests.get('https://www.wikipedia.org').headers['X-Client-IP']
print("\n[+] Public IP: "+myip)
시도:
import requests
ip = requests.get('http://ipinfo.io/json').json()['ip']
이것이 도움이 되기를 바랍니다.
외부 서비스(IP 웹사이트 등)를 이용하지 않으려는 경우UPnP 프로토콜을 사용할 수 있습니다.
이를 위해 간단한 UPnP 클라이언트 라이브러리(https://github.com/flyte/upnpclient) 를 사용합니다.
설치:
pip 설치 npclient
단순 코드:
import upnpclient
devices = upnpclient.discover()
if(len(devices) > 0):
externalIP = devices[0].WANIPConn1.GetExternalIPAddress()
print(externalIP)
else:
print('No Connected network interface detected')
전체 코드(github readme에 언급된 것처럼 자세한 정보를 얻기 위해)
In [1]: import upnpclient
In [2]: devices = upnpclient.discover()
In [3]: devices
Out[3]:
[<Device 'OpenWRT router'>,
<Device 'Harmony Hub'>,
<Device 'walternate: root'>]
In [4]: d = devices[0]
In [5]: d.WANIPConn1.GetStatusInfo()
Out[5]:
{'NewConnectionStatus': 'Connected',
'NewLastConnectionError': 'ERROR_NONE',
'NewUptime': 14851479}
In [6]: d.WANIPConn1.GetNATRSIPStatus()
Out[6]: {'NewNATEnabled': True, 'NewRSIPAvailable': False}
In [7]: d.WANIPConn1.GetExternalIPAddress()
Out[7]: {'NewExternalIPAddress': '123.123.123.123'}
외부 소스가 너무 신뢰할 수 없다고 생각하는 경우 몇 가지 다른 서비스를 풀링할 수 있습니다.대부분의 IP 조회 페이지의 경우 html을 스크랩해야 하지만, 일부는 당신과 같은 스크립트를 위한 린 페이지를 생성하여 사이트의 방문 횟수를 줄일 수 있습니다.
- automation.whatismyip.com/n09230945.asp (업데이트: what is myip이 이 서비스를 중단했습니다)
- whatismyip.org
IPGrab을 사용하는 이유는 기억하기 쉽기 때문입니다.
# This example requires the requests library be installed. You can learn more
# about the Requests library here: http://docs.python-requests.org/en/latest/
from requests import get
ip = get('http://ipgrab.io').text
print('My public IP address is: {}'.format(ip))
Python이 외부 웹 사이트를 확인하지 않는 몇 가지 다른 방법이 있지만 OS는 확인할 수 있습니다.여기서 주요 문제는 Python을 사용하지 않았더라도 명령줄을 사용했다면 외부(WAN) IP만 알려줄 수 있는 "내장" 명령이 없다는 것입니다."ip addr show" 및 "ifconfig -a"와 같은 명령어는 서버의 IP 주소가 네트워크 내에 있음을 보여줍니다.라우터만 실제로 외부 IP를 보유합니다.그러나 명령줄에서 외부 IP 주소(WAN IP)를 찾는 방법이 있습니다.
다음은 예입니다.
http://ipecho.net/plain ; echo
curl ipinfo.io/ip
dig +short myip.opendns.com @resolver1.opendns.com
dig TXT +short o-o.myaddr.l.google.com @ns1.google.com
따라서 파이썬 코드는 다음과 같습니다.
import os
ip = os.popen('wget -qO- http://ipecho.net/plain ; echo').readlines(-1)[0].strip()
print ip
OR
import os
iN, out, err = os.popen3('curl ipinfo.io/ip')
iN.close() ; err.close()
ip = out.read().strip()
print ip
OR
import os
ip = os.popen('dig +short myip.opendns.com @resolver1.opendns.com').readlines(-1)[0].strip()
print ip
또는 os.popen, os.popen2, os.popen3 또는 os.system과 같은 명령에 위의 다른 예를 연결합니다.
추신: "pip3 install pytis"를 사용하고 파이썬으로 작성된 "getip" 프로그램을 사용하거나 볼 수 있습니다.코드는 https://github.com/PyTis/PyTis/blob/development/src/pytis/getip.py 에서도 확인할 수 있습니다.
import requests
import re
def getMyExtIp():
try:
res = requests.get("http://whatismyip.org")
myIp = re.compile('(\d{1,3}\.){3}\d{1,3}').search(res.text).group()
if myIp != "":
return myIp
except:
pass
return "n/a"
유감스럽게도 인터넷에서 컴퓨터를 검색하지 않고는 외부 IP 주소를 얻을 수 없습니다.기껏해야 네트워크 카드의 로컬 네트워크 IP 주소(192.16일 수 있음)를 얻을 수 있습니다.주소).
당신은 할 수 .whatismyip
외부 IP 주소를 가져오는 모듈입니다.Python 3 표준 라이브러리 외부에는 종속성이 없습니다.공용 STUN 서버 및 what-is-my-ip 웹 사이트에 연결하여 IPv4 또는 IPv6 주소를 찾습니다.려달을 합니다.pip install whatismyip
예:
>>> import whatismyip
>>> whatismyip.amionline()
True
>>> whatismyip.whatismyip() # Prefers IPv4 addresses, but can return either IPv4 or IPv6.
'69.89.31.226'
>>> whatismyip.whatismyipv4()
'69.89.31.226'
>>> whatismyip.whatismyipv6()
'2345:0425:2CA1:0000:0000:0567:5673:23b5'
저는 여기서 이 질문에 대한 대부분의 다른 답변을 시도했고 하나를 제외하고 사용된 대부분의 서비스가 사라졌다는 것을 알게 되었습니다.
다음은 트릭을 수행하고 최소한의 정보만 다운로드해야 하는 스크립트입니다.
#!/usr/bin/env python
import urllib
import re
def get_external_ip():
site = urllib.urlopen("http://checkip.dyndns.org/").read()
grab = re.findall('([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)', site)
address = grab[0]
return address
if __name__ == '__main__':
print( get_external_ip() )
Python 2.7.6 및 2.7.13으로 작업
import urllib2
req = urllib2.Request('http://icanhazip.com', data=None)
response = urllib2.urlopen(req, timeout=5)
print(response.read())
기계가 방화벽인 경우 매우 합리적인 솔루션입니다. 방화벽을 쿼리할 수 있는 대안으로 방화벽 유형에 매우 의존적입니다(가능한 경우).
내가 생각할 수 있는 가장 간단한 (비 파이썬) 작동 솔루션은
wget -q -O- icanhazip.com
http://hostip.info 의 JSON API를 활용한 매우 짧은 Python3 솔루션을 추가하고 싶습니다.
from urllib.request import urlopen
import json
url = 'http://api.hostip.info/get_json.php'
info = json.loads(urlopen(url).read().decode('utf-8'))
print(info['ip'])
물론 다음과 같은 오류 검사, 시간 초과 조건 및 편리성을 추가할 수 있습니다.
#!/usr/bin/env python3
from urllib.request import urlopen
from urllib.error import URLError
import json
try:
url = 'http://api.hostip.info/get_json.php'
info = json.loads(urlopen(url, timeout = 15).read().decode('utf-8'))
print(info['ip'])
except URLError as e:
print(e.reason, end=' ') # e.g. 'timed out'
print('(are you connected to the internet?)')
except KeyboardInterrupt:
pass
In [1]: import stun
stun.get_ip_info()
('Restric NAT', 'xx.xx.xx.xx', 55320)
Linux 전용 솔루션.
리눅스 시스템즈에서는 Python을 사용하여 셸에서 명령을 실행할 수 있습니다.누군가에게 도움이 될 수도 있을 것 같아요.
(OS에서 'dig/drill'이 작동하고 있다고 가정하면) 이런 것입니다.
import os
command = "dig TXT +short o-o.myaddr.l.google.com @ns1.google.com | awk -F\'\"\' '{print $2}' "
ip = os.system(command)
Arch 사용자의 경우 'dig'를 'drill'로 대체하십시오.
저는 Sergiy Ostrovsky의 대답이 마음에 들었지만, 이제 이것을 할 수 있는 훨씬 더 깔끔한 방법이 있다고 생각합니다.
- ipify 라이브러리를 설치합니다.
pip install ipify
- Python 프로그램에서 라이브러리를 가져와 사용합니다.
import ipify
ip = ipify.get_ip()
ipWebCode = urllib.request.urlopen("http://ip.nefsc.noaa.gov").read().decode("utf8")
ipWebCode=ipWebCode.split("color=red> ")
ipWebCode = ipWebCode[1]
ipWebCode = ipWebCode.split("</font>")
externalIp = ipWebCode[0]
이것은 제가 다른 프로그램을 위해 쓴 짧은 토막글입니다.요령은 HTML을 해부하는 것이 힘들지 않도록 충분히 간단한 웹사이트를 찾는 것이었습니다.
여기 다른 스크립트가 있습니다.
def track_ip():
"""
Returns Dict with the following keys:
- ip
- latlong
- country
- city
- user-agent
"""
conn = httplib.HTTPConnection("www.trackip.net")
conn.request("GET", "/ip?json")
resp = conn.getresponse()
print resp.status, resp.reason
if resp.status == 200:
ip = json.loads(resp.read())
else:
print 'Connection Error: %s' % resp.reason
conn.close()
return ip
편집: httplib과 json을 가져오는 것을 잊지 마십시오.
일반 응용프로그램이 아닌 자신을 위해 작성하는 경우 라우터의 설정 페이지에서 주소를 찾은 다음 해당 페이지의 html에서 주소를 지울 수 있습니다.이것은 SMC 라우터에서 잘 작동했습니다.한 번의 읽기와 한 번의 간단한 연구를 통해 찾았습니다.
제가 이 일을 할 때 특히 관심이 있었던 것은 집을 비울 때 집 IP 주소를 알려주어 VNC를 통해 다시 들어갈 수 있게 해주는 것이었습니다.Python의 몇 줄은 외부 액세스를 위해 Dropbox에 주소를 저장하고 변경 사항이 발견되면 이메일을 보냅니다.부팅할 때와 그 이후에 한 시간에 한 번 발생하도록 스케줄을 잡았습니다.
다음 스크립트 사용:
import urllib, json
data = json.loads(urllib.urlopen("http://ip.jsontest.com/").read())
print data["ip"]
json 없이:
import urllib, re
data = re.search('"([0-9.]*)"', urllib.urlopen("http://ip.jsontest.com/").read()).group(1)
print data
importos public_ip = os.system("grep 'WAN IP') -i") print(public_ip)
만약 당신이 퍼블릭 IP를 얻기 위해 URL을 치는 것에 관심이 없다면, 나는 다음 코드가 당신의 기계의 파이썬을 사용하여 퍼블릭 IP를 얻는 데 도움이 될 것이라고 생각합니다.
import os
externalIP = os.popen("ifconfig | grep 'inet' | cut -d: -f2 | awk '{print $2}' | sed -n 3p").readline()
print externalIP
sed -n 3p 라인은 장치 연결에 사용하는 네트워크에 따라 다릅니다.
나는 같은 문제에 직면하고 있었고, 나는 내 서버를 때리는 iot 장치의 공개 IP가 필요했습니다. 그러나 공개 IP는 ifconfig 명령과 ip가 완전히 다릅니다. 나는 요청 객체에서 서버로 들어오는 ip를 추가합니다. 그 후에 나의 서버로 장치의 IP를 보내기 위해 나의 요청에 추가 매개 변수를 추가합니다.
이것이 도움이 되기를 바랍니다.
import os
externalIp = os.popen("ipconfig").read().split(":")[15][1:14]
일부 번호는 변경해야 할 수도 있지만 저는 이것이 가능합니다.
언급URL : https://stackoverflow.com/questions/2311510/getting-a-machines-external-ip-address-with-python
'bestsource' 카테고리의 다른 글
카프카와 마리애드브 통합을 위한 하나의 샘플 프로젝트 링크를 공유하는 사람이 있습니까? (0) | 2023.07.18 |
---|---|
SQL Server 데이터베이스 이름에 사용할 수 있는 문자는 무엇입니까? (0) | 2023.07.18 |
기존 프로젝트를 Github에 푸시 (0) | 2023.07.18 |
데이터베이스 테이블에서 부울 열 이름 지정 (0) | 2023.07.13 |
실행 중인 실제 Oracle SQL 문을 보는 방법 (0) | 2023.07.13 |