본문 바로가기

카테고리 없음

[SSH] Git 1PC 여러 계정 사용

반응형

오늘은 하나의 하드웨어에서 여러개의 git 계정을 연동하는 방법을 정리하고자 한다.
여러 블로그 글을 보며 시행착오를 겪는 과정이 있었기에 나름대로 정리하는 것에 의의를 두려 한다. (이번 글도 두서가 없다는 뜻)

적용 환경은 mac을 기준으로 작성했다. 만, windows도 WLS가 기본으로 설치되어 있기 때문에 터미널을 다룬다는 부분에서 별 차이는 없을 것으로 예상된다.
+) 복수 계정을 등록하는 글이므로, 기존에 생성된 ssh 파일 확인등의 절차는 생략한다.

1. SSH key 생성

우선, 사용할 계정마다 등록 할 SSH key를 생성해야 한다.
생성방법은 간단하다. terminal을 열어 (window도 동일-cmd창) 아래 명령어로 key를 생성한다.

# ssh-keygen -t "{암호화 옵션}" -C "{key 식별 주석}" -f "{생성할 ssh key 파일명}"
$ ssh-keygen -t rsa -C "sample" -f "id_rsa_sample"

해당 명령어는 rsa 형식으로 암호화 된 id_rsa_sample 이라는 ssh key 파일을 생성한다는 뜻.
(-C option의 값은 주석이니만큼 큰 의미는 없지 싶다.)

명령어를 작성하면 아래와 같이 key에 대한 비밀번호를 설정하라는 텍스트가 뜬다.

Enter passphrase (empty for no passphrase): 
Enter same passphrase again:

 

이 때 아무것도 작성하지 않고 Enter를 누르면 별도의 비밀번호 없이 key를 사용할 수 있다.
비밀번호를 설정한 경우에는 ssh key를 통해 연결된 서버(이를테면 git)에 접속하고자 할 때마다 비밀번호를 작성해야 하는 과정이 필요한데, 이에 대해서는 아래 ssh-agent 명령어와 함께 추가적으로 짧게 기술하도록 하겠다.

이 과정을 마치면 ssh 폴더( 기본 경로: ~/.ssh )에 "파일명", "파일명.pub" 과 같은 두 개의 파일이 생성된다.
(위의 경우 id_rsa_sample, id_rsa_sample.pub)
이 중 .pub 파일은 public key 파일(git 등 외부에 등록하게 되는 용도) 이고, 나머지는 private key 파일이니 참고.

이 과정을 연결할 git 계정 수 만큼 반복한다. (ssh key를 git 계정 수 만큼 생성)
+) window의 경우 ssh 명령어를 사용하기 위해서는 OpenSSH 설치가 필요하다. 설치 방법은 아래 링크(ms 공식페이지) 참고

 

OpenSSH 설치

Windows용 OpenSSH 클라이언트 및 서버를 설치합니다.

learn.microsoft.com

 

2. SSH cofing파일 작성

vi(vim) 명령어를 활용해 SSH key 파일이 저장된 위치에 config파일을 생성 후 아래와 같은 내용을 작성한다.

$ vim ~/.ssh/config
# sample1
Host sample				# ssh 연결 시 사용할 name. git repository
HostName github.com			# 연결 할 플랫폼의 domain (github.com 등)
User sample-git				# 연결 할 플랫폼의 사용자 아이디(github에 등록된 id)
IdentityFile ~/.ssh/id_rsa_sample	# 생성한 ssh 개인 key 경로(.pub 를 제외한 파일, 절대경로)

# sample2
Host sample2
HostName github.com
User sample2-git
IdentityFile ~/.ssh/id_rsa_sample2

 

3. github에 생성한 ssh key 등록

3-1. github 로그인 후 우측 상단 프로필 이미지>Settings 메뉴에 진입
3-2. Settings 화면 내 좌측 메뉴 중간쯤 보이는 SSH and GPG keys 메뉴 선택
3-3. New SSH key 버튼을 통해 key 등록 화면 진입

Settings 화면, 좌측 메뉴 / 우측 상단 New SSH key 버튼 확인


3-4. 터미널에 cat {ssh public key 파일 경로} 를 입력해 public key 확인 후 key 입력창에 붙여넣기

$ cat ~/.ssh/id_rsa_sample.pub

이런 형식이 될 것

3-5. 등록완료!

Title은 작성한 것과 같이, 계정 내에서 SSH key를 구분하는 용도로 사용된다

 

4. SSH 연결 테스트

아래 명령어를 실행해 SSH 연결 여부를 확인해보자.

# ssh -T git@{config에 등록한 Host}
$ ssh -T git@sample

제대로 연결이 되었다면 "Hi {username}! You've successfully authenticated ..." 와 같은 메세지가 출력 될 것이다.

나는 여기에서 막혔는데, 연결 테스트는 넘겨도 무방하다지만 나는 그래도 확인을 하고 넘어가고 싶어 이런 저런 시행착오를 겪었고, 도출한 몇 개의 원인은 아래와 같다.

    1. su 명령을 통해 관리자 mode에서 절차를 실행
      > root 계정으로 테스트 명령어를 실행하는 경우 "Could not resolve hostname {hostname}: nodename nor servname provided, or not known" 과 같은 에러가 발생한다. ssh 파일 자체는 user폴더에 종속(?) 되는데 root로 실행해서 이런게 아닌가 추측해봤다. 정확한 원인 규명은 못함.
      > 또한, root 계정으로 ssh key 파일을 생성한 경우, 관리자 상태를 종료하더라도 소유자가 root이기 때문에 해당 명령어는 실행되지 못할 것으로 보인다. (필자는 소유자를 변경 한 후 테스트를 진행해서, 소유자가 root인 경우의 케이스는 겪지 못했음..)
      이 경우 root 계정 상태에서 chown 명령어를 통해 소유자를 user로 변경해주자. (user가 문자 그대로 user가 아니라 현재 pc를 사용중인 계정이라는 건 모두 알고 있을거라고 생각함..)
    2. github permission denied가 노출되는 경우
      > ssh -T git@{host} 명령어가 실패할 때, git@github.com 으로 git에 정상적으로 연결되었는가, 를 확인해볼 때 permission denied가 발생했다.
      > 이 때, "The authenticity of host 'github.com ({ip address})' can't be established." 라는 문구와 함께 ED25519 key가 함께 표시되면서 "Are you sure you want to continue connecting (yes/no/[fingerprint])?" 이라고 물어본다.
      > 왠지 함부로 연결하면 안 될 것 같으니 취소를 했는데, 알고 보니 표시된 ED25519 key가 github에 등록된 key와 동일하면 연결을 진행하면 되는 상황이었고, yes 명령어 입력을 진행하면 github에 연결이 되는 듯 했다.
      > 아래는 github 공개 key 리스트와 공식 페이지 링크
# GitHub의 공개 키 지문 리스트
SHA256:uNiVztksCsDhcc0u9e8BujQXVUpKZIDTMczCvj3tD2s(RSA)
SHA256:br9IjFspm1vxR3iA35FWE+4VTyz1hYVLIE2t1/CeyWQ (DSA - 사용되지 않음)
SHA256:p2QAMXNIC1TJYWeIOttrVc98/R1BUFWu3/LiyKgUfQM(ECDSA)
SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU(Ed25519)
 

SSH 연결 테스트 - GitHub Docs

SSH 키를 설정하고 GitHub.com의 계정에 추가한 후 연결을 테스트할 수 있습니다.

docs.github.com

 

5. Git 실사용 테스트

github 계정으로 접속해서 새 repository 생성 후, local 폴더에 remote를 연결해보려고 한다.
ssh로 clone을 받아야 하는데, 기본 ssh clone code에서 수정이 필요하다.

# 기본 git clone code
# git@github.com:sample-git/sampleRepository.git

# 사용해야 할 code
# git@{Host}:{userId}/{repositoryName}.git
$ git {명령어} git@sample2:sample-git/sampleRepository.git

위의 예시와 같이 같이, git@github.com 이 아닌, git@{host} 로 내가 .ssh/config 에 등록한 host를 사용해 git에 연결해준다.
4번 ssh 연결 테스트에서 진행한 것과 같은 방식으로 이해하면 된다.
정상적으로 명령이 실행됐으면 성공~

위의 절차들을 통해 각자 다른 계정의 repository와 동기화 후 commit을 진행하면 global로 지정된 계정 정보로 commit이 작성되는 경우가 있는데, 이는 git의 config에 등록된 사용자 정보로 명령이 실행되기 때문으로 보인다.
연결 한 repository에 따라 계정을 다르게 설정하는 방법은 두 가지 정도로 정리할 수 있을 것 같아서, 아래에 추가 정보로 작성한다.

추가1 > .gitconfig 등록

인터넷을 찾아보면 가장 보편적으로 찾을 수 있는 방법으로, git 프로젝트의 위치에 따라 계정을 설정하는 방식이다.
문장이 매끄럽지 않은 것 같은데, 코드를 보며 이해해보자.

우선 vi(m) 으로 .gitconfig 파일을 연다. 

$ vi ~/.gitconfig

git을 이미 사용중이라면 아마 .gitconfig파일에 git config --global 명령어 등을 통해 최초 설정한 계정이 작성되어 있을 것이다.
(--global 로 설정하지 않고 --local 등으로 설정한 경우에는 애초에 commit 계정이 섞일 일이 없을 듯)

# ~/.gitconfig
[user]
    name = sample-git		# global로 등록된 git user name 
    email = sample@example.com	# global로 등록된 git user email
...

이런 식으로 global로 등록된 계정이 있을 것이다.
지금 하고자 하는 건 global 계정을 바꾸는게 아닌, git 프로젝트 위치에 따라 적용 될 계정 정보를 등록해주는 것이다.
이를 위해 .gitconfig와는 별개의 git 사용자 정보 파일을 생성해서, .gitconfig에 등록 할 것이다.
.gitconfig 편집기에서 빠져나와 다시 vi 명령어로 파일을 생성하자.

# vi ~/{.gitconfig에 등록 될 추가 사용자 계정 설정 파일명}
# vi ~/.gitconfig-{구분명칭}
$ vi ~/.gitconfig-sample

파일 명은 자유롭게 지정해도 무방하나, 통일성과 어떤 파일인지 파악을 용이하게 하기 위해 보편적으로 사용하는 네이밍 포맷을 사용하자.
vi로 생성한 파일에 추가 할 git 사용자 계정 정보를 작성하고, .gitconfig 파일로 돌아가서 등록해주면 된다.

# ~/.gitconfig-sample
[user]
    name = sample2-git
    email = sample2@example.com
[github]
    user = sample2-git			# github 유저명: 사실 이건 왜 쓰는지 잘 모르겠음
# ~/.gitconfig
[user]
    name = sample-git
    email = sample@example.com
...

# 새로 추가 할 git 계정 정보 include
# [includeIf "{파일경로}"]
[includeIf "/Users/useraccount/forsample2"]	# sample2 계정을 사용하고자 하는 폴더경로
    path = .gitconfig-sample			# 위에서 작성한 git 추가 계정 파일

이렇게 작성해주면 /Users/useraccount/forsample2 에 위치한 git 프로젝트는 sample2 계정으로 commit 등이 작성된다.
path가 ~/.gitconfig-sample 이 아닌 이유는 .gitconfig와 .gitconfig-sample이 동일한 위치에 있음이 전제됨을 잊지 말자.

 

추가2> git 프로젝트 별 local 계정 등록하기

위에 잠깐 언급한 것 처럼 git 계정을 등록할 때 --local 옵션을 사용하면 그 순간 위치한 git 프로젝트에 한정되어 계정이 등록된다.
설정 방법은 git 프로젝트 위치에서 계정 설정 명령어를 실행하거나, 해당 위치에 위에 작성한 것 같은 config 파일을 작성하면 된다.

가령, 내가 ~/project/sample-project 라는 위치에 git 이 연결된 프로젝트가 있는 경우 아래와 같이 진행한다.

# project 폴더로 위치 변경
$ cd ~/project/sample-project

# local git 사용자 계정 설정
$ git config --local user.name "sample2-git"		# ""는 생략 가능
$ git config --local user.email "sample2@example.com"

이후 commit을 진행하면 내가 --local으로 등록한 계정으로 commit 메세지가 등록되는 것을 확인할 수 있다.
등록된 config 파일을 확인하고 싶다면, 프로젝트 내 .git/config 파일에서 볼 수 있다.

# 절대경로로 확인 (상대경로로 찾아가도 무방함)
$ vi ~/project/sample-project/.git/config
# ~/project/sample-project/.git/config
[user]
    name = sample2-git
    email = sample2@example.com
...

이런식으로 파일이 생성된 걸 확인할 수 있다.

상황에 따라 git 계정 별로 프로젝트가 묶여있지 않거나 / 단일 프로젝트에만 특정 계정을 등록해야 하는 경우 1번 방법은 비교적 공수가 많이 들 수 있다. (아니면 프로젝트를 폴더별로 다시 정리해야 하는 작업이 선행되든지)
특히, 하나의 특정한 프로젝트에만 별도 계정을 등록해야 하는 경우에는 굳이 별도 파일을 생성해서 지지고 볶는 것 보다 프로젝트에 별도 계정을 등록해서 사용하는 편이 훨씬 효율적이고, 편리할 것이다.

git config 파일 별 우선순위는 아래와 같다. 출처는 git 공식문서 (링크 첨부)

 

Git - Git 최초 설정

Vim과 Emacs, Notepad++은 꽤 인기 있는 편집기로 개발자들이 즐겨 사용한다. Mac이나 Linux 같은 Unix 시스템, Windows 시스템에서 사용 가능하다. 여기서 소개하는 편집기들이 불편해서 다른 편집기를 사

git-scm.com

 

부록) ssh-agnet

ssh key를 생성하는 과정에서 ssh-agent라는 명령어를 잠깐 언급했는데, 개념과 등록법은 아래와 같다.

ssh-agent는 passphrase(password)와 private key를 메모리에 캐싱해두는 ssh 명령어이다.
즉, ssh key 생성 시 비밀번호를 설정해도 ssh-agent 명령어로 정보를 캐싱해두면 연결 시 마다 비밀번호를 입력하지 않아도 된다는 뜻.

ssh-agent로 ssh key를 관리하기 위해서는 ssh-add 명령어를 통해 agent가 관리할 key를 등록해줘야 한다.

# ssh-add ~/.ssh/{ssh key파일명}
$ ssh-add ~/.ssh/id_rsa		# 관리 할 ssh 파일 등록
$ ssh-add ~/.ssh/id_rsa_sample

이후 ssh-agent 명령을 사용해서 agent를 실행시키면 client system이 agent를 참조하여 ssh연결을 가능케 하는 것이다.
다른 수많은 블로그 글들에서는 eval "$(ssh-agent -s)" 라는 커맨드를 작성하라는 것을 볼 수 있는데 (실행도 add 전에 실행하고)
이 부분에 대해 조금 더 알아본 후 정리해보았다. 아래는 ssh-agent 실행 명령어와, 차이점을 간략하에 나열한 코드

# ssh-agent 단순 실행: 환경변수를 설정하는 명령이 출력.
# 실제로 환경변수에 등록된 것이 아니므로, 이 명령어를 사용하는 것으로는 client가 ssh agent를 찾지 못함
$ ssh-agent

# ssh agent를 자신이 사용하고 있는 shell 내에서 실행시키는 방법.
# 동일한 shell에서 실행되므로, linux를 종료(로그아웃) 하면 agent도 함께 종료된다.
$ ssh-agent $SHELL		# $SHELL = 자신이 현재 사용하고 있는 shell

# 블로그 글에서 가장 많이 보이는 방법. ssh-agent를 background로 실행시킨다.
# agent를 별도의 독립된 shell로 실행하기 때문에 linux를 종료해도 agent는 종료되지 않는다.
$ eval `ssh-agent`
# 또는
$ eval "$(ssh-agent -s)"	# 위와 동일한 의미. -s는 실행옵션인 듯 한데, 정확히는 모르겠다.

이 부분은 linux 적인 내용이라 결국 터미널을 계속 켜고 있지 않은 보통 개발자는 맨 아래의 eval 명령어를 통해 agent를 background에서 실행시키는 것이 효율적일 것이다. (여기저기서 같은 방법을 쓰는데에는 다 이유가 있는 거였음)
혹시라도 eval로 실행한 agent를 종료하고 싶다면 아래와 같이 kill 명령어로 종료하도록 하자

# kill {agent pid}
$ kill 84798		# 여기에 작성한 pid는 예시로, 각자 실행된 agent의 pid를 알고 있어야 함

# pid를 기억하지 못하는 경우
$ ps -e

ps -e 는 실행중인 모든 process를 조회하는 명령어인데, -e 옵션이 없으면 현재 shell내의 process만 노출되므로 background에서 실행중인 agent는 노출되지 않는다. 다만, 전체 process가 조회되기 때문에.. 리스트가 굉장히 길다... 그 중에 CMD column값이 ssh-agent인 pid를 찾아서 kill 하면 되는데... 뭐.. 그냥 종료하지 않아도 되지 않을까?

아래는 ssh 관련하여 설명이 잘 된 것 같아 참고한 링크들

 

ssh-agent 가 private key 를 캐싱할 수 있도록 등록해 주는 ssh-add 명령어 사용법

 

www.lesstif.com

 

SSH 인증키 접속 (ssh-agent 활용법)

client 계정의 아이디와 비밀번호를 입력하지 않고 단지 개인키를 사용하기 위한 패스프레이즈(Passphrase) 비밀번호만을 입력하였다. 혹 어떤 독자는 ‘어 똑같이 비밀번호를 입력하는 데 무엇이

blog.pages.kr

 

적고 싶은 걸 다 적다 보니 글이 꽤 길어졌는데, 파트를 분리해야 할 까 살짝 고민이 된다.
검색했을 때 나의 상황에 딱 맞는 정리글이 없어 이런저런 자료를 찾아 정리한 거라 큰 상관은 없을 것 같긴 한데 모르겠다~

+) 추가

다시 git에 연결해서, 다른 계정으로 push 등을 하려고 하는데 permission 에러가 뜬다. 그 전에도 완벽하게 반영은 못 했던게 기억나서 더 알아보니, 항목5의 실사용 전에 git으로 올릴 url을 내가 설정한 github name으로 돌려줘야 했다. 아래 코드 참조

# ~/.ssh/config

# sample (계정1)
Host sample
HostName github.com
user sample
IdenriryFile ~/.ssh/id_rsa_sample

# sample2 (계정2)
Host sample2
HostName github.com
user sample2
IdenriryFile ~/.ssh/id_rsa_sample2

ssh 파일에 위와 같이 등록했을 때, sample2 계정을 통해 최초 push 등을 하고 싶다면

$ ssh -T git@sample2	# ssh 계정 전환
$ git remote get-url origin	# 현재 remote로 등록된 url get
> git@github.com:{username}/{repository-name}	# 위 명령어에 따라 현재 remote url 출력
$ git remote set-url origin git@sample2:{username}/{repository-name} # git@github.com 부분을 git@{Host} 형식으로 변경
$ git remote get-url origin 
> git@sample2:{username}/{repository-name} # set한 url이 정상적으로 적용 됐는지 확인

위와 같이 연결한 remote의 url을 내가 설정한 host name으로 연결해주면 permission 에러 없이 명령어가 실행되는 것을 확인할 수 있다.
아래는 도움받은 블로그 링크

 

개발 환경에서 사용중인 GitHub 계정 변경하는 방법

GitHub 계정을 변경하거나, 특정 저장소에서는 다른 GitHub 계정을 사용하고 싶을 수 있습니다. 이 글에서는 GitHub 계정을 변경할 때 필요한 로컬 개발 환경 설정 방법에 대해 알아봅니다.

www.lainyzine.com

 

끝!

반응형