Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Telnet.read.until函数不执行';行不通_Python 3.x - Fatal编程技术网

Python 3.x Telnet.read.until函数不执行';行不通

Python 3.x Telnet.read.until函数不执行';行不通,python-3.x,Python 3.x,尝试telnet到Brocade路由器时,python脚本发出错误。。。。我不确定这里出了什么问题。已尝试调试,但无法使其工作。我认为这是一个及时的问题。我很感激如果有人有建议如何让它工作 注意:这是Python 3.0 import getpass import sys import telnetlib HOST = "1.1.1.1" user = "admin" password = "password" port = "23" telnet = telnetlib.Telnet(HO

尝试telnet到Brocade路由器时,python脚本发出错误。。。。我不确定这里出了什么问题。已尝试调试,但无法使其工作。我认为这是一个及时的问题。我很感激如果有人有建议如何让它工作

注意:这是Python 3.0

import getpass
import sys
import telnetlib

HOST = "1.1.1.1"
user = "admin"
password = "password"
port = "23"

telnet = telnetlib.Telnet(HOST)

telnet.read_until("sw0 login:,3")

telnet.write(admin + "\r")
if password:
    telnet.read_until("Password: ")
    telnet.write(password + "\n")

tn.write("term len 0" + "\n")
telnet.write("sh ver br\n")
telnet.write("exit\n")


ERROR:

Traceback (most recent call last):
  File "C:\Users\milan\Desktop\telnetNew.py", line 13, in <module>
    telnet.read_until("Username :,3")
  File "C:\Python33\lib\telnetlib.py", line 299, in read_until
    return self._read_until_with_select(match, timeout)
  File "C:\Python33\lib\telnetlib.py", line 352, in _read_until_with_select
    i = self.cookedq.find(match)
TypeError: Type str doesn't support the buffer API


This is my prompt after logging manually using telnet port 23 and this is what i expected command to work.
_________________________________________________________________________________



Network OS (sw0)
xxxxxxxxxx


sw0 login: xxxxx
Password:  xxxxx

WARNING: The default password of 'admin' and 'user' accounts have not been changed.

Welcome to the Brocade Network Operating System Software
admin connected from 10.100.131.18 using console on sw0
sw0# sh ver


sw0#
导入getpass
导入系统
导入telnetlib
HOST=“1.1.1.1”
user=“admin”
password=“password”
port=“23”
telnet=telnetlib.telnet(主机)
telnet.read_直到(“sw0登录:,3”)
telnet.write(管理员+“\r”)
如果输入密码:
telnet.read_直到(“密码:”)
telnet.write(密码+“\n”)
tn.write(“术语长度0”+“\n”)
telnet.write(“sh ver br\n”)
telnet.write(“退出\n”)
错误:
回溯(最近一次呼叫最后一次):
文件“C:\Users\milan\Desktop\telnetNew.py”,第13行,在
telnet.read_直到(“用户名:,3”)
文件“C:\Python33\lib\telnetlib.py”,第299行,在read\u中
返回self.\u读取\u直到使用\u选择(匹配,超时)
文件“C:\Python33\lib\telnetlib.py”,第352行,在_read_直到_与_select
i=self.cookedq.find(匹配)
类型错误:类型str不支持缓冲区API
这是我使用telnet端口23手动登录后的提示,这是我希望该命令能够工作的。
_________________________________________________________________________________
网络操作系统(sw0)
XXXXXXXXX
sw0登录名:xxxxx
密码:xxxxx
警告:“管理员”和“用户”帐户的默认密码尚未更改。
欢迎使用Brocade网络操作系统软件
管理员使用sw0上的控制台从10.100.131.18连接
sw0#sh ver
sw0#

在查看文档时,telnetlib似乎想要一个bytestr,而不是Str。所以试试这个,它应该将所有内容转换为字节,而不是Str

import sys
import telnetlib

HOST = "1.1.1.1"
user = "admin"
password = "password"
port = "23"

telnet = telnetlib.Telnet(HOST,port)
telnet.read_until(b"login: ")

telnet.write(admin.encode('ascii') + b"\n")
telnet.read_until(b"Password: ")
telnet.write(password.encode('ascii') + b"\n")

tn.write(b"term len 0\n")
telnet.write(b"sh ver br\n")
telnet.write(b"exit\n")
--编辑——我安装了python,并对我的一个路由器进行了测试。将用户名/密码更改为凭据后,我可以正常登录。(我删除了密码检查和getpass,因为它们没有被使用,因为您的代码已经对它们进行了硬编码)。看起来您复制了2.x示例,但3.x需要与缓冲区兼容的示例,而没有b“我明白了

Traceback (most recent call last):
  File "foo.py", line 5, in <module>
    telnet.read_until("login: ")
  File "/usr/local/Cellar/python32/3.2.5/Frameworks/Python.framework/Versions/3.2/lib/python3.2/telnetlib.py", line 293, in read_until
    return self._read_until_with_poll(match, timeout)
  File "/usr/local/Cellar/python32/3.2.5/Frameworks/Python.framework/Versions/3.2/lib/python3.2/telnetlib.py", line 308, in _read_until_with_poll
    i = self.cookedq.find(match)
TypeError: expected an object with the buffer interface
这表明它正在工作。你现在遇到了什么错误

import telnetlib , socket


class TELNET(object):

    def __init__(self):
        self.tn = None
        self.username = "root"
        self.password = "12345678"
        self.host = "10.1.1.1"
        self.port = 23
        self.timeout = 5
        self.login_prompt = b"login: "
        self.password_prompt = b"Password: "

    def connect(self):
        try :
            self.tn = telnetlib.Telnet(self.host,self.port,self.timeout)
        except socket.timeout :
            print("TELNET.connect() socket.timeout")

        self.tn.read_until(self.login_prompt, self.timeout) 
        self.tn.write(self.username.encode('ascii') + b"\n")

        if self.password :
            self.tn.read_until(self.password_prompt,self.timeout)
            self.tn.write(self.password.encode('ascii') + b"\n")

    def write(self,msg):
        self.tn.write(msg.encode('ascii') + b"\n")
        return True


    def read_until(self,value):
        return self.tn.read_until(value)


    def read_all(self):
        try :
            return self.tn.read_all().decode('ascii')
        except socket.timeout :
            print("read_all socket.timeout")
            return False

    def close(self):
        self.tn.close()
        return True


    def request(self,msg):
        self.__init__()
        self.connect()
        if self.write(msg) == True :
            self.close()
            resp = self.read_all()
            return resp
        else :
            return False

telnet = TELNET()

#call request function 

resp = telnet.request('ps www') # it will be return ps output
print(resp) 

该代码在python3上运行,就像其他答案所说的,问题在于Telnetlib需要字节字符串。在Python2中,
str
类型是字节字符串(二进制数据字符串)而在Python3中它是一个unicode字符串,一个新的
字节
类型表示二进制数据,与Python2中的
str
相同

这样做的结果是,在Python 3中使用Telnetlib时,需要将
str
数据转换为
bytes
数据。我有一些在Python2和Python3中都可用的代码,我认为值得分享

class Telnet(telnetlib.Telnet,object):
    if sys.version > '3':
        def read_until(self,expected,timeout=None):
            expected = bytes(expected, encoding='utf-8')
            received = super(Telnet,self).read_until(expected,timeout)
            return str(received, encoding='utf-8')

        def write(self,buffer):
            buffer = bytes(buffer, encoding='utf-8')
            super(Telnet,self).write(buffer)

        def expect(self,list,timeout=None):
            for index,item in enumerate(list):
                list[index] = bytes(item, encoding='utf-8')
            match_index, match_object, match_text = super(Telnet,self).expect(list,timeout)
            return match_index, match_object, str(match_text, encoding='utf-8')
然后实例化新的
Telnet
类,而不是
telnetlib.Telnet
。新类重写telnetlib中的方法,以执行从
str
bytes
bytes
str
的转换,这样问题就消失了

当然,我只覆盖了我正在使用的方法,但是从示例中应该可以清楚地看到如何将这个想法扩展到其他方法

 bytes(str_string, encoding='utf-8')


我的代码是有效的Python 2和3,因此不需要修改任何一个解释器即可工作。在Python 2中,覆盖方法的代码会被跳过,实际上会被忽略。如果您不关心向后兼容性,可以删除检查Python版本的条件。

这些答案中的大多数都是非常深入的解释和说明我发现它们有点难以理解,简单的回答是Python 3x站点上的示例代码是错误的

来解决这个问题,而不是 'telnet.read_直到(“用户名:,3”)' 使用
'telnet.read_直到(b“用户名:,3”)“

看起来python2-3转换和str到unicode转换可能有问题。不久前telnetlib中有一个错误,看起来已经修复,所以不确定下一步该去哪里。您的意思是说telnetlib本身在python3中有问题?谢谢。但是我看到语法错误。import getpass import sys import telnetlib HOST=”10.20.23.65“user=“admin”password=“password”port=“23”telnet=telnetlib.telnet(HOST)telnet.read_直到(b”user:)telnet.write(admin.encode('ascii')+b“\r”)tn.write(user.encode('admin”+“\r”)如果密码为:telnet.read_直到(b”password:)telnet.write(password.encode('ascii')+b“\n”)tn.write密码“+”\n”)tn.write(b“term len 0\n”)telnet.write(b“sh ver br\n”)telnet.write(b“exit\n”)主要用于使用python向telnet seision发出show命令。它失败并在“if password:“我所做的只是复制代码并添加b以将其标识为字节。在添加b后的代码中,是否会出现与缓冲区API相同的错误或新错误?如果可能的话,可能还会有一些解释…”。。?
 bytes(str_string, encoding='utf-8')
str(bytes_string, encoding='utf-8')