我正在使用Paramiko将一些命令发送到路由器,但是输出文本几乎不可读。
如何删除输出中的'b'
和\r\n
?
断线的正确方法是什么?
应该认为这段代码应该正确地断行:
def print_lines(self, data):
last_line = data
if '\n' in data:
lines = data.splitlines()
for i in range(0, len(lines)-1):
print((lines[i]))
last_line = lines[len(lines) - 1]
if data.endswith('\n'):
print(last_line)
last_line = ''
return last_line
这是完整的代码:
class ssh:
shell = None
client = None
transport = None
def __init__(self, address, username, password):
# print(("Connecting to server on ip", str(address) + "."))
self.client = paramiko.client.SSHClient()
self.client.set_missing_host_key_policy(paramiko.client.AutoAddPolicy())
self.client.connect(address, username=username, password=password, look_for_keys=False)
self.transport = paramiko.Transport((address, 22))
self.transport.connect(username=username, password=password)
thread = threading.Thread(target=self.process)
thread.daemon = True
thread.start()
def close_connection(self):
if(self.client != None):
self.client.close()
self.transport.close()
def open_shell(self):
self.shell = self.client.invoke_shell()
def send_shell(self, command):
if(self.shell):
self.shell.send(command + "\n")
else:
print("<h1>Shell não aberta.</h1>")
def process(self):
global strdata, fulldata
while True:
# Print data when available
if self.shell is not None and self.shell.recv_ready():
alldata = self.shell.recv(1024)
while self.shell.recv_ready():
alldata += self.shell.recv(1024)
strdata = strdata + str(alldata)
fulldata = fulldata + str(alldata)
strdata = self.print_lines(strdata) # print all received data except last line
def print_lines(self, data):
last_line = data
if '\n' in data:
lines = data.splitlines()
for i in range(0, len(lines)-1):
print((lines[i]))
last_line = lines[len(lines) - 1]
if data.endswith('\n'):
print(last_line)
last_line = ''
return last_line
sshUsername = "admin"
sshPassword = "password"
sshServer = "192.168.40.165"
connection = ssh(sshServer, sshUsername, sshPassword)
connection.open_shell()
connection.send_shell('en')
connection.send_shell('conf t')
connection.send_shell('hostname R5')
time.sleep(1)
print('<h1>'+fulldata+'</h1>') # This contains the complete data received.
connection.close_connection()
我希望如此:
R5#en
R%#conf t
Enter configuration commands, one per line. End with CNTL/Z.
R5(config)#hostname R5
R5(config)#
但这是结果:
b'\r\nR5#'b'e'b'n'b'\r\n'b'R5#'b'c'b'o'b'n'b'f'b' t'b'\r\n'b'Enter configuration commands, one per line. End with CNTL/Z.\r\nR5(config)#'b'h'b'o'b's'b't'b'n'b'a'b'm'b'e'b' 'b'R'b'5'b'\r\n'b'R5(config)#'
我如何正确地换行? 请原谅我的重要帖子。
答案 0 :(得分:1)
alldata从paramiko接收字节,并且您正在使用str(bytes),因此您将引号放在b'string'周围。您需要使用解码来解码字节
alldata_str = alldata.decode()
strdata = strdata + alldata_str
fulldata = fulldata + alldata_str
有些库可以帮助paramiko,例如基于paramiko的路由器netmiko。我也有一个库,可以对一般https://github.com/filintod/pyremotelogin的设备(也基于paramiko)进行终端交互ssh。还有用于网络的凝固汽油弹(https://napalm-automation.net/blog/)。
答案 1 :(得分:1)
您似乎正在处理bytes()
对象(more info),因此必须使用decode()
方法将其转换为字符串。
例如,让我们创建一个bytes()
对象并将其变回字符串:
greeting = str("Hello World").encode("UTF-8")
print(greeting)
greeting = greeting.decode("UTF-8")
print(greeting)
或者您的情况:
alldata_str = alldata.decode("UTF-8")
警告:Paramiko的字符串编码可能不同,因此请务必仔细检查其documentation。
祝你好运。