ssh-copy-id
キーログインを使用して手動で編集せずに他のキーをコピーする方法はありますか~/.ssh/authorized_key
?
マニュアルページにがあるようです-o ssh_option
。 -iオプションを渡そうとしましたが、うまくいかないようです。
ssh-copy-id -o "-i ~/.ssh/working-key" -i ~/.ssh/new-key user@ip
答え1
あなたが探しているオプションは身分証明書しかし、基本的には動作しません。これは、重複エントリの生成を検出するために公開鍵がコピーされ、秘密鍵が引数として認証されることを期待するssh-copy-id
シェルスクリプトです。内部パラメータでオーバーライドすると、キーはパスワードなしでリンクされて最終結果が得られるため、キーが認証されたと考えられます。-i
-f
-o IdentityFile
-i
ssh
ssh-copy-id
ssh-copy-id
$ ssh-copy-id -o 'IdentityFile=.ssh/working-key' -i .ssh/new-key.pub user@ip
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: ".ssh/new-key.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
Enter passphrase for key '.ssh/working-key':
/usr/bin/ssh-copy-id: WARNING: All keys were skipped because they already exist on the remote system.
(if you think this is a mistake, you may want to use -f option)
これを追加すると、-f
スキャンは失敗しないため機能します(注:秘密鍵の可用性は必要ありません)。コマンドを2回実行すると、もはや冪等性はありません。リモートで再実行されますauthorized_keys
。
ssh-agent
これは使用時にうまく機能するため、問題とは見なされません。working-key
プロキシにロードされている場合(ただしそうでない場合new-key
)、ssh-copy-id -i .ssh/new-key.pub user@ip
期待どおりに機能します。再実行すると重複が検出されます。
簡単に言うと:
- を使用し
ssh-agent
てロードする必要がありますworking-key
。 - それ以外の場合は挿入できますが、
-f -o IdentifyFile=~/.ssh/working-key
重複項目は検出されません。 - それ以外の場合は、必要に応じてここに実行中のラッパーがあります
ssh-agent
。
以下は、これを行うラッパーです。すでに実行中のラッパーが見つからない場合は、単一のジョブに対して一時的にssh-agent
ラッパーを作成します。存在する場合に使用されます(追加されたキーは追加されたままであるため、簡単に保ちたい)。これは追加オプションを非常に簡単に扱います。追加されたオプション(-I
)が最初に来る必要があり(存在する場合)、個々の引数が続く必要があり、自由に改善できます(おそらくある種のケースループを使用して)。また、使用可能なエージェントに既にロードされているキーのパスワードを要求しない追加のアクションを実行しました(次を使用)。このQ&A)。
wrapper-ssh-copy-id.sh
:
#!/bin/sh
if [ x"$1" = x-I ]; then
if [ $# -lt 2 ]; then
exit 1
fi
privkeyfile="$2"
shift 2
if [ -z "$SSH_AUTH_SOCK" ]; then
trap 'eval $(ssh-agent -k)' EXIT
eval $(ssh-agent)
fi
fingerprint=$(ssh-keygen -lf "$privkeyfile" | awk '{print $2}')
if [ -z "$fingerprint" ]; then
exit 1
fi
ssh-add -l | grep -F -q "$fingerprint" || ssh-add "$privkeyfile"
fi
ssh-copy-id "$@"