bestsource

Python을 사용하여 시스템의 외부 IP 주소 가져오기

bestsource 2023. 7. 18. 21:49
반응형

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의 대답이 마음에 들었지만, 이제 이것을 할 수 있는 훨씬 더 깔끔한 방법이 있다고 생각합니다.

  1. ipify 라이브러리를 설치합니다.
pip install ipify
  1. 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

반응형