问题环境:
在Linux上运行python3脚本远程登录设备,远程发送指令,并把指令的回显写入文件。
出现的问题:
正常应该显示的换行始终被显示成\r\n问题,在windows上能够正常显示
涉及的问题原因:
- windows和linux上对文本处理的差异
- 文本方式与二进制方式打开文件的区别
- paramiko中recv()获取的内容类型
- python3的编码格式
使用到的代码:
paramiko ssh登录代码
#在SSH server端创建一个交互式的shell,且可以按自己的需求配置伪终端,可以在invoke_shell()函数中添加参数配置。
remote_conn = ssh.invoke_shell()
remote_conn.send(‘ls\n’)
data=remote_conn.recv(10000)
fo=open(’/var/ftp/work/HELLO_WORD/test1.txt’,‘w’)
fo.write(data)
#仅供参考代码,不是实际执行代码
问题解决:
写入文本的格式编码转换。
修改后的代码
data=remote_conn.recv(10000).decode(‘utf-8’)
主要理清ssh发送指令接收到的内容的类型,文件读写内容类型就可以解决问题了。
-
data=remote_conn.recv(10000)
这个函数recv()在Linux python中收到的内容类型是bytes,在设备上显示默认使用utf-8格式
print(type(remote_conn.recv(10000)))
<class ‘bytes’> -
fo=open(’/var/ftp/work/HELLO_WORD/test1.txt’,‘w’)
fo.write(data)
以‘w’打开文件并写入,会报错
Traceback (most recent call last):
File “”, line 1, in
TypeError: write() argument must be str, not bytes
意思是写入的必须是string类型而不是bytes
解决这个问题有两种方法,一种是把文件打开方式改成二进制把‘w’改成‘wb’;还有一种就是把写入的data改成string类型
但是这些都不能解决写入含有"\r\n"的问题
原本以为是因为文本方式和二进制方式打开文件的区别
Windows平台下
如果以“文本”方式打开文件,当读取文件的时候,系统会将所有的"/r/n"转换成"/n";当写入文件的时候,系统会将"/n"转换成"/r/n"写入。
如果以"二进制"方式打开文件,则读/写都不会进行这样的转换。
在Unix/Linux平台下
“文本”与“二进制”模式没有区别。
但是后来发现linux没有区别,就不是打开文件类型的问题。
在网上找解决方法的时候,注意到decode()和encode()函数,才发现是引文解码问题导致的。
应该是通过ssh发送的指令收到的回显是utf-8格式的,type utf-8格式显示的是bytes类型,就以为传回是二进制,转换为str再写入就把\r\n一起显示出来,把utf-8格式解码成unicode类型再写入就没有问题了。
-
Python3默认编码是unicode;而Python2是ASCII码。Windows环境默认是gbk编码。参考 https://www.cnblogs.com/yunguoxiaoqiao/p/7588725.html
-
手动转码规则
UTF-8 --> decode 解码 --> Unicode Unicode --> encode 编码 --> GBK / UTF-8 等
把写入的内容解码成utf-8,就可以解决问题了。