Telnetlib Python示例

17

所以我正在尝试Python文档中给出的这个非常简单的例子:

import getpass
import sys
import telnetlib

HOST = "<HOST_IP>"
user = raw_input("Enter your remote account: ")
password = getpass.getpass()

tn = telnetlib.Telnet(HOST)

tn.read_until("login: ")
tn.write(user + "\n")
if password:
   tn.read_until("Password: ")
   tn.write(password + "\n")

tn.write("ls\n")
tn.write("exit\n")
print tn.read_all()

我的问题是它在read_all()结束时停滞了... 它不会打印任何东西。我以前从未使用过这个模块,所以我正在尝试让这个非常基本的示例工作才能继续。顺便说一句,我正在使用Python 2.4。谢谢。

7个回答

15

好的,我找到了一个解决方案。在输入ls和exit之前,我需要先指定终端类型。添加

tn.write("vt100\n") 

在"ls"命令修复了我的问题之前。


1
鼓励您自行给出答案,这将有助于未来阅读此问题的其他人。 - Mawg says reinstate Monica
1
为什么需要这个? - ransh

6
如果您正在使用Windows,请确保在新行字符之前添加回车符(\r):
tn.write(user.encode('ascii') + "\r\n".encode('ascii'))

5

我知道这篇文章发布有点晚了,但也许对其他人有所帮助。我自己也曾苦苦挣扎过,并最终写出了以下代码。我的telnet会按照一定的流程进行,例如它会要求输入登录ID密码,然后你必须等待特定的字符串出现在这里,对于我的情况是"DB>",然后你就可以继续执行命令了。我的输出将保存在"out"变量中。

import os,re,telnetlib
host = "10.xxx.xxx.xxx"
port = 23

telnet = telnetlib.Telnet()
telnet.open(host, port)
telnet.write('loginID\r\n')
telnet.write('Password\r\n')
out = telnet.read_until("DB>", 5)
telnet.write('show cable modem reg\r\n') #Mycommand
out = telnet.read_until("DB>", 5)
telnet.write('quit\r\n')
telnet.close()

想了解更多变体和帮助,请查看网站nullege


3

我没有一个telnet服务器可以进行测试,但我认为问题在于你没有读取每个写入的命令后的服务器响应直到提示符。

PROMPT = ':~$'
tn = telnetlib.Telnet(HOST)
tn.read_until('login: ')
tn.write(user + '\n')
if password:
   tn.read_until('Password: ')
   tn.write(password + '\n')
tn.read_until(PROMPT)
tn.write('ls\n')
print tn.read_until(PROMPT)
tn.write('exit\n')

顺便提一下,telnetlib可能会比较棘手,而且根据你的FTP服务器和环境设置情况而异。你最好考虑使用像pexpect这样的工具来自动化登录和通过telnet与用户进行交互。


请问您能否解释一下为什么我们需要在这里最后加上退出命令 tn.write('exit\n')? - qre0ct

1

我曾经花了一些时间试图向SynAccess电源插排写入数据。以下是我实现它的方法:

import sys
import telnetlib
HOST = < your SynAccess switch ip address >
user = < user name >
password = < password >

tn = telnetlib.Telnet(HOST, 23, 5)
tn.write("login\r\n")
tn.write(user + "\r\n")
tn.write(password + "\r\n")
tn.write("rb 3\r\n") # this reboots plug 3
tn.write("rb 1\r\n") # this reboots plug 1
tn.write("logout\r\n")
tn.close

0

使用Python 2.7或者更高版本,最后一行应该加上"("和")"。


0
如果这些答案都不起作用,您也可以尝试:
 tn.read_until(b"Password: ")
 tn.write(password.encode('utf-8') + b"\n")
 tn.read_until(b"Terminal type?", 5)
 tn.write("vt100\n".encode('utf-8'))
 tn.read_until(b">", 5)

尽管我从未看到终端类型的实际请求被打印出来,但这个写入似乎可以工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接