web-dev-qa-db-ja.com

PTYで転送されたデータをキャプチャする方法は?

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

反対側で増加し続けるrxエラー数を除いて、すべてがうまく機能します。 stunnelを出る前後のpppトラフィックを比較したいと思います。これまでの私の戦略は、socatを使用することです。次のようなシェルスクリプトを指すようにexec行を変更しました

#!/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に意味不明な言葉を送り返しているようです(ティーを通るパイプは、socatにrawが含まれていないようなものだと思いますか?)。

では、PTYのデータをスヌープする最良の方法は何ですか?

さらに興味深いことに、stunnelの反対側で受信したデータは時々少しスクランブルされます。たとえば、長さが100のIPパケット、それに続く0x7e、および10バイトの追加のpppフレームを受信する場合があります。別のフレーム(余分なバイトがあるフレームの前後に数フレーム到着した可能性があります)は、8バイトが欠落しているIPパケットで到着します。その余分なチャンクを取得して最後に追加すると、おそらく正しいIPパケットとFCSが得られます。 PTYスヌープでの私の意図は、pppdがそのようなデータを送信しているかどうか(欠落しているチャンクの前には常に0x7eバイトがあるため、これは可能性が高いと思います)、または転送中に何か奇妙なことが起こっているかどうかを確認することです。

1
Jonny

問題は、EXECのオプションとして「、pty」を含めるのを忘れたため、「/ usr/sbin/pppd ...」ということでした。そのため、pppdはサイレントにクラッシュしていました。

0
Jonny