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검사가 실패하지 않으므로 작동하게 됩니다(참고: 개인 키의 가용성이 필요하지 않음). 명령을 두 번 실행하면 더 이상 멱등성이 없습니다. 원격에서 다시 실행됩니다 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 "$@"

관련 정보