socatで仮想シリアルコンソールポートを用意したい会
そろそろデバッグ用にWasmLinuxにもコンソールが欲しい感じになってきた。
xterm-ptyのようにxterm.jsにPTYを付ける拡張もあるには有るけど、そもそもxterm.jsがXTerm風のエスケープシーケンスをサポートしているので、いわゆるraw consoleとして転送するだけで役割を果たすんではないか説。
socatのビルド
公式 http://www.dest-unreach.org/socat/ からDLして普通にビルドする。リポジトリ https://repo.or.cz/socat.git から autoreconf だと上手くいかなかった。(Cygwin 3.4)
サーバーの起動
./socat TCP4-LISTEN:5666,reuseaddr "EXEC:/bin/bash -l,pty,stderr,setsid,ctty"
これで上手くいった。 setsid,ctty
しないと Ctrl + C
できない。 ...いわゆるline edit中のキャンセルもCtrl + Cだけど、それすらできなくなるのは意外だった。
あとは適当なTCP/IP端末でポート 5666 に接続すれば良い。
この構成だと誰も SIGWINCH
を投げないので、コンソールのサイズを変更した場合は手動でリサイズする必要がある。XTermにはこれを行う resize
プログラム https://invisible-island.net/xterm/manpage/resize.html が付属している。
Busyboxにも resize
プログラムがある(未確認)
PuTTYの罠
PuTTYでは、今回のような接続にはtelnetではなくRaw TCP/IPを使う。
ただし何故かPuTTYはRaw接続であってもデフォルトでline disciplineしようとしてしまう。
Terminalの設定から、どちらも "Force off" を選ぶことで正常に制御できる。
... まぁそもそもBusyboxに telnetd
あるんだからそっちを使えば良い話ではあるが。。