« vimのconfigureがで「ncurses library is not usable」で失敗 | トップページ | ソースコード表示に適したフォントAdobe Source Code Pro »

2012年9月25日

リモートサーバのコマンドを公開鍵SSHで自動実行

サーバAからサーバBにSSHで接続してコマンドを実行するという自動化スクリプトで、パスワード入力を省くために公開鍵・秘密鍵のペアによるSSH接続を使った。

まずサーバBにログインして鍵ペアを生成する。パスフレーズを設定すると、ssh-addで鍵を登録するときに入力を求められる。今回は自動化スクリプトなので、パスフレーズを設定せず、空Enterする。これで.sshディレクトリの下に秘密鍵id_rsaと公開鍵id_rsa.pubが作られる。

srv-b:~# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/XXXX/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /XXXX/.ssh/id_rsa.
Your public key has been saved in /XXXX/.ssh/id_rsa.pub.
The key fingerprint is:
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx xxxx@srv-b


公開鍵を.ssh/authorized_keysに書き込む。このファイルのパーミッションは600でなければならない。

srv-b:~/.ssh# cat id_rsa.pub >> ~/.ssh/authorized_keys
srv-b:~/.ssh# chmod 600 authorized_keys


秘密鍵をサーバAにコピーし、適当な名前にリネームする。

srv-a:~# mv id_rsa id_rsa_srv-b

鍵ペアによるSSH接続は、ssh-agentを起動し、ssh-addで鍵を登録する。対話セッションであれば、ターミナルからeval `ssh-agent`で起動する。これにより環境変数SSH_AGENT_PIDなどが設定され、後続のコマンドで利用できるようになる。終了コマンドはssh-agent -kである。

今回はバックグラウンドで実行する自動化スクリプトなので、必要なときだけssh-agentを起動して、その都度終了することにした。さらに、ssh-agentの引数に、リモート側(サーバB)で実行するコマンド群をシェルスクリプトで与える。シェルスクリプトはフルパスで指定しなければならない。

親のスクリプト

[...]
ssh-agent $dir/ssh_cmd.sh $node
if [ $? -ne 0 ]; then
    echo "Cannot connect to $node"
    exit 1
fi
[...]

ssh_cmd.sh

[...]
ssh-add id_rsa_$node
ssh $node 'リモートで実行するコマンド'
[...]

こうしておけば、リモート側でコマンドが終了すると、セッションが切れるとともにssh-agentも終了する。

|

« vimのconfigureがで「ncurses library is not usable」で失敗 | トップページ | ソースコード表示に適したフォントAdobe Source Code Pro »

コメント

この記事へのコメントは終了しました。