この前初めて知ったのですが、本読んでたら、こんなもんあるのかと思ったので、紹介してみる。
そのコマンド名は「ssh-copy-id」です。周知の事実だったらごめんなさい。あと、セキュリティの話しは末尾に。
ssh-copy-idって何?
sshで公開鍵認証とかしてると、接続先のサーバの「~/.ssh」以下に「authorized_keys」作らないといけないわけですが、どうも作成するのが面倒。
転送なり、ファイル作りなり、まぁ色々方法はあるんでしょうけど、いずれにしてもめんどい。権限周りもあるし。まぁ、セキュリティとして大事なとこなので、わがまま言っちゃいけないんですが、楽はしたい。
そんな悩みを軽減してくれるのが、「ssh-copy-id」です。簡単に言えば、ローカルにある公開鍵をリモートサーバにauthorized_keysとしてインストールしてくれるというもの。
manには以下のように書かれています。
ssh-copy-id - install your identity.pub in a remote machine's authorized_keys
identity.pubをリモートマシンのauthorized_keysに設定くれるよーと。
使い方は以下のような感じ
$ ssh-copy-id -i ~/.ssh/id_rsa.pub masuda@192.168.1.1
これだけで192.168.1.1というリモートの「/home/masuda/.ssh/authorized_keys」にローカルの公開鍵が設定されます。便利ですな。権限もownerにrwのみになっております。
ということで、簡単にシェルスクリプト作ってみる
IPのリストを作って、そのリストにあるサーバには同じ鍵を設置するような場合。
まず、seqなりを使って、IPの末尾をファイルに出力。
$ seq 115 125 > servers.list
vimとかemacsで連番できるならそれでもよいかもしれない。
んで、vimとかでservers.listを開いて、
%s/^/192.168.1./gc
とやって、行頭に「192.168.1.」を全行付与する。コマンドでもできる気がする…
joinとかでやるのは大変か…
そしたら、あとはサーバの分だけシェルスクリプトでループさせるだけ。
#/bin/sh USER='masuda' SERVERS_LIST='/home/masuda/.ssh/servers.list' SSHKEY='/home/k_masuda/.ssh/id_rsa.pub' for IPADDRESS in `cat ${SERVERS_LIST}` do ssh-copy-id -i ${SSHKEY} ${USER}@${IPADDRESS} ELEVEL=$? if [ $ELEVEL -ne 0 ]; then echo -e "\033[40m\033[1;31mFailed: ${IPADDRESS} \033[0m" else echo "Success: ${IPADDRESS}" fi echo '----------------------------------------' done
コマンドに失敗した場合は、色をつけたりしたら、わかりやすいでしょう(この例は、失敗すると文字色が赤になる)。
こんな感じで、特定のサーバ群にauthorized\_keysを作ることができるという。
(ファイルの存在の有無確認してないじゃない…)
終わりに(セキュリティは…)
VMのイメージコピーとかクラウドのコピー機能使っていたら、出番少ないかもだけど、新しいVM作った時とかさくっとできると言えばできる。ただ、これだけだとセキュリティがどうしても気になるので、コマンドの制限とかやったほうがよいと思うので、その人のポリシー次第ですな。
ほんとはこういう記事とかも読んで、リモートホストに作成した、リモートのファイル編集しよ、ssh経由でできるようにコマンド覚えよとかでもよいのかもだけど、こういうコマンドもあるよ!ということで。
なので、ご利用は計画的にということで、お願いします!
P.S.
台数増えると、微妙に時間もかかるし、並列できないのは色々もったいないし、やっぱpushよりpullのほうがよいなぁと思う今日この頃…