我想了解如何在简单场景下使用telnetlib3。
长期以来,telnetlib(不是3)在https://docs.python.org/3/library/telnetlib.html有一个简单的示例,其中python程序连接到telnet服务器,然后查找提示并提供响应。人们可以很容易地看到如何将此示例扩展到不同的提示,添加超时并添加更多的提示-响应步骤。
长期以来,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'))
然而,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:
# End of File
break
elif '?' in outp:
# reply all questions with 'y'.
writer.write('y')
# display all server output
print(outp, flush=True)
# EOF
print()
loop = asyncio.get_event_loop()
coro = telnetlib3.open_connection('localhost', 6023, shell=shell)
reader, writer = loop.run_until_complete(coro)
loop.run_until_complete(writer.protocol.waiter_closed)
我在如何使结构化的代码执行主流任务方面缺少一些线索,这在(字面上!)直接的telnetlib(非3)示例中得到了展示,其中服务器提供一系列不同的提示,而Python程序则提供相应的响应。我怀疑这部分是由于我对asyncio的陌生和应该使用哪些代码模式来使异步函数执行一系列步骤。
因此,看到以这种方式实现的telnetlib(非3)示例将是一个很大的帮助。