はじめに
複数台のロボットの開発を行う際、SSH接続作業が大きな負担になります。「ロボット1に接続、次のターミナルを開いて、ロボット2に接続...」という単調な作業の繰り返しは、開発中、非常に煩わしいものです。楽に開発できないかなぁといろいろツールを探していたところ、ターミナルのレイアウトを保存し、起動時に各ペインで自動的にコマンドを実行できることが可能な「Zellij」があると友達から紹介されました。ZellijはRust製のターミナルマルチプレクサで、画面分割やタブ管理の基本機能に加え、強力なレイアウト定義機能を備えています。そのため、接続コマンドを一度レイアウトファイルに定義するだけで、以降はたった一つのコマンドで全PCへの接続が完了します。ターミナルのbashrc
がペインごとにできるというイメージです。また、Zellijは、コマンドが画面上表示されているためコマンドを覚えずとも雰囲気で操作が可能です。これが非常に便利で、ターミナル作業を効率化できます!皆さんもZellijを使って、煩わしい作業から開放されましょう!
※記事内にあるレイアウトファイルは以下のレポジトリにあります。
https://github.com/koki3141/zellij
Zellijのインストール
-
Ubuntu 22.04(WSL)
curl -L -O https://github.com/zellij-org/zellij/releases/download/v0.42.2/zellij-x86_64-unknown-linux-musl.tar.gz sudo tar zxf zellij-x86_64-unknown-linux-musl.tar.gz -C /usr/local/bin
※最新バージョンは公式リリースページで確認してください。
-
brew install zellij
インストール後、以下のコマンドで起動できます。
zellij
※WSLでの実行結果です。
起動できたら、インストール完了です!
Zellijの基本操作
次に、軽くZellij使い方について解説します。Zellijのユニークな特徴は、画面下部のステータスバーにコマンドリストが表示されることです。これにより、コマンドを完全に覚えなくても直感的に操作できます。
新しいペインを開くの動作例
新しいペインを開く動作を例に、Zellijの操作を説明します。
-
Zellijの起動
Zellijを立ち上げてください。zellij
-
ペインモードに入る
ステータスバーのPANEのctrl+p
を押し、paneを操作するモードに入ります。
ステータスバーが変化し、paneを操作するモードに入ったことがわかります。
このように、下のステータスバーで、どのような状況なのか、どのようなコマンドがあるのか可視化されているので、ドキュメントを見ず、なんとなくで操作できます。
Zellijを終了したい場合は、下のステータスバーの一番右にある「QUIT」のq、つまりctrl-q
でできます。
複数PCへのSSH接続を自動化する
雰囲気、Zellijについて理解したところで、本題の起動時に複数のペインごとにSSH接続する方法について説明していきます。Zellijは、レイアウトにペインやタブを定義することにより、起動時にSSH接続を自動化することが可能になります。これを用いて、複数のペインごとにSSH接続のコマンドを実行するという仕組みを作ります。
レイアウトファイルの基本構造
Zellij起動時にレイアウト定義を読み込ませることで、ターミナルの分割とコマンド実行を自動化できます。基本的なレイアウトファイルは以下のような構造になります
-
panes_command.kdl
layout { // tabとstatusバーの表示設定 default_tab_template { pane size=1 borderless=true { plugin location="zellij:tab-bar" } children pane size=2 borderless=true { plugin location="zellij:status-bar" } } // 複数のpane設定 tab { // pane設定 pane name="pane1" command="bash" { // 実行コマンドの設定 args "-c" "echo pane1 ssh user@ip_address; bash" } pane name="pane2" command="bash" { // 実行コマンドの設定 args "-c" "echo pane2 ssh user@ip_address; bash" } } }
レイアウトファイルを作成し、以下のコマンドを実行してください。
zellij -l panes_command.kdl
縦にペインが並び、上がpane1、下がpane2となっています。また、それぞれのecho
の結果が表示されていることが確認できます。
SSH接続用レイアウトの作成
実際にSSH接続するレイアウトを作成するには、以下のようなファイルを作成します。user@ip_address
を実際の接続情報に置き換えてください。
-
robots_ssh.kdl
layout { // tabとstatusバーの表示設定 default_tab_template { pane size=1 borderless=true { plugin location="zellij:tab-bar" } children pane size=2 borderless=true { plugin location="zellij:status-bar" } } // 複数のpane設定 tab { // pane設定 pane name="pane1" command="bash" { // 実行コマンドの設定 args "-c" "ssh user@ip_address; bash" } pane name="pane2" command="bash" { // 実行コマンドの設定 args "-c" "ssh user@ip_address; bash" } } }
接続を設定したら、このファイルを robots_ssh.kdl
として保存し、以下のコマンドで実行します。
zellij -l robots_ssh.kdl
これにより、2つのペインが作成され、それぞれのペインで自動的にSSH接続コマンドが実行されます。
※SSH接続をパスワードなしで接続したい場合はこちらの記事を参考にしてみてください。
自作レイアウトをデフォルトに設定
レイアウトをデフォルトに設定するには:
-
Zellijの設定ディレクトリに
layouts
フォルダを作成mkdir -p ~/.config/zellij/layouts
-
作成したレイアウトファイルを
default.kdl
として保存cp robots_ssh.kdl ~/.config/zellij/layouts/default.kdl
これにより、zellij
コマンドを実行するだけで自動的に設定したレイアウトが適用されます。
レイアウト設定のバリエーション
ペインとタブのレイアウトの設定に関するいくつかの例を上げています。
横に2つのペインを並べる
-
vertical2.kdl
layout { default_tab_template { pane size=1 borderless=true { plugin location="zellij:tab-bar" } children pane size=2 borderless=true { plugin location="zellij:status-bar" } } tab { pane split_direction="vertical" { pane name="left" pane name="right" } } }
レイアウトファイルを作成し、以下のコマンドを実行してください。
zellij -l vertical2.kdl
縦に2つのペインを並べる
-
horizontal2.kdl
layout { default_tab_template { pane size=1 borderless=true { plugin location="zellij:tab-bar" } children pane size=2 borderless=true { plugin location="zellij:status-bar" } } tab { pane split_direction="horizontal" { pane name="upper" pane name="below" } } }
レイアウトファイルを作成し、以下のコマンドを実行してください。
zellij -l horizontal2.kdl
2つのタブの設定
2つのtabを設定しており、名前をつけています。各タブは横に2つのペインが並ぶようにしています。また、tab1の名前のタブをfocus=true
でメインtabにしています。
-
tab2.kdl
layout { default_tab_template { pane size=1 borderless=true { plugin location="zellij:tab-bar" } children pane size=2 borderless=true { plugin location="zellij:status-bar" } } tab name="tab1" focus=true { pane split_direction="vertical" { pane name="tab1_pane_left" pane name="tab2_pane_right" } } tab name="tab2" { pane split_direction="vertical" { pane name="tab2_pane_left" pane name="tab2_pane_right" } } }
レイアウトファイルを作成し、以下のコマンドを実行してください。
zellij -l tab2.kdl
まとめ
Zellijのレイアウト機能を使うことで、一度設定すれば、複数PCへのSSH接続を自動化することができました。研究室に配属されてから、どうにか複数ロボットへのSSH接続の効率化しようとtmuxを使ったり、terminatorを使ったり、してきましたがやっと使いやすいツールを見つけました。同じような悩みを持っている方々のお役に立ててもらえればと思います!よき開発ライフを!
参考資料
https://zellij.dev/documentation/layouts
https://zenn.dev/5ei74r0/articles/zellij-for-beginners
https://zellij.dev/tutorials/layouts/