y_uti のブログ

統計、機械学習、自然言語処理などに興味を持つエンジニアの技術ブログです

アカウントを共有するときの SSH の設定

そもそもアカウントを共有するのが良くないことだというのは重々承知。とはいえ、仕事ではそういう環境で作業をすることもよくあります。お客様のサーバで作業する場合など、社名でアカウントを一つ作成して、複数人の作業担当者で共有するという運用です。

こんなとき、アカウントは共有していても、ログイン時の設定 (つまり .bash_profile) は担当者ごとに個別のファイルを読み込みたいと思うことがあります。たとえば history ファイルを分けたいとか。そこで、SSH の鍵ごとに自分用の設定ファイルを読み込ませる方法で、これを実現してみました。

まずは、リモートサーバ側の authorized_keys ファイルを編集します。ログインしたときに、自分用の .ssh_login_hook なるスクリプトを実行するようにします。

~/.ssh/authorized_keys

command="exec /bin/bash /home/mycompany/y_uti/.ssh_login_hook" ssh-rsa AAAA...== y_uti@myclient.mycompany.co.jp

.ssh_login_hook には以下の内容を書いておきます。ここで --rcfile を指定して bash を起動することで、自分用の設定でログインできることになります。$SSH_ORIGINAL_COMMAND という変数には、ssh で実行されるコマンドが格納されています。何かコマンドが指定されているときには、余計なことをせずにコマンドをそのまま実行するようにしておきます。このようにしておかないと、scp が通らなくなるといった問題がありました。

~/y_uti/.ssh_login_hook

#!/bin/bash
RC_FILE=/home/mycompany/y_uti/.bash_profile
if [ "$SSH_ORIGINAL_COMMAND" == "" ]; then
  exec $SHELL --rcfile $RC_FILE
else
  exec $SHELL -c "$SSH_ORIGINAL_COMMAND"
fi

あとは ~/y_uti/.bash_profile に思いのままに設定を書き殴ればよいです。

たとえば、ヒストリファイルを自分専用にするとか。

export HISTFILE=${HOME}/y_uti/.bash_history
history -c
history -r

また、DMZ のマシンを経由してもう一段 ssh が必要なんていうのも、よくある話です。そんなときには、自分用の SSH 設定ファイルを使うようにエイリアスしておくとか。ところで、この -F オプション相当の環境変数ってないのでしょうか。調べても見つけられませんでした。

alias ssh="ssh -F ${HOME}/y_uti/.ssh/config"
alias scp="scp -F ${HOME}/y_uti/.ssh/config"

config ファイルで自分用の鍵を指定しておけば、内側のサーバでも同じことの繰り返しで自分用の設定を使えます。

~/y_uti/.ssh/config

Host secretserver
  Hostname      secretserver.customer.co.jp
  Port          22
  User          mycompany
  IdentityFile  /home/mycompany/y_uti/.ssh/id_rsa