使用telnetlib我从我的路由器中获取路由信息,并且想要使用模式提取WAN IP地址。 telnet会话的输出位于一个变量中,行之间用\ n分隔。Python从telnetlib输出获取IP地址
来自telnet会话的东西。
l= tn.read_all()
>>> l
'\r\nip -f inet addr\r\nexit\r\[email protected]:/tmp/home/root# ip -f inet addr\r\n1: lo: <LOOPBACK,MULTICAST,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN \r\n inet 127.0.0.1/8 brd 127.255.255.255 scope host lo\r\n2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000\r\n inet 24.6.29.214/21 brd 24.6.31.255 scope global eth0\r\n7: br0: <BROADCAST,MULTICAST,ALLMULTI,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN \r\n inet 192.168.11.1/24 brd 192.168.11.255 scope global br0\r\n8: tun21: <POINTOPOINT,MULTICAST,NOARP,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 100\r\n inet 10.8.0.1 peer 10.8.0.2/32 scope global tun21\r\[email protected]:/tmp/home/root# exit\r\n'
>>>
现在我的代码。
l= tn.read_all()
for line in l.split('\n'):
match= re.findall(r'([0-9]+(?:\.[0-9]+){3}).*scope global eth0', line)
if match is not None:
print('Found ' + line)
我本来料想到一行符合打印。
Found inet 24.6.29.214/21 brd 24.6.31.255 scope global eth0
但我得到无处不在。
Found
Found ip -f inet addr
Found exit
Found [email protected]:/tmp/home/root# ip -f inet addr
Found 1: lo: <LOOPBACK,MULTICAST,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
Found inet 127.0.0.1/8 brd 127.255.255.255 scope host lo
Found 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
Found inet 24.6.29.214/21 brd 24.6.31.255 scope global eth0
Found 7: br0: <BROADCAST,MULTICAST,ALLMULTI,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
Found inet 192.168.11.1/24 brd 192.168.11.255 scope global br0
Found 8: tun21: <POINTOPOINT,MULTICAST,NOARP,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 100
Found inet 10.8.0.1 peer 10.8.0.2/32 scope global tun21
Found [email protected]:/tmp/home/root# exit
Found
我找不出为什么我的代码失败。如果专家有一个更好的方法(解释),那会很好。
编辑:
扬的回答肯定是更Python,但我缺乏蟒蛇的知识让我更喜欢VKS这是容易理解我。我给了两个'^',并将vks标记为首选(在“我偏好的意义上”)。
我最终在'split'cmd和下面的代码中使用'\ r \ n'。
def get_asus_wan_ip():
"Gets WAN IP from ASUS router"
import telnetlib
import re
ASUS_IP= '192.168.1.1'
ASUS_USER= 'xxxxxxxx'
ASUS_PASS= 'yyyyyyyy'
tn = telnetlib.Telnet(ASUS_IP)
tn.read_until("login: ")
tn.write(ASUS_USER + "\n")
tn.read_until("Password: ")
tn.write(ASUS_PASS + "\n")
tn.write("ifconfig eth0\n")
tn.write("exit\n")
l= tn.read_all()
for line in l.split('\r\n'):
match= re.findall(r'^\s+inet addr:([0-9]+(?:\.[0-9]+){3}).*', line)
if match:
break
wan_ip= match[0]
return wan_ip
''re.findall()''返回一个*列表*的匹配。该列表可以是空的;它不可能是“None”。对于单个匹配,如果匹配必须位于字符串的起始位置,则需要''re.search()''(或re.match()'')。 – jasonharper
你的[**正则表达式工作正常**](https://regex101.com/r/rfgo3G/1)(稍微调整),'if'构造是问题。 – Jan
[从html字符串(python)提取IP地址的可能重复](http://stackoverflow.com/questions/2890896/extract-ip-address-from-an-html-string-python) – philshem