- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我使用 telnetlib 从我的路由器中提取路由信息,并希望使用一种模式提取 WAN IP 地址。 telnet session 的输出在一个变量中,行由\n 分隔。
telnet session 中的内容。
l= tn.read_all()
>>> l
'\r\nip -f inet addr\r\nexit\r\nadmin4asus@RT-AC68U:/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\nadmin4asus@RT-AC68U:/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 admin4asus@RT-AC68U:/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 admin4asus@RT-AC68U:/tmp/home/root# exit
Found
我不明白为什么我的代码会失败。如果专家们有更好的方法(有解释)那就太好了。
编辑:
Jan 的回答肯定更像 Pythonic,但我对 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
最佳答案
import re
x="""'\r\nip -f inet addr\r\nexit\r\nadmin4asus@RT-AC68U:/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\nadmin4asus@RT-AC68U:/tmp/home/root# exit\r\n'"""
for line in x.split('\n'):
match= re.findall(r'(?:[0-9]+(?:\.[0-9]+){3}).*scope global eth0', line)
if match:
print('Found ' + line)
输出:找到inet 24.6.29.214/21 brd 24.6.31.255 scope global eth0
你的代码有问题:
1) re.findall
返回 list
,所以它不能是 None
它可以是空的。所以在 if
条件。
2) re.findall
只返回有组的情况。如果你想要整行,让第一个组不捕获。
关于Python 从 telnetlib 输出中获取 IP 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43246177/
我想检查使用 telnetlib 的连接是否仍然存在。 我这样做的方式是发送 ls命令并检查答案,但我确信必须有更流畅的解决方案。 最佳答案 我从 here 得到了这个想法,所以向他们致敬,代码可能是
我正在为 IBM as400 机器开发 telnet 客户端,但在返回正确数量的数据时遇到了一些麻烦。最初,程序应该连接到一个 telnet session ,该 session 具有写入的用户名和密
我正在尝试制作一个脚本,它通过 telnet 连接到服务器。我正在使用 python 和 telnetlib。我在超时工作时遇到问题。我想在连接到主机时使用可选超时,以便在主机不在线时得到异常。 我已
我编写了一个 python 脚本,可以通过读取列出不同 IP 地址的 csv 文件来顺序登录多个设备。从那里,它为每个设备输出一个文件,其中包含通过脚本传递到设备的一些命令的内容。所以我已经走了很远了
背景:我正在拉动防火墙的连接表,以便构建一个最高的谈话者/监听者列表。 在某些情况下,连接表有 200,000 多个条目。我正在使用 telnetlib 远程连接到防火墙并获取连接表。我使用 read
我有以下 python 代码: import telnetlib ts = telnetlib.Telnet('192.168.0.2') ts.set_debuglevel(10) ts.read_
[Python telnetlib read_until recv问题] “read_until”函数返回带有长命令的截断字符串。 命令运行完美,但不显示完整文本。 我怎样才能解决这个问题?请帮忙。
网络专家在这里玩编码 我有一个非常基本的脚本,可以远程登录到交换机/路由器,运行一些命令并终止。一切都是在端口 23 上完成的。我遇到的问题是,当我通过术语服务器连接到设备或通过非标准端口连接到 ES
我有一些 Python 代码,通过 telnet 连接到 OSPF 守护进程(由 Quagga 运行),然后执行以下操作: tn.write("show ip ospf database router
我正在使用 Python 模块 telnetlib 创建一个 telnet session (与国际象棋服务器),我遇到了一个我真的无法解决的问题。以下代码完美运行: >>> f = login("m
我正在编写一个简单的程序,它通过 telnet 与路由器通信并向它发出一些简单的命令。我希望能够测试这些命令,确保程序正确响应服务器输出并在正确的时刻发送命令。但是我想不出一个好的方法来做到这一点。我
我正在使用 Python 的 telnetlib 远程登录到某台机器并执行一些命令,我想获得这些命令的输出。 那么,目前的情况是什么—— tn = telnetlib.Telnet(HOST) t
所以我正在尝试 python 文档给出的这个非常简单的示例: import getpass import sys import telnetlib HOST = "" user = raw_input
我正在尝试在我的 Ubuntu 15.4 操作系统上安装一个名为 telnetlib 的 python 模块。 我试过: $ pip install telnetlib 但我得到错误: root@c-
我正在尝试打开一个 telnet 连接,写入一个字符串,然后用 Python 从 telnet 服务器打印所有内容。我想我遗漏了一些明显的东西,因为文档看起来很不言自明,并且在终端中做我认为完全相同的
我想使用select.select()阻止循环,直到准备好从 telnet session 列表中读取一些数据。但是,下面的代码不起作用,对 select.select() 的调用立即返回,没有数据可
我有一个基本的聊天服务器,我可以很容易地通过 telnet 连接到它。我只需输入主机和端口,无需任何进一步的身份验证,就可以开始输入服务器可以解释的命令。为了模拟用户流量,我想创建一个脚本来打开 te
我正在编写一个库来支持远程登录到远程服务器并运行应用程序。 在建立连接、取回数据、解析等方面一切进展顺利(至少与通过文本界面与程序通信一样顺畅)。 一个app如果正常进入会改变光标,如果失败则保留原来
我通过访问设备从 telnetlib 获得覆盖的输出,但我不知道如何解决它以获得正确的输出。 我尝试了以下代码: import re import os import sys import time
我正在通过 telnet 连接到硬件设备。该设备在 I/O 方面非常简单。所以我向它提交一个命令,然后设备一次一行地输出数据,每秒一次。每行仅包含一个数字。 所以我的问题是:如果我使用 python
我是一名优秀的程序员,十分优秀!