grepを使用してSOCATコマンドから仮想ポートアドレスを取得する

grepを使用してSOCATコマンドから仮想ポートアドレスを取得する

socatによって生成された仮想COMポートのアドレス(通常は/dev/pts/2および/dev/pts/3)が必要です。場合によっては元のアドレスから変更されるため、このアドレスが必要です。システムを再起動するたびにこのアドレスが必要なアプリケーションを作成しようとするため、このアドレスが必要です。

私は成功せず、同じ結果を得るためにさまざまな方法を試しました。

socat -d -d pty,raw,echo=0 pty,raw,echo=0 2>&1| sed  "2,3d"

出力を与えている

2020/06/02 01:20:02 socat[24206] N PTYは/dev/pts/4

しかし、

socat -d -d pty,raw,echo=0 pty,raw,echo=0 2>&1| sed '2,3d'|cut -d " " -f 7

出力なし

2つのCOMポートアドレスを2つの変数に保存し、それを自分のアプリケーションに渡す必要があります。皆様のご支援とご支援に感謝します。

答え1

誤った問題(および解決策)

質問で説明されている問題は、ラインバッファリングではなくブロックバッファリングが原因で発生します。これは、コマンド出力が端末でない場合のパフォーマンスを最適化するために、いくつかのコマンドで発生します。コマンドにはオプションがあり、それを使用できます。ここで:sed -u取得するには:

socat -d -d pty,raw,echo=0 pty,raw,echo=0 2>&1| sed -u '2,3d' |cut -d " " -f 7

または、次の一般的なツールを使用できます。stdbufまたはunbufferこのようなことが起こらないように。たとえば、後で新しいパイプを追加する場合は、次のようにする必要がcutあります。

[...] | stdbuf -oL cut -d " " -f 7 | [...]

つまり…実際の問題は忘れてください。デバッグ出力を解析することは、特定の目標を達成する最善の方法ではありません。たとえば、私のバージョンは行1と2にptysを出力します。などがsocat必要です。sed -u 3d


実用的なソリューション

実際、socat特定の問題を解決するためのオプションがあります。

PTY

擬似端末(pty)を作成し、その基本端末を使用します。

[...]

便利なオプション:協会、openpty、スレーブ待機、モード、ユーザー、グループ

後:

PTYオプショングループ

これらのオプションは、ptyアドレスタイプで使用するためのものです。

link=<filename>

実際の擬似端末(pty)へのシンボリックリンクを生成します。これは、ptys生成名がやや予測不可能になる問題を解決するのに役立ちます。、socatで自動的に生成されたptyに直接アクセスするのを難しくします。このオプションを使用すると、ユーザーは次のことができます。実際のptyにアクセスするのに役立つように、ファイル階層の「修正」ポイントを指定します(はい)。。 socatバージョン1.4.3以降、アドレスが閉じられるとシンボリックリンクが削除されます(ただし、unlink-closeオプションを参照)。

内部にはい部分:

socat PTY,link=$HOME/dev/vmodem0,rawer,wait-slave \
EXEC:"ssh modemserver.us.org socat - /dev/ttyS0,nonblock,rawer"

[...]

したがって、次のように問題を解決できます。

socat pty,raw,echo=0,link=$HOME/socatpty1 pty,raw,echo=0,link=$HOME/socatpty2

たとえば、次のように生成します。

$ ls -l $HOME/socatpty[12]
lrwxrwxrwx. 1 user user 11 Jun  1 21:58 /home/user/socatpty1 -> /dev/pts/15
lrwxrwxrwx. 1 user user 11 Jun  1 21:58 /home/user/socatpty2 -> /dev/pts/16

socat特にリンクが壊れている場合は、後でまたは以前にこれらのリンクをクリーンアップする必要があるかもしれません。

関連情報