한 컴퓨터에서 SSH 를 이용해 여러개의 Github 계정 사용하기

Permission Error 없이 여러개의 Github 계정을 사용해 보자

2020-11-15

최근에 블로그를 github page 로 운영하기 위해서 github 계정을 하나 더 만들게 되었습니다. 물론, 하나의 계정으로 여러 github page 를 운용할 수는 있지만 용도를 명확히 하고 싶어서 저장소를 하나 더 만들기로 하였습니다.

저 처럼 하나의 컴퓨터에서 n개 이상의 github 계정을 사용하는 경우 별도의 설정 없이 ssh-key 생성하여 github 에 등록하면 예상하지 못 한 Permission 에러를 마주하게 됩니다.
public key 를 등록 했는데도 말이죠.

이를 해결하기 위한 방법을 하나씩 알아보도록 하겠습니다.

Step & Overview

  1. github 계정별 ssh-key 생성
  2. 생성된 ssh-key github 에 등록
  3. ssh config 파일에 설정값 추가
  4. 저장소별 git config 파일 수정
  5. ssh-agent 에 ssh-key 등록
  6. connection 테스트

설명 편의를 위해 account, repository 명을 아래와 같이 명칭하겠습니다.

  • Account A
  • Account B

STEP 1 - github 계정별 ssh-key 생성

ssh 로 github 을 사용하기 위한 ssh-key 를 아래 CLI 를 통해 생성할 수 있습니다.

1
2
# ssh-key 생성
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

참고로 ssh-key 는 ./ssh 위치에 생성해야 하며 해당 directory 없다면 직접 생성해 줍니다.

1
2
# .ssh directory 생성
cd ~/ && mkdir .ssh

직접 생성해 봅시다.

1
2
cd ~/ && mkdir .ssh
ssh-keygen -t rsa -b 4096 -C "user-a@blabla.com"

Account A 계정의 ssh key pair 생성을 위해 메일은 user-a@blabla.com 로 입력해 주었으며, 위 명령어를 실행하면 아래와 같은 화면이 나오게 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Generating public/private rsa key pair.
# Enter file in which to save the key (/Users/blabla/.ssh/id_rsa): id_rsa_github_user-a
# Enter passphrase (empty for no passphrase):
# Enter same passphrase again:
# Your identification has been saved in id_rsa_github_user-a.
# Your public key has been saved in id_rsa_github_user-a.pub.
# The key fingerprint is:
# SHA256:abcabcabcabcabcabcabcabcabcabcabcabcabcabc user-a@blabla.com
# The key's randomart image is:
# +---[RSA 4096]----+
# | .o.. |
# | . +.. |
# | . o+.. . |
# | +o.o.= |
# | +..o+E.o |
# | . oBoB=o |
# | o .+oO+@o |
# | o oo + Ooo |
# | .... . o |
# +----[SHA256]-----+

위 화면에서 중요한 부분은 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
2
id_rsa_github_user-a        id_rsa_github_user-b
id_rsa_github_user-a.pub id_rsa_github_user-b.pub

*.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
2
3
4
5
6
7
8
9
10
11
12
13
# ~/.ssh/config

# user-a
Host github-user-a
HostName github.com
User git
IdentityFile /Users/blabla/.ssh/id_rsa_github_user-a

# user-b
Host github-user-b
HostName github.com
User git
IdentityFile /Users/blabla/.ssh/id_rsa_github_user-b

위와 같이 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[remote "origin"]
url = git@github-user-a:user-a/repo-a.git
fetch = +refs/heads/*:refs/remotes/origin/*
[user]
email = user-a@blabla.com
name = user-a
[branch "main"]
remote = origin
merge = refs/heads/main

등록을 완료하였다면 각 저장소 directory 에서 아래 명령어를 통해 잘 등록되었는지 확인해 봅니다.

1
git remote -v

등록한 remote url 이 아래와 같이 출력되되면 정상입니다.

1
2
origin	git@github-user-a:user-a/repo-a.git (fetch)
origin git@github-user-a:user-a/repo-a.git (push)

간략하게 지금까지 진행한 내용을 확인해 보면 아래와 같습니다.

  1. ssh key pair 생성
  2. github 에 public key 등록
  3. ssh config 에 Host, ssh key 설정 추가
  4. 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
2
~/entry/personal/blog/cresumerjang.github.io-app(master) » git push
Enter passphrase for key '/Users/blabla/.ssh/id_rsa_github_user-a':

성공하면 마찬가지로 ssh-agent 에 key 가 등록되어 이후 부터는 비밀번호 입력 없이 사용할 수 있게 됩니다.

ssh-agent 에 직접 key 등록을 위해 위 명령어를 사용해 ssh agent 를 실행해 줍니다.

1
2
# SSH 에이전트 백그라운드로 실행 
eval "$(ssh-agent -s)"

ssh-add 명령어로 STEP1 에서 생성한 저장소별 각각의 key 를 등록해 줍니다.

1
2
3
# 각기 다른 ssh 키 등록
ssh-add ~/.ssh/id_rsa_github_user-a
ssh-add ~/.ssh/id_rsa_github_user-b

-l option 을 사용해 ssh-agent 에 키가 잘 등록 되었는지 확인합니다.

1
2
# 등록된 키 리스트 확인
ssh-add -l

아래와 같이 등록한 key 들이 출력되면 정상입니다.

1
2
4096 SHA256:abcabcabcabcabcabcabcabcabcabcabcabcabcabc user-a@blabla.com (RSA)
4096 SHA256:defdefdefdefdefdefdefdefdefdefdefdefdefdef user-b@blabla.com (RSA)

STEP 6 - connection 테스트

마지막으로 잘 연결 되는지 테스트해 볼 차례입니다.
아래 명령어로 연결이 되는지 테스트해 볼 수 있습니다.

1
2
# 연결 테스트
ssh -T user@domain

직접 테스트해 봅시다.

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
2
3
4
5
ssh: Could not resolve hostname github-user-a: nodename nor servname provided, or not known
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

이 경우 STEP3 를 참고하여 ssh config 에 설정을 추가해 줍니다.

Permission error

STEP6 에서 성공 메시지가 뜨더라도 ssh config Host 명과 git remote url 도메인이 다르면 fetch, push 간 permission 에러 메시지가 뜰 수 있습니다.

1
2
3
4
5
ERROR: Permission to user-a/repo-a.git denied to ${theOtherUser}.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

혹시 Permission error 를 마주하게 된다면 STEP4 를 참고하여 ssh config Host 명과 git remote url 이 일치 하도록 수정해 줍니다.

End

궁금한 점이나 잘 못된 내용이 있으면 피드백 부탁드립니다.
읽어주셔서 감사합니다.