python - 如何在python3中将字节控制台转换为字符串?
问题描述
我有 python 脚本,它保存我的 ssh 会话中的所有数据
import os
import pty
out = open('output.txt', 'w')
def read(fd):
data = os.read(fd, 1024)
out.write(data.decode('utf-8', 'ignore'))
return data
pty.spawn('./script.sh', read)
out.close()
#!/usr/bin/env bash ssh root@admin
我想在 output.txt 中得到类似的东西
root@admin:~# 顶 顶部 - 15:15:01 21 天,5:00,1 个用户,平均负载:0.00、0.00、0.00 任务:共 185 个,运行 1 个,睡眠 184 个,停止 0 个,僵尸 0 个 %Cpu(s): 0.1 us, 0.0 sy, 0.0 ni, 99.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB 内存:总计 2047952,170368 免费,327540 已使用,1550044 buff/cache KiB 交换:总共 0 个,免费 0 个,已使用 0 个。1373184 利用内存 PID 用户 PR NI VIRT RES SHR S %CPU %MEM TIME+ 命令 1 根 20 0 185396 6044 4020 S 0.0 0.3 0:23.03 systemd 2根20 0 0 0 0 S 0.0 0.0 0:00.06 kthreadd 3 根 20 0 0 0 0 S 0.0 0.0 0:00.98 ksoftirqd/0 5 根 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:+ 7 根 20 0 0 0 0 S 0.0 0.0 3:41.59 rcu_sched 8根20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh 9 根 rt 0 0 0 0 S 0.0 0.0 0:01.01 迁移/0 10 根 rt 0 0 0 0 S 0.0 0.0 0:06.50 看门狗/0 11 根 rt 0 0 0 0 S 0.0 0.0 0:06.96 看门狗/1 12 根 rt 0 0 0 0 S 0.0 0.0 0:00.86 迁移/1 13 根 20 0 0 0 0 S 0.0 0.0 0:02.11 ksoftirqd/1 15 根 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/1:+ 17 根 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs 18根0 -20 0 0 0 S 0.0 0.0 0:00.00 netns 19 根 0 -20 0 0 0 S 0.0 0.0 0:00.00 性能 20 根 20 0 0 0 0 S 0.0 0.0 0:00.00 khungtaskd 21 根 0 -20 0 0 0 S 0.0 0.0 0:00.00 回写 root@admin:~# 退出
但我明白了
]0;root@admin: ~root@admin:~# ex[K[Ktop [?1h=[?25l[H[2J(B[mtop - 15:15:01 up 21 days, 5:00, 1 user, load average: 0.00, 0.00, 0.00(B[m[39;49m(B [米[39;49米[K 任务:(B[m[39;49m[1m 185 (B[m[39;49mtotal,(B[m[39;49m[1m 1 (B[m[39;49mrunning,(B[m[39;49m [1m 184 (B[m[39;49msleeping,(B[m[39;49m[1m 0 (B[m[39;49mstopped,(B[m[39;49m[1m 0 (B[m[39; 49mzombie(B[m[39;49m(B[m[39;49m[K %Cpu(s):(B[m[39;49m[1m 0.1 (B[m[39;49mus,(B[m[39;49m[1m 0.0(B[m[39;49msy,(B[m [39;49m[1m 0.0 (B[m[39;49mni,(B[m[39;49m[1m 99.9(B[m[39;49mid,(B[m[39;49m[1m 0.0(B[ m[39;49mwa,(B[m[39;49m[1m 0.0 (B[m[39;49mhi,(B[m[39;49m[1m 0.0(B[m[39;49msi,(B[m [39;49m[1m 0.0 (B[m[39;49mst(B[m[39;49m(B[m[39;49m[K KiB Mem :(B[m[39;49m[1m 2047952 (B[m[39;49mtotal,(B[m[39;49m[1m 170368 (B[m[39;49mfree,(B[m[39; 49m[1m 327540 (B[m[39;49mused,(B[m[39;49m[1m 1550044 (B[m[39;49mbuff/缓存(B[m[39;49m(B[m[39;49m [K KiB 交换:(B[m[39;49m[1m 0 (B[m[39;49mtotal,(B[m[39;49m[1m 0 (B[m[39;49mfree,(B[m[39; 49m[1m 0 (B[m[39;49mused.(B[m[39;49m[1m 1373184(B[m[39;49mavail Mem(B[m[39;49m(B[m[39;49m[ ķ [K [7m PID 用户 PR NI VIRT RES SHR S %CPU %MEM TIME+ 命令(B[m[39;49m[K (B[m 1 根 20 0 185396 6044 4020 S 0.0 0.3 0:23.03 systemd (B[m[39;49m[K (B[m 2 根 20 0 0 0 0 S 0.0 0.0 0:00.06 kthreadd (B[m[39;49m[K (B[m 3 根 20 0 0 0 0 S 0.0 0.0 0:00.98 ksoftirqd/0 (B[m[39;49m[K (B[m 5 根 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:+ (B[m[39;49m[K (B[m 7 根 20 0 0 0 0 S 0.0 0.0 3:41.59 rcu_sched (B[m[39;49m[K (B[m 8 根 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh (B[m[39;49m[K (B[m 9 根 rt 0 0 0 0 S 0.0 0.0 0:01.01 迁移/0 (B[m[39;49m[K (B[m 10 根 rt 0 0 0 0 S 0.0 0.0 0:06.50 看门狗/0 (B[m[39;49m[K (B[m 11 根 rt 0 0 0 0 S 0.0 0.0 0:06.96 看门狗/1 (B[m[39;49m[K (B[m 12 根 rt 0 0 0 0 S 0.0 0.0 0:00.86 迁移/1 (B[m[39;49m[K (B[m 13 根 20 0 0 0 0 S 0.0 0.0 0:02.11 ksoftirqd/1 (B[m[39;49m[K (B[m 15 根 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/1:+ (B[m[39;49m[K (B[m 17 根 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs (B[m[39;49m[K (B[m 18 根 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns (B[m[39;49m[K (B[m 19 根 0 -20 0 0 0 S 0.0 0.0 0:00.00 perf (B[m[39;49m[K (B[m 20 根 20 0 0 0 0 S 0.0 0.0 0:00.00 khungtaskd (B[m[39;49m[K (B[m 21 根 0 -20 0 0 0 S 0.0 0.0 0:00.00 回写 (B[m[39;49m[K[?1l>[25;1H [?12l[?25h[K]0;root@admin:~root@admin:~#exit
解决方案
您看到的是 ANSI 转义序列。它们用于控制颜色和光标位置。
在您的 script.sh 中使用“top -b”而不是“top”来删除所有特殊显示字符。
推荐阅读
- django - Django 删除 where SET_NULL
- python - 获取正在实例化我的类的模块的名称
- sql - 在 string_agg 中排序似乎不起作用
- python - Python Checkbutton 只读取一次值
- python - 使用 Python 从 SQL 中搜索元素
- angular - 将wijmo网格的整个数据以角度5复制到剪贴板
- sql-server - 如何将图像从 DataGridView 显示到 PictureBox?
- android - 使用本机方法时,android loadLibrary 失败
- php - Laravel 将数据从 ajax 传递到位于单独文件中的模态视图,导致模态视图无法呈现
- spring - @Value("#{servletContext.contextPath}") 如何解决 @Value("${servletContext.contextPath}")