最近は、Goで自作してる sshクライアントコマンド(lssh) の機能追加を主にやってる(で、こっちあまり更新してない(´・ω・`))。

実はちょっと前、下のようなツールを見かけて、それと同じようなことが自作のsshクライアントやりたいと思って機能追加していたのだけど、それがやっとできるようになった。 これが何なのかというと、sshで複数のノードにパラレル接続して、そのままプロンプト上からインタラクティブにコマンドを流せるというツールで、便利そうだしすごくかっこよさげなのだ。

An interactive parallel ssh client featuring autocomplete and asynchronous execution. - six-ddc/hss

ただ、sshの接続用のコンフィグを別に作らないとダメそうだし、普段はこの自作クライアントを使って接続してるから別にコンフィグ作るのもめんどくさい(~/.ssh/config はlsshから直接読めるから、そっちだったら楽だった)。 そんな理由で、自分のlsshにも同様の機能を追加してみることにした。(家のサーバのsshの名前解決外してなかったので、接続時ちょっと遅いのはサーバの問題)

ただ移植っぽいことをするだけだと芸がないので、以下ができるようにしてみた。

  • 各ノードで実行しているコマンドの標準入力へキー入力をパラレルで送信(なので、複数台で同時にpasswdとかもできる)
  • iPythonみたいに、過去の実行結果を保持して後から閲覧可能にする

一応、Goで全部書かれてるからWindowsでも動くはず…(試してないけど)。

一応コマンドのパラレル実行機能は元々実装してあったので、プロンプトを追加して上の処理が行えるようにすることで対応はできた。 プロンプトは自作するのつらかったので、go-promptを使わせてもらうことにした。

まだ補完まわりがうまくできてないので、そのあたりをうまいこと処理できるようにしたいなぁというところ。 補完結果自体は(リモート先がbashを使ってること前提で)compgenを使えばコマンドもファイルPATHも取ってこれると思うんだけど、多分構文解析とかを絡めないといけないと思うので、ちょっと考える必要がありそう。

普段は↓のように普通に1台づつターミナル接続してて、このとき自作のbashrcをそのまま直接読み込ませられるから大体同じ環境で操作できるのだけど、複数台で同時作業する際に同じようなことをするにはちょっと考えないとだめかもなぁ…(´・ω・`)。

ターミナルの色を変更するのは簡単なんだけど、ローカルのbashrcをどうやってファイル転送させずに読み込ませた状態でパラレル接続するのかが課題になりそう。