socatはデュアルエコーを無効にします

socatはデュアルエコーを無効にします

一般的な対話型Pythonセッションを実行すると、入力/出力は次のようになります。

>>> 1 + 1;
2

これで実行しようとしているので、socat「サーバー」を起動します。

socat UNIX-LISTEN:$HOME/socket,fork EXEC:python,pty,stderr

他の端末から接続します。

socat - UNIX-CONNECT:$HOME/socket

入力が再びエコーされることを除いて、ほぼうまく機能します。

>>> 1 + 1;
1 + 1;
2

どうやってドラッグできますか?echo=0私がしたいことをしません。これにより、入力したときに入力内容が非表示になり、あまり役に立ちません。一般的なインタラクティブセッションのように機能したいです。

(Pythonとローカルドメインソケットを使用するのは1つの例です。他のプログラム(cat、luaなど)や他のソケットタイプ(TCPソケットなど)でも同様です。

ベストアンサー1

クライアント側でこれを作成します。気づく「生の」

socat unix-connect:socket -,raw,echo=0

またはこれサービス端末。 「エコ=0」をご覧ください。

socat unix-listen:socket exec:"python",pty,echo=0

しかし、両方ともできません。あるいは、クライアントstdioでrawを使用し、サーバーptyでecho = 0を使用すると機能しますが、echo = 0を2回適用しないでください。


1+1 2つのことを見てみましょう。彼らはエコーですが、異なる意味を持っています。最初のエコーはクライアントのラインバッファから出て、2番目のエコーはsocatによって生成されたサーバー側ターミナルから来ます。

>>> 1 + 1;
1 + 1;
2

クライアントstdioでecho = 0のみを使用すると、socatはstdioバッファのエコー(画面表示)を無効にするように制御端末(xtermなど)に通知するため、最初の1 + 1が消え、2番目の1 + 1が表示されます。キーを押しました。サーバーptyのecho = 0は、socatが受信した入力をクライアントに再エコー(ping)するのを防ぎ、2番目の1 + 1が消えます。そして生のクライアントではstdioのバッファリングが無効になっているため、各キーは戻り値がサーバーに送信されるのを待たず、サーバーはすぐにキーをエコーし​​ます。。クライアント stdio では raw を使用し、クライアント stdio では echo=0 を使用します。キーを押すと、最初にキーがサーバーに送信され、サーバーはそれを再送信してクライアントに表示します。クライアントstdioでrawを使用し、サーバーptyでecho = 0を使用すると、キーが押されたときにサーバーに送信されると同時に表示されますが、再送信されません。


コマンドライン編集の場合は、クライアント側で1行をバッファリングし、その行編集が完了するまで行全体を送信しないだけで十分です。ただし、強力なスマートコンプリート機能が必要な場合は、サーバー側の参加が必要です。

おすすめ記事