한 클라이언트에서 여러 SSH 개인 키를 사용하는 가장 좋은 방법


870

여러 개인 키를 사용하여 다른 서버 또는 동일한 서버의 다른 부분에 연결하고 싶습니다 (내 서버 사용은 서버의 시스템 관리, Git 관리 및 일반적인 Git 사용입니다). 나는 단순히 id_rsa파일에 키를 쌓아 두는 것을 시도했다 .

분명히이 작업을 수행하는 간단한 방법은 명령을 사용하는 것입니다

ssh -i <key location> login@server.example.com 

꽤 번거 롭습니다.

이 작업을 좀 더 쉽게 수행하는 방법에 대한 제안 사항이 있습니까?


1
다양한 구성과 장점 / 결점에 대해 자세히 다루는 이 기사 를 썼습니다 .
Raffi

답변:


1234

내에서 .ssh/config:

Host myshortname realname.example.com
    HostName realname.example.com
    IdentityFile ~/.ssh/realname_rsa # private key for realname
    User remoteusername

Host myother realname2.example.org
    HostName realname2.example.org
    IdentityFile ~/.ssh/realname2_rsa  # different private key for realname2
    User remoteusername

등등.


24
감사합니다 Randal! .ssh / config를 파헤쳐 서 이것을 찾았습니다. github.com/guides/multiple-github-accounts 올바른 방향으로 나를 가리 켰 습니다.
Justin

6
이것은 stackoverflow.com/a/3828682/169153 외에도 큰 도움이되었습니다 . 퍼티 키를 사용하려면 다음 문서를 참조하십시오 : blog.padraigkitterick.com/2007/09/16/…
Urda

2
이 게시물이 매우 유용하다는 것을 알았습니다. 구성 파일을 만들 때 한 가지 오류는 구성 파일을 만들기 위해 "touch"명령을 실행하는 대신 .ssh 폴더에 .txt 파일을 넣는 것입니다.
M_x_r

53
IdentityFile동일한에 대해 여러 항목을 지정할 수도 있으며 Host, 연결시 순서대로 시도됩니다.
sschuberth

12
IdentitiesOnly yes~ / .ssh / id_rsa 또는 다른 ID를 방지하는 데 사용하십시오 . (이 편집 원래이었다)
user3338098

369

연결시 ssh에게 여러 키를 연속해서 시도하도록 지시 할 수 있습니다. 방법은 다음과 같습니다.

$ cat ~/.ssh/config
IdentityFile ~/.ssh/id_rsa
IdentityFile ~/.ssh/id_rsa_old
IdentityFile ~/.ssh/id_ed25519
# ... and so on

$ ssh server.example.com -v
....
debug1: Next authentication method: publickey
debug1: Trying private key: /home/example/.ssh/id_rsa
debug1: read PEM private key done: type RSA
debug1: Authentications that can continue: publickey
debug1: Trying private key: /home/example/.ssh/id_rsa_old
debug1: read PEM private key done: type RSA
....
[server ~]$

이런 식으로 어떤 키가 어떤 서버에서 작동하는지 지정할 필요가 없습니다. 첫 번째 작업 키만 사용합니다.

또한 주어진 서버가 키를 수락하려는 경우에만 암호를 입력하십시오. 위에서 볼 수 있듯이 ssh는 암호가 .ssh/id_rsa있더라도 암호를 요구하지 않았습니다 .

분명히 다른 답변과 마찬가지로 서버 당 구성보다 우수하지는 않지만 적어도 연결하는 모든 서버에 대해 구성을 추가 할 필요는 없습니다!


12
이것은 질문에 대한 환상적인 해결책이지만, 요구자가 의도 한 요구를 충족시키지 못했습니다. 저에게는 이것이 올바른 솔루션이었으며 "한 클라이언트에서 여러 SSH 개인 키를 사용하는 가장 좋은 방법"에 대한 요구를 완벽하게 충족시킵니다.
웨이드

2
이것은 설정 파일의 호스트 선언에서 작동하지 않는 것 같습니다
Maksim Luzik

29
두 개의 github deploy 키가있는 것처럼 목록에서 첫 번째 키가 유효하고 작동하지만 github은 저장소가 일치하지 않는다고 불평하는 것처럼 git에서는 제대로 작동하지 않습니다.
Adam Reis

이것은보다 역동적 인 접근 방식이며 특정 상황에서 효과적입니다. 감사합니다
gbolo

7
해당 서버에 fail2ban과 같은 것이 있는지 확인하십시오. 다른 키로 인해 실패한 시도로 인해 감옥에 갇힐 수도 있습니다.
Piccolo

254

Randal Schwartz대답은 거의 모든 도움이되었습니다. 서버에 다른 사용자 이름이 있으므로 사용자 키워드를 파일 에 추가해야 합니다.

Host           friendly-name
HostName       long.and.cumbersome.server.name
IdentityFile   ~/.ssh/private_ssh_file
User           username-on-remote-machine

이제 이름을 사용하여 연결할 수 있습니다.

ssh friendly-name

OpenSSH 매뉴얼 페이지 에서 더 많은 키워드를 찾을 수 있습니다 . 참고 : 나열된 키워드 중 일부는 이미 / etc / ssh / ssh_config 파일에있을 수 있습니다.


내가 사용자를 착각하지 않으면 일반적으로 user @ host와 연결할 때 URL에 직접 지정하십시오
a1an

3
'포트'키워드도 선호합니다. 또 다른 흥미로운 키워드는 'StrictHostKeyChecking'입니다.
Ethan

120

이전 답변에서는 여러 ssh 키를 관리하기 위해 구성 파일을 만드는 방법을 올바르게 설명했습니다. 설명해야 할 중요한 점 은 리포지토리를 복제하는 동안 호스트 이름을 별칭 이름으로 바꾸는 것입니다 .

회사의 GitHub 계정 사용자 이름이 abc1234 라고 가정합니다 . 개인 GitHub 계정의 사용자 이름이 jack1234 라고 가정하십시오.

그리고 두 개의 RSA 키, 즉 id_rsa_companyid_rsa_personal 을 생성했다고 가정합니다 . 따라서 구성 파일은 다음과 같습니다.

# Company account
Host company
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_company

# Personal account
Host personal
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_personal

이제 회사의 GitHub 계정에서 저장소 (데모라고 함) 를 복제 할 때 저장소 URL은 다음과 같습니다.

Repo URL: git@github.com:abc1234/demo.git

이제을 수행하는 동안 git clone위의 저장소 URL을 다음과 같이 수정해야합니다.

git@company:abc1234/demo.git

구성 파일에 정의 된대로 github.com이 이제 "company"라는 별칭으로 대체되는 방법에 주목하십시오.

마찬가지로 구성 파일에 제공된 별명에 따라 개인 계정에서 저장소의 복제 URL을 수정해야합니다.


10
이 답변을 두 번 이상 공표 할 수 있기를 바랍니다 ...이 문제에 접근하는 올바른 방법이며 다른 옵션보다 안전하고 빠릅니다. 확장
성도 향상됨 (

4
더 이상 시간을 낭비하지 마십시오. 이것이 바로 답입니다. 많은 감사합니다.
Luis Milanese

2
나는이 답변을 일찍 발견했으면 좋겠다 ...하지만 결코 늦지 않는 것이 낫다. 많은 감사합니다!
Hildy

2
좋은 설명! 나를 위해 완벽하게 작동합니다. 별칭을 사용하여 리포지토리를 복제하지 않은 경우 종종 원격 원점 URL을 편집 할 수 있습니다.
tkahn

1
설정 파일은 (chmod 600)이어야하므로주의를 기울여야합니다
Christiano Matos

105
foo:~$ssh-add ~/.ssh/xxx_id_rsa

다음을 추가하기 전에 테스트해야합니다.

ssh -i ~/.ssh/xxx_id_rsa username@example.com

오류에 문제가있는 경우 때때로 파일의 보안을 변경하면 도움이됩니다.

chmod 0600 ~/.ssh/xxx_id_rsa

4
이것은 내 의견으로는 가장 간결하고 우아한 솔루션입니다. 매력처럼 일했다!
artur

@Bobo bashrc 또는 bash_profile에 넣을 수 있습니까 (또는 mac과 동등한 것은 무엇입니까)?
T0xicCode

6
chmod 0600의 경우 +
1-

나를 위해 매력처럼 일했습니다 (약 0600 파마를 잊지 마십시오).
Dmytro Uhnichenko

1
Mac의 우분투에서 왔는데 이것이 정확히 내가 필요한 것입니다.
hariom

42
  1. SSH 키를 생성하십시오.

    $ ssh-keygen -t rsa -C <email1@example.com>
    
  2. 생성 another SSH key:

    $ ssh-keygen -t rsa -f ~/.ssh/accountB -C <email2@example.com>
    

    이제 두 개의 공개 키 ( id_rsa.pub , accountB.pub )가 ~/.ssh/디렉토리 에 있어야합니다 .

    $ ls -l ~/.ssh     # see the files of '~/.ssh/' directory 
    
  3. ~/.ssh/config다음 내용으로 구성 파일 을 작성하십시오 .

    $ nano ~/.ssh/config
    
    Host bitbucket.org  
        User git  
        Hostname bitbucket.org
        PreferredAuthentications publickey  
        IdentityFile ~/.ssh/id_rsa  
    
    Host bitbucket-accountB  
        User git  
        Hostname bitbucket.org  
        PreferredAuthentications publickey  
        IdentitiesOnly yes  
        IdentityFile ~/.ssh/accountB  
    
  4. default계정 에서 복제

    $ git clone git@bitbucket.org:username/project.git
    
  5. accountB계정 에서 복제

    $ git clone git@bitbucket-accountB:username/project.git
    

여기 더보기


24

ssh-agent 사용에 대해 Tuomas에 동의합니다. 또한 업무용으로 두 번째 개인 키를 추가하고 싶었고이 자습서 는 저에게 매력처럼 작용 했습니다.

단계는 다음과 같습니다.

  1. $ ssh-agent bash
  2. $ ssh-add /path.to/private/key 예 : ssh-add ~/.ssh/id_rsa
  3. 에 의해 확인 $ ssh-add -l
  4. $ssh -v <host url>예 를 들어 테스트ssh -v git@assembla.com

4
ssh-agent몇 년 동안 사용 되어 왔으며 최근에는 wm gnome-keyring내에서 Gnome을 사용하기로 전환했습니다 i3. 그 이유는 간단합니다. Gnome의 Keyring 관리자는 기억하지 않아도 ssh 키 추가 및 제거를 자동으로 처리합니다 ssh-add. 또한 하나의 암호를 제공하여 잠금을 해제 할 수 있습니다 (보안을 위해 지정된 시간에 시간 초과). 각자 자신에게. Arch에서 그놈 설정을 사용하기 때문에 설정에서 플러그 앤 플레이를 사용했습니다. 안티 그놈이라면이 주석을 무시하십시오.
eduncan911

@ eduncan911, 나는 그놈 키 링이 도움이 될 수 있다는 데 동의하지만 실제로 ed25519 키를 처리하지 않으므로 저에게는 스타터가 아닙니다. 업데이트 : wiki.archlinux.org/index.php/GNOME/… 에서 시스템의 ssh-agent를 사용하므로 더 이상 문제가되지 않습니다.
Brian Minton

15

두 개의 Bitbucket 계정이 있고 두 개의 별도 SSH 키를 저장해야 할 때이 문제가 발생했습니다. 이것이 나를 위해 일한 것입니다.

다음과 같이 두 개의 개별 ssh 구성을 작성했습니다.

Host personal.bitbucket.org
    HostName bitbucket.org
    User git
    IdentityFile /Users/username/.ssh/personal
Host work.bitbucket.org
    HostName bitbucket.org
    User git
    IdentityFile /Users/username/.ssh/work

작업 계정에서 리포지토리를 복제해야 할 때 명령은 다음과 같습니다.

git clone git@bitbucket.org:teamname/project.git

이 명령을 다음과 같이 수정해야했습니다.

git clone git@**work**.bitbucket.org:teamname/project.git

마찬가지로 개인 계정의 복제 명령을 다음과 같이 수정해야했습니다.

git clone git @ personal .bitbucket.org : 이름 /personalproject.git

자세한 내용은 이 링크 를 참조하십시오.



11

이제 최신 버전의 git에서는 저장소 특정 git 구성 파일에 sshCommand 를 지정할 수 있습니다 .

  [core]
      repositoryformatversion = 0
      filemode = true
      bare = false
      logallrefupdates = true
      sshCommand = ssh -i ~/.ssh/id_rsa_user   
   [remote "origin"]
      url = git@bitbucket.org:user/repo.git
      fetch = +refs/heads/*:refs/remotes/origin/*

1

중요 : ssh-agent를 시작해야합니다

다음과 같이 ssh-add를 사용하기 전에 ssh-agent를 시작해야합니다 (아직 실행 중이 아닌 경우).

eval `ssh-agent -s` # start the agent

ssh-add id_rsa_2 # where id_rsa_2 is your new private key file

eval 명령은 Windows의 GIT bash에서 에이전트를 시작합니다. 다른 환경에서는 변형을 사용하여 SSH 에이전트를 시작할 수 있습니다.


1

당신은라는 이름의 구성 파일을 만들 수 있습니다 config귀하의 ~/.ssh폴더에 저장합니다. 다음을 포함 할 수 있습니다.

Host aws
    HostName *yourip*
    User *youruser*
    IdentityFile *idFile*

이를 통해 이와 같은 머신에 연결할 수 있습니다

 ssh aws

1

우분투 18.04에서는 할 일이 없습니다.

두 번째 ssh 키를 성공적으로 만든 후 시스템은 각 연결에 대해 일치하는 ssh 키를 찾으려고 시도합니다.

분명히하기 위해 다음 명령으로 새 키를 만들 수 있습니다

# generate key make sure you give it a new name (id_rsa_server2)
ssh-keygen 
# make sure ssh agent is running
eval `ssh-agent`
# add the new key
ssh-add ~/.ssh/id_rsa_server2
# get the public key to add it to a remote system for authentication
cat ~/.ssh/id_rsa_server2.pub

1

GITHUB의 여러 키 페어

1.0 SSH 구성 파일

1.1 ~ / .ssh / config 생성

1.2 chmod 600 ~ / .ssh / config (MUST)

파일에 1.3 입력 :

호스트 피자

호스트 이름 github.com

기본 인증 공개 키 # 선택 사항

IdentityFile ~ / .ssh / privatekey1

사례 A : FRESH NEW GIT CLONE

이 명령을 사용하여 복제를 git하십시오.

$ git clone git @ pizza : yourgitusername / pizzahut_repo.git

참고 : 나중에 .ssh / config의 호스트 이름“pizza”를 변경하려면 git cloned 폴더로 이동하여 .git / config 파일 url 행을 편집하십시오 (케이스 B 참조).

사례 B : 이미 클론 폴더를 가지고 있음

2.1 복제 된 폴더로 이동 한 다음 .git 폴더로 이동

2.2 설정 파일 편집

2.3 URL을 Old에서 New로 업데이트하십시오.

(Old) url = git@github.com:yourgitusername/pizzahut_repo.git    

(New) url = git@pizza:yourgitusername/pizzahut_repo.git


1

나를 위해 유일하게 작동하는 솔루션은 단순히 추가하는 것입니다. ~/.ssh/config

Host *
  IdentityFile ~/.ssh/your_ssh_key
  IdentityFile ~/.ssh/your_ssh_key2
  IdentityFile ~/.ssh/your_ssh_key3
  AddKeysToAgent yes

your_ssh_key 확장명없이 사용하지 마십시오 .pub


0

OpenSSH_5.3p1, OpenSSL 1.0.1e-fips를 실행하는 Centos 6.5에서 키 파일의 이름을 바꾸어 기본 이름을 갖지 않도록하여 문제를 해결했습니다. 내 .ssh 디렉토리에는 id_rsa_foo 및 id_rsa_bar가 있지만 id_rsa 등은 없습니다.


그리고 열쇠는 어떻게 사용됩니까? 자동 감지가 있습니까?
robsch

특정 호스트에 대한 올바른 키를 선택하는 방법을 랜달 슈워츠의 답변을 참조 stackoverflow.com/questions/2419566/...
크리스 오웬스

0

atlassian 블로그 페이지 에 언급 된대로 다음 텍스트를 포함하여 .ssh 내에 구성을 생성 하십시오 .

#user1 account
 Host bitbucket.org-user1
     HostName bitbucket.org
     User git
     IdentityFile ~/.ssh/user1
     IdentitiesOnly yes

 #user2 account
 Host bitbucket.org-user2
     HostName bitbucket.org
     User git
     IdentityFile ~/.ssh/user2
     IdentitiesOnly yes

그런 다음 접미사 도메인으로 간단하게 체크 아웃 할 수 있으며 프로젝트 내에서 작성자 이름 등을 로컬로 구성 할 수 있습니다.


0

여러 ssh 키를 유지 관리하기 위해이 sshmulti npm 패키지를 사용해 볼 수 있습니다 .


이 같은 것에 npm을 사용 하지 않는 것이 좋습니다 . 그것은 간단한 검사에서 몇 년 된 패키지 인 고독한 늑대 개발자의 범위를 포함하는 일련의 종속성을 가졌습니다. sshmulti npm 페이지 자체는 테스트되지 않았 음을 선언합니다.
Jack Wasey

0

@ sajib-khan 의 답변 에서 영감을 얻은 솔루션이 있습니다. 기본 구성은 설정되어 있지 않으며 gitlab의 개인 계정이며 다른 하나는 회사 계정입니다. 여기 내가 한 일 :

ssh 키 생성

ssh-keygen -t rsa -f ~/.ssh/company -C "name.surname@company.com"

ssh 설정 편집

nano ~/.ssh/config

    Host company.gitlab.com
    HostName gitlab.com
    PreferredAuthentications publickey  
    IdentityFile ~/.ssh/company

캐시 된 SSH 키 삭제

ssh-add -D

그것을 테스트!

ssh -T git@company.gitlab.com

@ hugo.sohm, GitLab에 오신 것을 환영합니다!

ssh -T git@gitlab.com

@HugoSohm, GitLab에 오신 것을 환영합니다!

사용해 !

회사 계정

$ git clone git@company.gitlab.com:group/project.git

개인 / 기본 계정

$ git clone git@gitlab.com:username/project.git

내가 사용한 소스 는 다음과 같습니다 .


0

~ / .ssh / config에서 다음을 설정하는 방법이 마음에 듭니다.

# Config for Github to support multiple Github keys
Host  github.com
  HostName github.com
  User git
# UseKeychain adds each keys passphrase to the keychain so you don't have to enter the passphrase each time.
  UseKeychain yes
# AddKeysToAgent would add the key to the agent whenever it is used, which might lead to debugging confusion since then sometimes the one repo works and sometimes the other depending on which key is used first.
#  AddKeysToAgent yes
# I only use my private id file so all private repos don't need the env var `GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa"` to be set.
  IdentityFile ~/.ssh/id_rsa

그런 다음 리포지토리에서 .env사용할 ssh 명령이 포함 된 파일을 만들 수 있습니다 .

GIT_SSH_COMMAND="ssh -i ~/.ssh/your_ssh_key"

그런 다음 예를 들어 dotenv 를 사용 하면 환경 변수가 자동으로 내보내지고 whoop whoop 프로젝트 / 디렉토리 당 원하는 키를 지정할 수 있습니다. 암호문은 키 체인에 추가되었으므로 한 번만 요청됩니다.

이 솔루션은 git과 완벽하게 작동하며 Mac에서 작동하도록 설계되었습니다 UseKeychain.

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