リモートサーバのコマンドを公開鍵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 »
この記事へのコメントは終了しました。
コメント