久しぶりにssh-copy-id
で鍵を配置しようとしたら、うまくいかなかったので調べてみました。
何が起きたか
ssh-copy-id my-server
を実行したら、
id_rsa.pub
ではなく、全然違う鍵ファイルid_boot2docker.pub
をコピーしようとした。
原因とssh-copy-id
の仕組み
ssh-copy-id
で-i <鍵ファイル>
オプションを指定しない場合、デフォルトでどの鍵ファイルが選択されるかというと、次のような実装によって決定されます(ssh-copy-id
ってシェルスクリプトなんですね)。
most_recent_id="$(cd "$HOME" ; ls -t .ssh/id*.pub 2>/dev/null | grep -v -- '-cert.pub$' | head -n 1)"
DEFAULT_PUB_ID_FILE="${most_recent_id:+$HOME/}$most_recent_id"
つまり、id*.pub
(id*-cert.pub
を除く)にマッチするファイルのうち、タイムスタンプが最新のものが使われるわけですね。
自分の環境では、Docker Machineを入れたときに生成されたid_boot2docker.pub
がid_rsa.pub
よりも新しかったため、そちらが選択されたということだったようです。
明示的に鍵を指定しよう
ssh-copy-id
するときは-i
で明示的に鍵を指定したほうがよいでしょう。
(おまけ)秘密鍵しかない場合
ちなみに秘密鍵しかない場合は、自動的に公開鍵を生成してくれるなどという気の利いたことはしてくれず、エラーになります。
$ ssh-copy-id -i ~/.ssh/test_rsa my-server
/usr/bin/ssh-copy-id: ERROR: failed to open ID file '/Users/username/.ssh/test_rsa.pub': No such file or directory