问题介绍
我们在使用SSH协议通过终端模拟器(如MobaXterm、Windows Terminal等)连接Linux系统,访问系统命令行时,通常命令行是可以输出彩色文字的,并且命令行的行列数可以随着终端模拟器窗口大小的变化而自动变化。
但如果我们是用串口线连接Linux设备,然后通过终端模拟器走串口协议访问Linux系统命令行呢?在这种情况下,通常命令行输出的文字都是黑白色,并且行列数量固定为24x80(使用其它组合都会产生显示错位)。
我们的终端模拟器明明有能力显示颜色,为何用串口连接时就只能显示黑白字符了呢?下面我们就来解决这个问题,让串口终端的命令行“重焕光彩”~
快速设置
想快速解决问题的童鞋看这里~
注意
并不是所有串口终端模拟器都支持彩色字符显示等高级功能。
- Windows下建议使用MobaXterm作为终端模拟器。串口终端连接成功后,MobaXterm支持使用键盘/鼠标与Linux终端程序交互,如Vim等程序。但博主测试MobaXterm在输出大量不可打印字符时可能出现bug,比如会莫名其妙地在命令行附加一堆
xterm-256color
字符串。博主通过执行head /dev/urandom
命令可以复现这个bug,不知道大家有没有遇到。- Linux下可以使用picocom或minicom,直接用apt等包管理器即可安装。博主测试了picocom,没有上述bug。
- 如果想在Windows下使用picocom,可以安装Cygwin,在其中编译picocom源代码。Windows下串口
COM{x}
对应着Cygwin串口设备/dev/ttyS{x-1}
。但Windows系统下picocom似乎在某些串口设备的初始化时有问题,无法直接与机器建立串口连接(首次连接时报错)。我们需要先使用其它串口工具连接一次机器,连接成功后退出串口工具,再使用picocom,此时可以成功连接。
首先通过串口连接到目标Linux机器,使用tty
命令检查当前使用的串口终端设备文件。观察输出,只要我们是通过当前串口连接到机器,输出的终端设备应当保持不变。以下是我使用树莓派的示例:
pi@raspberrypi:~ $ tty
/dev/ttyGS0
接着检查命令行是否支持resize
命令。如果该命令不存在,请安装Xterm程序:
sudo apt install xterm
安装完毕后,我们的系统命令行应当多出一个resize
命令。只要运行这个命令,命令行就会自动调整行列数,来适应当前终端的窗口大小。SSH连接可以通过SIGWINCH
信号自动实现该功能,可惜串口连接不能,因此我们用resize
命令来尽量弥补这一缺陷。
接着打开当前用户的~/.bashrc
自动脚本,找到其中首次涉及到终端类型变量$TERM
的位置:
在该行上方另外新起一行,插入如下Shell代码:
if [ "$(tty)" = "刚才查询到的设备文件" ]; then
TERM=一个支持256色和其它先进操作的终端,如xterm-256color
trap "resize &> /dev/null" DEBUG
fi
脚本逻辑
如果当前终端为指定的串口终端,那么:
~~~~ 告诉系统,当前用户所使用的终端是一个支持256彩色等功能的高级终端(如MobaXterm),而不是什么古老的终端(如vt100)。
~~~~ 每次在Shell命令行执行一句命令,就自动适应当前终端的窗口大小(如果你发现在某些场合下,此功能影响到Shell脚本运行效率,可以注释掉这一行,自己按需手动resize)。
示例如下:
保存修改,执行该自动脚本,使改动生效。之后每次通过串口终端登录你的用户时,上述脚本都会被自动执行:
source ~/.bashrc
大功告成~