sshrcのコードリーディングをしてみました。

sshrcとは?

sshでリモートログインをするときの初期化処理を行うことができる便利ツール(sshのラッパ関数)です。

sshrcを使うと複数のサーバにリモートログインする場合、リモートログイン先で設定関連のスクリプトを複製しなくても良くなります。また、sshrcでリモートログインしたときに生成される一時ファイルはログアウト後に削除されるため環境を汚しません。

使い方

ホームディレクトリに.sshrcファイルを設置してsshrcコマンドでリモートログインすればOKです。

また.sshrc.dディレクトリを作成してその中にvimrcなどの設定ファイルを置くことができます。.sshrc.dディレクトリはリモートログイン先にコピーが作成されるので、これらの設定ファイルをリモートでも利用できるようになります。

コードリーディング

sshrc_parse関数ではsshrcの引数をパースしてsshrc関数に引数を適切に渡します。

.sshrcは作成必須です。なければエラーになります。

また設定ファイル(.sshrcと.sshrc.dディレクトリ配下のファイル)の総量が64KBを超えるとエラーになります。

tarのcfzオプションは対象のファイルをgzipで圧縮し -hはシンボリックリンクをリンクではなく実体として圧縮するフラグです。-Cは$SSHHOMEでtarの圧縮を行うことを明記するオプションで、これらをwc -cに渡してバイト数を計算しています。

ちなみに$SSHHOMEはローカル側とリモート側各々で設定されます。デフォルトではローカルはホームディレクトリ、リモートはtmpディレクトリになります。

以下はコマンドが定義されていない、かつ、~/.sshrc.d/.hushloginが存在しない場合にwelcome messageを定義しています。

ssh -tで仮想端末を割り当ててコマンドを実行します。

サーバ側にopensslがなかったらエラーで終了します。command -vでコマンドの存在チェックをしています。

テンポラリのディレクトリを作成します

$(whoami)はsshrcを実行したシェルで評価されるので、クライアント側のユーザ名がセットされます。またtrapによってsshrcによるリモートログイン終了時(=プロセス終了時)にテンポラリのディレクトリを削除しています。

次にクライアントのファイルをbase64にしてコマンド文字列経由でリモートに送っています。以下はsshrcの実体をcatを使って送っている例です。

opensslのbase64はPEMコンテキストなため64文字ごとの改行区切りで出力されます。$’string’記法はエスケープシーケンスを有効にする書き方です。ダブルクォートでくくらないと改行が空白に置き換わるのでtrで改行コードに置換します。ダブルクォートを使っていないのは$’string’記法を既に使っていて併用できないからです。

sshrc.bashrcはログインシェルに食わせるrcファイルです。

.sshrcや.sshrc.dディレクトリはtar.gzで固めてbase64にしてリモートに展開しています。

最後に指定したコマンドをsshrc.bashrcの末尾に書き込み、sshrc.bashrcをrcファイルとしてbashを起動します。

CMDARGが設定されている場合はコマンド実行後にexitされます。

参考URL