ssh-copy-id他のキーをコピーするには、そのキーでログインしてください。

ssh-copy-id他のキーをコピーするには、そのキーでログインしてください。

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-isshssh-copy-idssh-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 "$@"

関連情報