최근에 블로그를 github page 로 운영하기 위해서 github 계정을 하나 더 만들게 되었습니다. 물론, 하나의 계정으로 여러 github page 를 운용할 수는 있지만 용도를 명확히 하고 싶어서 저장소를 하나 더 만들기로 하였습니다.
저 처럼 하나의 컴퓨터에서 n개 이상의 github 계정을 사용하는 경우 별도의 설정 없이 ssh-key 생성하여 github 에 등록하면 예상하지 못 한 Permission
에러를 마주하게 됩니다.
public key 를 등록 했는데도 말이죠.
이를 해결하기 위한 방법을 하나씩 알아보도록 하겠습니다.
Step & Overview
- github 계정별 ssh-key 생성
- 생성된 ssh-key github 에 등록
- ssh config 파일에 설정값 추가
- 저장소별 git config 파일 수정
- ssh-agent 에 ssh-key 등록
- connection 테스트
설명 편의를 위해 account
, repository
명을 아래와 같이 명칭하겠습니다.
- Account A
- account: user-a
- repository: git@github.com:user-a/repo-a.git
- Account B
- account: user-b
- repository: git@github.com:user-b/repo-b.git
STEP 1 - github 계정별 ssh-key 생성
ssh 로 github 을 사용하기 위한 ssh-key 를 아래 CLI 를 통해 생성할 수 있습니다.
1 | # ssh-key 생성 |
참고로 ssh-key 는 ./ssh
위치에 생성해야 하며 해당 directory 없다면 직접 생성해 줍니다.
1 | # .ssh directory 생성 |
직접 생성해 봅시다.
1 | cd ~/ && mkdir .ssh |
Account A 계정의 ssh key pair 생성을 위해 메일은 user-a@blabla.com
로 입력해 주었으며, 위 명령어를 실행하면 아래와 같은 화면이 나오게 됩니다.
1 | # Generating public/private rsa key pair. |
위 화면에서 중요한 부분은 Enter file in which to save the key (/Users/blabla/.ssh/id_rsa):
이 부분으로, 구분할 수 있는 ssh-key 명을 입력하고 엔터를 쳐 주시면 됩니다. 실습에서는 id_rsa_github_user-a
로 작성하였습니다. 이후 ssh config 의 IdentityFile 값으로 해당 파일의 경로를 작성하게 됩니다.
추가로 비밀번호를 입력할 수 있는데 이 부분은 필요하지 않으시면 엔터를 눌러 넘어가 주시면 key 생성이 완료됩니다.
동일한 방법으로 Account B 를 위한 ssh-key 도 생성한 후 ls
명령어를 통해 확인해 보면 아래와 같이 ssh-key 가 생성된 것을 확인하실 수 있습니다.
1 | id_rsa_github_user-a id_rsa_github_user-b |
*.pub
확장자가 붙은 파일은 public key 이며, 붙지 않은 파일은 private key 입니다. private key 는 공개되지 않게 잘 관리해야하며, 개인 장비가 아니라면 key 생성시 비밀번호를 입력하는게 좋습니다.
STEP 2 - 생성된 ssh-key github 에 등록
이전 STEP 에서 정상적으로 key 가 생성된 것을 확인 하셨다면 github 사이트에 각 계정마다 public key 를 등록해 줘야합니다.
1 | pbcopy < id_rsa_github_user-a.pub |
위 명령어를 통해 *.pub
확장자가 붙은 id_rsa_github_user-a.pub
, id_rsa_github_user-b.pub
키를 각각 복사하여 해당 github 계정에 에 등록해
줍니다.
ssh-key 등록하는 방법은 Adding a new SSH key to your GitHub account
를 참고해서 진행합니다. 참고로 이미 등록된 key 는 계정이 다르더라도 등록하실 수 없습니다.
STEP 3 - ssh config 파일에 설정값 추가
이전 STEP 에서 github 에 public key 등록해 줬으니 이제 사용하는 장비의 ssh config 파일에 private key 를 등록할 차례입니다.
1 | # ~/.ssh/config |
위와 같이 ssh config 를 작성해 줍니다. 여기서 Host
에 작성된 값이 중요한데, git config 작성시 remote url 값을 해당 호스트 명으로 작성하지 않으면 Host 를 찾을 수 없다거나 Permission 에러가 발생할 수 있습니다.
STEP 4 - 저장소별 git config 파일 수정
서로 다른 계정의 github 저장소로 push 를 할 경우 github 에 등록된 public key 와 쌍이되는 private key 가 사용될 수 있도록 설정해 줘야합니다. 이를 위해 이전 STEP 에서 ssh config 에 Host 명과 사용될 private key 를 등록해 주었습니다.
이번 STEP 에서는 private key 사용을 위해 git config 파일의 remote url 도메인을 ssh 에 등록된 Host 값으로 변경해 줍니다. Host 명을 참조하여 어떤 private key 를 사용할지 결정하기 때문에 ssh config 에 작성한 Host 명과 동일한 이름을 작성해 줘야합니다.
1 | git remote add origin git@github-user-a:user-a/repo-a.git |
위 처럼 git cli 를 사용해서 값을 변경해 줘도 되지만 여기서는 config 파일을 직접 수정하여 변경해 보겠습니다.
1 | [core] |
등록을 완료하였다면 각 저장소 directory 에서 아래 명령어를 통해 잘 등록되었는지 확인해 봅니다.
1 | git remote -v |
등록한 remote url 이 아래와 같이 출력되되면 정상입니다.
1 | origin git@github-user-a:user-a/repo-a.git (fetch) |
간략하게 지금까지 진행한 내용을 확인해 보면 아래와 같습니다.
- ssh key pair 생성
- github 에 public key 등록
- ssh config 에 Host, ssh key 설정 추가
- git config 에 사용할 Host 등록
사실 여기까지만 진행해도 해당 포스팅의 목적인 여러개의 github 계정을 사용하실 수 있습니다. 하지만 ssh key 에 비밀번호가 걸려있고 본인만 private 하게 사용하는 장비에서 좀 더 편리하게 사용하고 싶다면 다음 STEP 을 적용해 보시면 됩니다. 더이상 다른 설정은 필요하지 않으시다면 STEP6 로 넘어가시면 됩니다.
STEP 5 - ssh-agent 에 ssh-key 등록
ssh-agent 를 사용하면 매번 비밀번호를 입력하지 않고도 자유롭게 fetch, push 를 할수 있습니다. 참고로 ssh-agent 가 실행중이라면 한번이라도 push 를 할 경우 자동으로 key 가 등록되며, 사용하려는 key 에 비밀번호가 있는 경우 최초 한번만 아래와 같이 패스워드를 요구합니다.
1 | ~/entry/personal/blog/cresumerjang.github.io-app(master) » git push |
성공하면 마찬가지로 ssh-agent 에 key 가 등록되어 이후 부터는 비밀번호 입력 없이 사용할 수 있게 됩니다.
ssh-agent 에 직접 key 등록을 위해 위 명령어를 사용해 ssh agent 를 실행해 줍니다.
1 | # SSH 에이전트 백그라운드로 실행 |
ssh-add 명령어로 STEP1 에서 생성한 저장소별 각각의 key 를 등록해 줍니다.
1 | # 각기 다른 ssh 키 등록 |
-l
option 을 사용해 ssh-agent 에 키가 잘 등록 되었는지 확인합니다.
1 | # 등록된 키 리스트 확인 |
아래와 같이 등록한 key 들이 출력되면 정상입니다.
1 | 4096 SHA256:abcabcabcabcabcabcabcabcabcabcabcabcabcabc user-a@blabla.com (RSA) |
STEP 6 - connection 테스트
마지막으로 잘 연결 되는지 테스트해 볼 차례입니다.
아래 명령어로 연결이 되는지 테스트해 볼 수 있습니다.
1 | # 연결 테스트 |
직접 테스트해 봅시다.
1 | ~/root-repository/.git » ssh -T git@github-user-a |
Account A 경우 ssh config Host 명을 github-user-a
이름으로 등록했기 때문에 위처럼 명령어를 실행합니다.
1 | Hi user-a! You've successfully authenticated, but GitHub does not provide shell access. |
실행 결과로 위와 같은 내용이 출력되었다면 정상적으로 연결 된 것으로 모든 설정은 끝이 났습니다.
서로 다른 계정의 저장소 별로 작업 후 push 해 github 저장소에 정상적으로 반영되는지 확인해 봅니다.
Errors
위 STEP 들을 모두 마치면 정상적으로 n 개의 계정을 이용할 수 있어야 하지만 살다보면 예상하지 못한 경우들이 발생하기 마련입니다.
아래는 제가 설정하면서 만났던 에러 메시들 입니다. 혹시나 여러 계정으로 push 가 안된다면 아래 동일한 메시지가 있는지 참고하셔서 문제를 해결해 보시면 좋을 것 같습니다.
Hostname error
git remote url 에 등록된 도메인이 ssh config 에 없을 경우 아래와 같은 error message 가 출력 됩니다.
1 | ssh: Could not resolve hostname github-user-a: nodename nor servname provided, or not known |
이 경우 STEP3 를 참고하여 ssh config 에 설정을 추가해 줍니다.
Permission error
STEP6 에서 성공 메시지가 뜨더라도 ssh config Host 명과 git remote url 도메인이 다르면 fetch, push 간 permission 에러 메시지가 뜰 수 있습니다.
1 | ERROR: Permission to user-a/repo-a.git denied to ${theOtherUser}. |
혹시 Permission error 를 마주하게 된다면 STEP4 를 참고하여 ssh config Host 명과 git remote url 이 일치 하도록 수정해 줍니다.
End
궁금한 점이나 잘 못된 내용이 있으면 피드백 부탁드립니다.
읽어주셔서 감사합니다.