python fabric获取公共IP地址

时间:2012-07-16 11:52:29

标签: python fabric

尝试使用python fabric获取主机的公共IP地址

def publicip():
        ip = local("curl -s 'http://checkip.dyndns.org' | sed 's/.*Current IP Address: \([0-9\.]*\).*/\'\1/g\'")
        print (red(ip))

错误:

Fatal error: local() encountered an error (return code 2) while executing 'curl -s 'http://checkip.dyndns.org' | sed 's/.*Current IP Address: \([0-9\.]*\).*/'/g''

4 个答案:

答案 0 :(得分:3)

可能没有在您运行的主机上安装Curl。你无论如何都不需要它,因为你可以在Python中轻松地完成这个:

import urllib2

u = urllib2.urlopen('http://checkip.dyndns.org')
line = u.next()
print line.split("<")[6].split().pop()

答案 1 :(得分:2)

我不确定local()(执行外部命令?)是什么,但使用requests库和re.search这很简单:

import requests, re

r = requests.get('http://checkip.dyndns.org')
myip = re.search(r'\d+\.\d+\.\d+\.\d+', r.text).group()

答案 2 :(得分:1)

似乎local()不支持执行多个命令。但是,您可以将执行分为:

def publicip():
    ip = local("curl -s 'http://checkip.dyndns.org'", capture=True)

然后ip将包含所需的html:

'<html><head><title>Current IP Check</title></head><body>Current IP Address: 1.2.3.4</body></html>'

您可以使用正则表达式解析,例如:

r = re.compile(r'.*\<body>Current IP Address:\s(.*)\</body>.*')
final_ip = r.match(ip).group(1)

答案 3 :(得分:1)

纯python实现是

import requests
r = requests.get('http://ipof.in/txt')
myip = r.text

多数民众赞成。如果您需要除IP地址之外的更多信息,请查看http://ipof.in