파일 이름으로 ssh-agent에서 ID를 선택하십시오.


9

문제 : 20-30 개의 ssh-agent신원이 있습니다. Too many failed authenticationsSSH는 일반적으로 20 개의 다른 키로 로그인을 시도하지 않으므로 대부분의 서버는로 인증을 거부합니다 .

현재 SSH를 사용하여 하나의 키 파일 만 시도 할 수 있도록 IdentityFileand IdentitiesOnly지시문을 사용하여 모든 호스트의 ID 파일을 수동으로 지정하고 있습니다.

불행히도, 원래 키를 더 이상 사용할 수 없게 되 자마자 작동이 중지됩니다. ssh-add -l모든 키 파일의 올바른 경로를 표시하고의 경로와 일치 .ssh/config하지만 작동하지 않습니다. 분명히 SSH는 파일 이름이 아닌 공개 키 서명으로 들여 쓰기를 선택합니다. 즉, SSH가 공개 키를 추출 할 수 있도록 원본 파일을 사용할 수 있어야합니다.

이것에는 두 가지 문제가 있습니다 :

  • 키를 누른 상태에서 플래시 드라이브를 분리하자마자 작동이 중지됩니다.
  • 원격 호스트에서 키 파일을 사용할 수 없으므로 에이전트 전달을 쓸모 ​​없게 만듭니다.

물론 신원 파일에서 공개 키를 추출하여 내 컴퓨터와 일반적으로 로그인하는 모든 원격 컴퓨터에 저장할 수 있습니다. 그러나 이것은 바람직한 해결책처럼 보이지 않습니다.

필요한 것은 파일 이름으로 ssh-agent에서 아이디를 선택할 수 있기 때문에 SSH를 사용 하는 원격 호스트에서도을 사용 .ssh/config하거나 전달 하여 올바른 키를 쉽게 선택할 수 있습니다 -i /path/to/original/key. 전체 경로를 지정할 필요가 없도록 키를 "닉네임"할 수 있으면 더 좋습니다.


1
왜 많은 ssh ID가 필요합니까? 하나의 개인 키가 손상되어 모든 계정에 액세스하지 못하게하려면 왜 모든 플래시 키를 단일 플래시 드라이브에 보관해야합니까? 여러 ssh ID 관리와 관련된 문제에 대해 처음 듣지는 않지만 왜 필요한지 물어볼 기회는 없었습니다.
Dmitri Chubarov 2016 년

그들 모두가 하나의 플래시 드라이브에 있다고 말한 적이 없습니다.
leoluk 2016 년

3
@DmitriChubarov 여러 ssh ID에 사용할 수있는 응용 프로그램 중 하나는 authorized_keys사용 된 키에 따라 직접 셸 액세스를 허용하지 않고 다른 명령을 실행 하는 파일입니다.
Tobias Kienzler

답변:


8

파일 이름으로 신원을 요청할 수있는 방법이없는 것처럼 내 자신의 질문에 대답해야한다고 생각합니다.

.ssh/fingerprints에이전트가 보유한 모든 키 에 대해 공개 키 파일을 생성하는 빠르고 더러운 Python 스크립트를 작성했습니다 . 그런 다음 비밀 키가없는이 파일을 사용 IdentityFile하여 SSH를 사용 하면 SSH 에이전트에서 올바른 ID를 선택할 수 있습니다. 완벽하게 작동하며 원하는 개인 키 수만큼 에이전트를 사용할 수 있습니다.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""Dumps all public keys held by ssh-agent and stores them in ~/.ssh/fingerprints/, so that
they can be identified using the IdentityFile directive.

"""

import sys, os
import stat
import re
import envoy

RE_MATCH_FILENAME = re.compile(r'([^\\/:*?"<>|\r\n]+)\.\w{2,}$', re.IGNORECASE)

if os.getuid() == 0:
    USERNAME = os.environ['SUDO_USER']
else:
    USERNAME = os.environ['USER']

def error(message):
    print "Error:", message
    sys.exit(1)

def main():
    keylist = envoy.run('ssh-add -L').std_out.strip('\n').split('\n')

    if len(keylist) < 1:
        error("SSH-Agent holds no indentities")

    for key in keylist:
        crypto, ckey, name = key.split(' ')
        filename = os.path.join(os.environ['HOME'], '.ssh/fingerprints',
                  RE_MATCH_FILENAME.search(name).group(1)+'.pub')

        with open(filename, 'w') as f:
            print "Writing %s ..." % filename
            f.write(key)

        envoy.run('chmod 600 %s' % filename)
        envoy.run('chown %s %s' % (USERNAME, filename))


if __name__ == '__main__':
    main()

잘 했어, 빨리해볼 게요
Tobias Kienzler

3

운영

ssh-add -L | gawk ' { print $2 > $3 ".pub" } '

원격 컴퓨터에서 모든 공개 키 파일을 자동으로 생성합니다 (공개 키의 .ssh/config이름이 지정 privateKeyFileName.pub되어 있고 부적합한 경로가 없다고 가정). 사건을 부르 chown $USER .ssh/*십시오 sudo.


1

허용 된 솔루션에서 가져 와서 초기 서버에 액세스하는 데 사용 된 ID를 재사용한다고 가정하면 다음과 같습니다.

Host github.com
    IdentitiesOnly yes
    IdentityFile ~/.ssh/authorized_keys

충분하다.


이것은 나를 위해 작동하지 않습니다. 신원 파일에 공개 키가 하나만있는 경우 작동하지만 여러 개인 키는 작동하지 않습니다.
ygrek
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.