![XON/XOFF 流量控制是否通过多个终端会话跳跃进行传输?](https://linux22.com/image/15584/XON%2FXOFF%20%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6%E6%98%AF%E5%90%A6%E9%80%9A%E8%BF%87%E5%A4%9A%E4%B8%AA%E7%BB%88%E7%AB%AF%E4%BC%9A%E8%AF%9D%E8%B7%B3%E8%B7%83%E8%BF%9B%E8%A1%8C%E4%BC%A0%E8%BE%93%EF%BC%9F.png)
我试图解决的难题是,较大的文本输出最终会分解成混乱的文本。
作为背景,我正在使用一台旧机器(EPSON PX-8)通过 RS232 连接到 Pi3,使用 PX-8 上称为 TEL 的终端仿真软件
电话设置 - 波特率:9600,字符位:8,奇偶校验:无,停止位:2,RTS:开,流量控制:开
最初我在 PX-8 和 Pi3 之间发现了这个问题。我能够通过启用 XON/XOFF 信令的流量控制来解决这个问题。然而,当我尝试从 Pi3 telnet 或 ssh 到另一台 Linux 主机时,在尝试输出较大的文本块时,我再次收到乱码文本。
下面的文本输出是我尝试打印命令历史记录时发生的情况的示例。
1 sudo rasp-config
2 sudo raspi-config
3 sudo nano /boot/cmdline.txt
4 tail /boot/cmdline.txt
5 sudo shutdown -r now
6 sudo vim ~/boot/cmdline.txt
7 cd /./boot
8 dir
9 sudo vim cmdline.txt
10 sudo vim config.txt
11 sudo shutdown -r now
12 dfgdf
13 vim
14 sudo vim cmdline.txt
15 cd /./boot
16 sudo vim cmdline.txt
17 sudo shutdown -r now
18 cd /./boot
19 sudo vim cmdline.txt
20 sudo shutdown -r now
21 ping 8.8.8.8
2 xprt TEM=Vvj9s9ds9j3oin so nat1 machine
x Rom =vos cngas-2goses9g3
-xtiet n n5
-s oiy
y
答案1
我假设您在 pi 上有类似串行到 USB 适配器的东西,并且已经设置了一个,getty
以便您可以从 PX-8 登录到此 tty。登录后,stty ixon
shell 将为 pi 的输出启用 xon/xoff 流量控制。如果您现在ssh
从 shell 登录到某个远程,则流量控制不足以阻止来自远程的大量输出。
似乎正在发生的事情(执行strace -v -f -o /tmp/trace ssh
并查找ioctl(0,...)
)是ssh
故意将终端置于原始模式,其中包括关闭ixon
设置。这通常是所期望的;您希望输入的每个字符都发送到远程设备,远程设备有自己的 pty 来处理流量控制等。
不幸的是,远程的输出是在大缓冲区中发送的,因此来自 PX-8 的 xoff 字符几乎没有影响,因为当它到达远程时,pi 已接收到的所有大缓冲区将继续输出,可能会导致溢出和数据丢失。
stty ixon
您可以尝试的是在建立 ssh 连接后在 pi 上重新发出 an 。自动执行此操作的一种方法是添加到您的~/.ssh/config
2 个选项行
PermitLocalCommand yes
LocalCommand sleep 10 && stty ixon -F /dev/tty &
PermitLocalCommand
为了安全起见默认关闭;看man ssh_config
。