はじめに
SSHのセキュリティ・利便性を飛躍的に高める公開鍵認証ですが、鍵を転送(特に2台目以降)するのに、ナイーブな方法では、サーバ側のシェルやSFTPのシェルにコマンドを手打ちしないといけないため、少し面倒です。ここでは、その転送を1行で済ませてしまいます。まず、下準備をします。
公開鍵の作成
cd ~/.ssh
ssh-keygen -f KEY_NAME
# (公開鍵にパスワード掛けたくない場合はエンター2回)
KEY_NAME
は秘密鍵のファイル名ですが、通常は省略してid_rsa
とします。(省略した場合はエンター3回)公開鍵のファイル名はKEY_NAME.pub
となります。
プロファイル追加
Host SERVER_ALIAS
HostName SERVER_ADDRESS
User LOGIN_USER
Port PORT_NUMBER
Identityfile ~/.ssh/KEY_NAME
SERVER_ALIAS
はサーバの短縮名、SERVER_ADDRESS
はサーバのアドレスまたはドメイン名、LOGIN_USER
はサーバにログインするユーザ名、PORT_NUMBER
はサーバのポート番号(22番の場合は省略可)です。
鍵転送コマンド
ここが本題です。まず、ssh-copy-id
というツールがあるかを確かめます。(基本的にあります)
ssh-copy-idがある場合
次のコマンドを入力し、サーバのパスワードを入れれば終了です。サーバのシェルがtcshなどC Shell系の場合は使えないかもしれません。
ssh-copy-id SERVER_ALIAS
ssh-copy-idが(使え)ない場合(おそらくレアケース)
次のコマンドを入力すると、サーバ側の公開鍵(転送する自ユーザーの公開鍵ではありません)を保存するか聞かれるので保存し、サーバのパスワードを入力します。これで転送は終了です。
cat ~/.ssh/id_rsa.pub | ssh SERVER_ALIAS 'umask 77 && mkdir -p .ssh && cat >> .ssh/authorized_keys'
# ↓2台目以降専用簡易コマンド↓
cat ~/.ssh/id_rsa.pub | ssh SERVER_ALIAS 'cat >> .ssh/authorized_keys'
SSHサーバのシェルがC Shell・tcshで万が一上のコマンドがダメな場合は次のようにします。
cat ~/.ssh/id_rsa.pub | ssh SERVER_ALIAS 'umask 77 && mkdir -p .ssh && cat >>! .ssh/authorized_keys'
# ↓2台目以降専用簡易コマンド↓
cat ~/.ssh/id_rsa.pub | ssh SERVER_ALIAS 'cat >>! .ssh/authorized_keys'
確認
サーバに再びSSHでログインします。
ssh SERVER_ALIAS
パスワードを聞かれずにログインできれば成功です。
SFTPではダメなのか
1台目ならmkdir
・chmod
・cd
・put
の合わせ技でいけますが、2台目以降だと 鍵を手元にダウンロード→端末を別で開いて手元で追記→サーバに戻す という作業が必要で面倒です。しかし、今回のコマンドだと、1台目でも2台目以降でもワンライナーでいけます。