我想了解如何在简单的场景中使用 telnetlib3。
长期存在的 telnetlib(不是 3)在https://docs.python.org/3/library/telnetlib.html有一个简单的示例,其中 python 程序连接到 telnet 服务器,然后查找提示并提供响应。人们可以很容易地看到如何将此示例扩展到不同的提示、添加超时以及添加更多提示响应步骤。
import getpass
import telnetlib
HOST = "localhost"
user = input("Enter your remote account: ")
password = getpass.getpass()
tn = telnetlib.Telnet(HOST)
tn.read_until(b"login: ")
tn.write(user.encode('ascii') + b"\n")
if password:
tn.read_until(b"Password: ")
tn.write(password.encode('ascii') + b"\n")
tn.write(b"ls\n")
tn.write(b"exit\n")
print(tn.read_all().decode('ascii'))
Run Code Online (Sandbox Code Playgroud)
但是,telnetlib(不是 3)已被弃用。
替代品 telnetlib3 ( https://telnetlib3.readthedocs.io/en/latest/intro.html#quick-example ) 提供了一个基于 asyncio 的示例,并且异步“shell”函数(与服务器交互)阻塞等待提示(异步的基本原理)并始终用“y”响应服务器。
import asyncio, telnetlib3
async def shell(reader, writer):
while True:
# read stream until '?' mark is found
outp = await reader.read(1024)
if not outp: …Run Code Online (Sandbox Code Playgroud) 我正在使用Python模块telnetlib来创建一个telnet会话(使用国际象棋服务器),我遇到了一个问题,我真的无法包围我的大脑.以下代码完美运行:
>>> f = login("my_server") #code for login(host) below.
>>> f.read_very_eager()
Run Code Online (Sandbox Code Playgroud)
这会吐出服务器通常在登录时打印的所有内容.但是,当我把它放在一个函数中,然后调用它:
>>> def foo():
... f = login("my_server")
... return f.read_very_eager()
...
>>> foo()
Run Code Online (Sandbox Code Playgroud)
我什么都没得到(空字符串).我可以检查登录是否正确执行,但由于某种原因我看不到文本.它吞噬了哪里?
非常感谢.
为了完整性,这里是登录(主机):
def login(host, handle="guest", password=""):
try:
f = telnetlib.Telnet(host) #connect to host
except:
raise Error("Could not connect to host")
f.read_until("login: ")
try:
f.write(handle + "\n\r")
except:
raise Error("Could not write username to host")
if handle == "guest":
f.read_until(":\n\r")
else:
f.read_until("password: ")
try:
f.write(password + "\n\r")
except:
raise Error("Could not write password to host") …Run Code Online (Sandbox Code Playgroud) if (tn.read_until('>')):
action1
else:
action2
Run Code Online (Sandbox Code Playgroud)
要么
if (tn.read_until() == '>'):
action1
else:
action2
Run Code Online (Sandbox Code Playgroud)
我只想read_until()检查哪个String首先出现,然后执行不同的操作.或者有没有相同的方法?
我很惊讶我在这里找不到这个问题.
我想从telnet响应中提取一行并使其成为变量.(实际上是该行的一个数字).我可以使用telnet.read_until()提取到我需要的位置,但整个开始仍然存在.打印输出显示机器的不同状态.
我想要获取的行格式如下:
CPU Utilization : 5 %
Run Code Online (Sandbox Code Playgroud)
我真的只需要数字,但输出的其余部分有很多':'和'%'字符.任何人都可以帮我提取这个价值吗?提前致谢!
这是我的代码(这将读取整个输出并打印):
import telnetlib, time
print ("Starting Client...")
host = input("Enter IP Address: ")
timeout = 120
print ("Connecting...")
try:
session = telnetlib.Telnet(host, 23, timeout)
except socket.timeout:
print ("socket timeout")
else:
print("Sending Commands...")
session.write("command".encode('ascii') + b"\r")
print("Reading...")
output = session.read_until(b"/r/n/r/n#>", timeout )
session.close()
print(output)
print("Done")
Run Code Online (Sandbox Code Playgroud)
编辑:输出可能是的一些示例:
Boot Version : 1.1.3 (release_82001975_C)
Post Version : 1.1.3 (release_82001753_E)
Product VPD Version : release_82001754_C
Product ID : 0x0076
Hardware Strapping : 0x004C
CPU Utilization : …Run Code Online (Sandbox Code Playgroud) 我试图使用telnetlib库在python中发送control + c命令.目前我在做
tn.write('^]')
Run Code Online (Sandbox Code Playgroud)
但上面的代码似乎不起作用.关于我应该使用什么的任何线索?
import telnetlib
def telNetCall():
host = "10.200.1.23"
user = "me"
password = "matrix"
telnet = telnetlib.Telnet(host)
telnet.read_until('Username: ', 3)
telnet.write(user + '\r')
telnet.read_until('Password: ', 3)
telnet.write(password + '\r')
telnet.write("sh log"+ "\r\n")
telnet.write('exit' + '\r')
print telnet.read_all()
Run Code Online (Sandbox Code Playgroud)
我的问题是,当我尝试从cisco路由器中获取"show log"时,它只给出了部分结果,我认为这是因为你需要按空格键5次(取决于日志历史记录的多长时间)来获取完整的日志 - 当我这样做manualy,我不知道如何告诉python列出完整的日志.有什么建议吗?