2014-08-31 147 views

回答

4
import urllib.request 
urllib.request.urlopen("http://169.254.169.254/latest/meta-data/public-ipv4").read() 
+1

你的答案相當簡短,也許你可以解釋它是如何工作的。這是亞馬遜ec2具體還是什麼? – CrazyCasta 2014-08-31 06:07:06

+0

@CrazyCastaL請看這裏:http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-instance-addressing.html – 2014-08-31 06:07:36

+0

「local-ipv4」元數據將包含實例的私有IP地址這僅在AWS網絡中有用。公共IP地址可以使用「public-ipv4」。 – garnaat 2014-08-31 12:55:32

3

如果您已經使用boto,你也可以使用boto.utils.get_instance_metadata功能。這會調用元數據服務器,收集所有元數據並將其作爲Python字典返回。它也處理重試。

0
def console(cmd): 
    p = Popen(cmd,shell=True,stdout=PIPE) 
    out,err = p.communicate() 
    dir_list = out.split('\n') 
    return (dir_list) 
ip = console("http://169.254.169.254/latest/meta-data/public-ipv4") 
print ip 
1
import requests 
ip = requests.get("http://169.254.169.254/latest/meta-data/public-ipv4").content 
2

下面的方法將返回公共IP或您的EC2實例的彈性IP地址(注意:如果EIP地址與您的EC2實例相關聯,那麼公共IP地址實際上是釋放)。

這對於Django項目特別有用,因爲您可以在settings.py腳本中將IP地址附加到ALLOWED_HOSTS。

  • 安裝PyCurl

    pip install pycurl 
    
  • Python 3中

    import pycurl 
    from io import BytesIO 
    
    # Determine Public IP address of EC2 instance 
    buffer = BytesIO() 
    c = pycurl.Curl() 
    c.setopt(c.URL, 'checkip.amazonaws.com') 
    c.setopt(c.WRITEDATA, buffer) 
    c.perform() 
    c.close() 
    body = buffer.getvalue() 
    # Body is a byte string, encoded. Decode it first. 
    print (body.decode('iso-8859-1').strip()) 
    
  • 的Python 2

    import pycurl 
    from StringIO import StringIO 
    
    buffer = StringIO() 
    c = pycurl.Curl() 
    c.setopt(c.URL, 'checkip.amazonaws.com') 
    c.setopt(c.WRITEDATA, buffer) 
    c.perform() 
    c.close() 
    
    body = buffer.getvalue() 
    # Body is a string in some encoding. 
    # In Python 2, we can print it without knowing what the encoding is. 
    print (body) 
    

歡呼。