![如何捕获 PTY 上传输的数据?](https://linux22.com/image/41252/%E5%A6%82%E4%BD%95%E6%8D%95%E8%8E%B7%20PTY%20%E4%B8%8A%E4%BC%A0%E8%BE%93%E7%9A%84%E6%95%B0%E6%8D%AE%EF%BC%9F.png)
我正在运行 NetBSD 6.1.4,并且我有一个具有以下配置的 stunnel 实例:
[https service]
accept = 443
CAfile = /u01/usbtether/CA/certs/rootCA.crt
cert = /usr/pkg/etc/stunnel/stunnel.pem
pty = yes
exec = /usr/sbin/pppd
execargs = pppd call phone
verify = 2
client = no
一切都运行良好,除了另一侧的接收错误计数不断增加。我想比较离开隧道之前和之后的 ppp 流量。到目前为止我的策略是使用 socat。我更改了 exec 行以指向 shell 脚本,例如
#!/bin/sh
socat -,echo=0,raw SYSTEM:'tee /root/pppd-in.log | socat -,echo=0,raw EXEC:"/usr/sbin/pppd call phone" | tee /root/pppd-out.log'
但我似乎无法把事情安排好。我已经设法环回其他 pppd 发送的所有内容,或者忽略其他 pppd 发送的所有内容,但我无法获得正确的语法来实际在 stunnel 和 pppd 之间传递数据,同时还将输入和输出转储到文件(尽管我只关心关于输出)。
我也尝试过
#!/bin/sh
/usr/sbin/pppd call phone | tee /root/serial-out.log
但我似乎只是将乱码发送回调用 pppd (我假设通过 tee 的管道就像不包括 socat 中的原始数据?)。
那么窥探 PTY 中数据的最佳方法是什么?
为了增加兴趣,我在隧道另一侧收到的数据有时会被打乱一点。例如,我可能会收到一个 ppp 帧,其中包含长度为 100 的 IP 数据包,后跟 0x7e 和 10 个附加字节。另一个帧(可能在带有额外字节的帧之前或之后到达多个帧)将带着缺少 8 个字节的 IP 数据包到达。如果我要取出这个额外的块并将其附加到末尾,那么我可能会得到正确的 IP 数据包加上 FCS。我使用 PTY snoop 的目的是验证 pppd 是否正在发送这样的数据(因为丢失的块总是前面有一个 0x7e 字节,我认为这很可能),或者在传输过程中是否发生了奇怪的情况。
答案1
问题是我忘记包含“,pty”作为 EXEC:“/usr/sbin/pppd ...”的选项,因此 pppd 默默地崩溃了。