ssh-agent가 필요할 때 자동으로 키를 추가하는 방법은 무엇입니까?


51

ssh-agent (최대 수명 옵션)를 실행하고 싶지만 시작할 때 키를 추가하지 않고 필요에 따라 키를 추가합니다.

처음으로 일부 서버에 로그인 할 때 암호를 요구해야합니다. 다음에 (1 시간 이상 기다리지 않는 한) 깨끗하게 연결해야합니다.

ssh server1
Enter passphrase for key '/home/vi/.ssh/id_dsa':
server1> ...

ssh server2
server2> # no passphrase this time

# wait for lifetime

ssh server2
Enter passphrase for key '/home/vi/.ssh/id_dsa':

매번 'ssh-add'를 실행하는 것에 대해 수동으로 기억하고 싶지 않습니다. (예 : ssh 및 "Oh, 기억하지 못 했으므로 다시 입력해야 함"에 대한 암호 만 입력했습니다).

사용자가 암호를 제공 한 경우 ssh를 에이전트에 자동으로 추가하도록 ssh를 구성하는 방법은 무엇입니까?


답변:


58

ssh는 에이전트를 처음 사용할 때 버전 7.2부터 키를 추가 할 수 있도록 지원합니다. 다음을 넣어서 해당 기능을 활성화 할 수 있습니다 ~/.ssh/config.

AddKeysToAgent yes

이것은 git과 같은 파생 도구를 사용할 때도 작동합니다.

로부터 7.2 변경 내역 :

  • ssh (1) : AddKeysToAgent 클라이언트 옵션을 추가하여 'yes', 'no', 'ask'또는 'confirm'으로 설정하고 기본값은 'no'로 설정하십시오. 활성화되면 인증 중에 사용되는 개인 키가 ssh-agent가 실행중인 경우 ssh-agent에 추가됩니다 ( '확인'으로 설정된 경우 확인 사용).

이를 위해서는 ssh-agent가 실행 중이어야합니다. 좋은 시작 방법은 stackoverflow.com/a/24347344/4573065 + 주석을 참조하십시오 (한 번만).
ST-DDT

18

당신은 속임수와 같은 것을 넣을 수있는 alias ssh='ssh-add -l || ssh-add && ssh'.bashrc/ .profile. 이 첫 번째 실행 ssh-add -l은 0 (에이전트에 키가 있음), 1 (키 없음) 또는 2 (에이전트 실행 중 없음)를 반환 할 수 있습니다. 0을 반환 ssh하면 실행됩니다. 1이면 ssh-add실행 후 ssh; 2이면 ssh-add실패하고 ssh실행되지 않습니다. 교체 &&와 함께 ;당신이 원하는 경우 ssh에는 에이전트 실행이 없습니다 경우에도 실행합니다.


3
추가 ssh 명령이 키를 사용하지 않는 경우에도 키에 암호를 요청합니다.
Vi.

@Vi. 키보드 대화 형을 사용하는 서버에 연결하지 않는 한, 명령을 사용하지 않는 명령은 거의 없습니다. 키는 나중에 필요할 때마다 에이전트에 있습니다. 또한 가명은 (또는 불행히도) ssh의 백엔드 사용을 변경하지 않습니다 (git 또는 rsync 사용).
Jessidhia

2
(ssh 클라이언트 용 auto-call-ssh-add 패치 작성에 대한 생각)
Vi.

이 답변을 기반으로 특정 호스트에 대한 별칭을 만들 수 있습니다 alias ssh-hostname='(ssh-add -l | grep hostname > /dev/null) || ssh-add ~/.ssh/id_rsa_hostname && ssh -p 12345 username@hostname'. 모든 ssh 키에 대해 루프에 넣고 별칭을 생성 할 수도 있습니다. 더러운 해킹이지만 작동합니다.
dset0x

5

ssh가 auto-call-ssh-add를 지원할 때까지 .bashrcKovensky 제안에 따라 이것을 내에 추가했습니다 .

ssh-add -l >/dev/null || alias ssh='ssh-add -l >/dev/null || ssh-add && unalias ssh; ssh'

별명은 ID가 추가되지 않은 경우에만 작성되며 별명은 한 번 실행되면 자체 삭제됩니다.

이렇게하면 아이디가 추가 된 후 일반 ssh 명령이 사용됩니다.


ssh-add 때문에 시간 초과가 구성되어 있기 때문에 내 경우에는 작동하지 않지만 아이디어는 충분합니다.
Vi.

@Vi. 타임 아웃이 이것에 어떤 영향을 줍니까? 그것은 나를 위해 잘 작동하는 것 같습니다.
lanrat

1
@lanrat, ssh-agent에 키가 있는지 확인하고 존재 여부에 따라 별칭을 구성합니다. 그러나 시간 초과 ( ssh-add -t ...) 로 인해 ssh-agent에 추가 된 키가 갑자기 사라질 수 있지만 키가 여전히 메모리에있는 동안 별칭이 유지됩니다.
Vi.

1

다음 셸 기능을 사용하고 있습니다.

ssh() {
    local possible_keys=($(/usr/bin/env ssh -G $@ | grep '^identityfile' \
                           | cut -d " " -f 2- | sed -e "s|^~|$HOME|"))
    for k in $possible_keys; do
        if [[ -f $k ]]; then
            local fingerprint=$(ssh-keygen -lf $k)
            ssh-add -l | grep -q "$fingerprint" || ssh-add $k
        fi
    done
    /usr/bin/env ssh $@
    return $?
}

먼저 연결하려는 호스트의 구성을 확인한 다음 해당 호스트의 가능한 키가 아직 추가되지 않은 경우 ssh-agent에 추가하고 마지막으로 호스트에 연결합니다. 나는 그것이 향상 될 수 있다고 확신하므로 피드백을받을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.