2

超级骗子 Python 新手在这里。明确学习网络自动化。我一直在尝试做的一件事是编写在 Python2 和 Python3 中都可以使用的代码,但我遇到了一个对大多数人来说可能很明显的问题。是的,这里的标题与我找到的这篇文章相同。但是据我所知,我已经完成了建议(通过 .format() 将变量粘贴到 write 语句中)

这是代码..

#!/usr/bin/env python

from __future__ import print_function, unicode_literals
import getpass
import telnetlib

#Ask for username/pass
host_ip = '192.168.122.200'

try:
    #For Py2
    username = raw_input('Enter your telnet username: ')
except NameError:
    #For Py3
    username = input('Enter your telnet username: ')

password = getpass.getpass()

tn = telnetlib.Telnet(host_ip)

tn.read_until('Username: ')
tn.write('{}\n'.format(username))
if password:
    tn.read_until('Password: ')
    tn.write('{}\n'.format(password))

tn.write('terminal length 0\n')
tn.write('show version\n')
tn.write('exit\n')

print(tn.read_all())

这是我在运行它时遇到的错误......

root@NetworkAutomation-1:~# python get_show_version.py 
Enter your telnet username: chase
Password: 
Traceback (most recent call last):
  File "get_show_version.py", line 22, in <module>
    tn.write('{}\n'.format(username))
  File "/usr/lib/python2.7/telnetlib.py", line 280, in write
    if IAC in buffer:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 0: ordinal not in range(128)
4

1 回答 1

0

我想出了解决方案。在使用 telnetlib 库时导入 unicode_literals 是错误的做法。我需要以相反的方向对其进行格式化,为 ascii 字符显式设置 python3。更正后的代码如下

#!/usr/bin/env python

from __future__ import print_function
import getpass
import telnetlib

#Ask for username/pass
host_ip = '192.168.122.200'

try:
    #For Py2
    username = raw_input('Enter your telnet username: ')
except NameError:
    #For Py3
    username = input('Enter your telnet username: ')

password = getpass.getpass()

tn = telnetlib.Telnet(host_ip)

tn.read_until(b'Username: ')
tn.write(username.encode('ascii') + b'\n')
if password:
    tn.read_until(b'Password: ')
    tn.write(password.encode('ascii') + b'\n')

tn.write(b'terminal length 0\n')
tn.write(b'show version\n')
tn.write(b'exit\n')

print(tn.read_all().decode('ascii'))
于 2018-02-19T23:48:12.267 回答