Git에서 사용할 개인 키 선택


84

2 개의 다른 SSH 키가 필요한 2 개의 Git 서버가 있습니다.

git clone user1@server1:blahblahblah를 사용 ~/.ssh/id_rsa하지만 연결중인 서버에 따라 사용할 키를 지정해야합니다.

이 작업을 수행하는 Git 명령 줄 매개 변수는 무엇입니까? (저는 Linux를 실행하고 있습니다.)


2
이 질문에 대한 답변은 superuser.com/questions/232373/… 입니다.
Daira Hopwood 2013 년


답변:


60

SSH를 통해 연결하는 경우 키는 git 매개 변수가 아닌 SSH 매개 변수에 의해 제어됩니다.

SSH는 ~/.ssh/config파일에서 구성 매개 변수를 찾습니다 . 해당 파일을 수정하고 다음과 같이 두 Git 서버에 대한 IdentityFile 항목을 추가합니다.

Host server1.whatever.com
  IdentityFile /path/to/key_1
Host server2.whatever.com
  IdentityFile /path/to/key_2

이 기사 에는 더 자세한 내용이 있습니다.


13
그것은 질문에 대한 답이 아닙니다. 문제는 ssh가 인증을 처리 할 때 git에이 매개 변수를 어떻게 제공합니까?
keks

@Keks : git 명령 줄을 통해 ssh 인수를 전달할 수 없습니다 . 이 답변은 해결 방법을 제공합니다. 다른 해결 방법도 있습니다 (예 : git.wiki.kernel.org/index.php/…) . 또한 접근 방식은 명령 줄 인수를 사용하여 ssh 동작을 수정하지 않습니다.
Cameron Skinner 2013

12
그것은 사실이지만 귀하의 원래 답변은 질문에 대한 답변이 아닙니다. git을 사용 ssh-agent하고 사용할 수도 있습니다 ssh-add. git이 ssh를 통해 연결되면 키가 이미 활성화되어 있습니다. 여러 가지 방법이 있지만 원래 답변은 실제로 도움이되지 않습니다.
keks

이것은 링크 전용 답변입니다. 답변에서 기사의 관련 부분을 요약 할 수 있습니까?
Flimm

@Flimm : 요약이 추가되었습니다.
Cameron Skinner

105

또 다른 가능성이 있습니다. 설정하는 것입니다 core.sshCommand.

git config --local core.sshCommand "/usr/bin/ssh -i /home/me/.ssh/id_rsa_foo"

당신이 Github에서 여러 계정이 때 모든 계정으로,이다 :이이 전략은 특히 유용합니다 때 하나 개의 특정 시나리오입니다 ssh같은 Github에서에 git@github.com그리고 그것은 사용 ssh당신이있는 Github에서 사용자가 결정하는 키를. 이 경우에도 원하는 것을 하지 .ssh/config않습니다 ssh-agent.

업데이트 — 로컬 저장소가있을 때까지 위를 실행할 수 없으므로 원격 저장소를 복제하려는 경우 drewbie18의 답변에 따라 수동으로 키를 지정해야합니다.

git clone -c core.sshCommand="/usr/bin/ssh -i /home/me/.ssh/id_rsa_foo" git@github.com:me/repo.git

저장소를 복제 한 후에는 git config명령을 사용하여 이를 영구적으로 설정할 수 있습니다 .


8
이것은 선택된 답변이어야합니다. 필요한 구성은 다른 git 서버에 액세스하기 위해 다른 ssh 키를 사용해야하는 저장소에 잘 지역화되어 있습니다. ~ / .ssh / config를 수정할 필요가 없습니다 (GitHub에 여러 계정이있는 경우에는 / etc / hosts까지).
mr.b

1
하지만 한 가지 문제가 있습니다. 구성하기 전에 리포지토리를 복제 할 수 없으며 구성하려면 먼저 복제해야합니다. 또는 git init저장소를 만들고 올바른 ssh 명령을 사용하도록 로컬로 구성한 다음 원격을 추가 할 수 있습니다 ( "git clone"을 사용하는 1 개에 비해 3 단계).
mr.b

3
저장소를 복제하려면 GIT_SSH_COMMAND 환경 변수를 설정하여 아래 @Guss 솔루션을 사용합니다. 그러나 정상적인 사용에서는 새 셸을 시작할 때마다 해당 변수를 다시 내보낼 필요가 없으므로 내 솔루션을 선호합니다.
리처드 스미스

생명의 은인! 많은 사람들이 ./ssh/config를 사용하여 이것을 설정하는 방법을 보여주고 ssh-agent / ssh-add -K for mac을 사용하는 방법을 보여줍니다. 1 년 동안 사용하고 있었지만 갑자기 High Sierra에서 최신 패치로 작동이 중단되었습니다. core.sshCommand는 다른 모든 것이 실패했을 때 작동했습니다. 감사!
Steve

2
이 우아한 솔루션에 감사드립니다. 그러나 core.sshCommand는 git> = 2.10.0
slonepi

32

일반적으로이를 위해 사용 ~/.ssh/config합니다. 다음과 같이 서버 주소를 사용하려는 키와 페어링하기 만하면됩니다.

Host github.com
  IdentityFile ~/.ssh/id_rsa.github
Host heroku.com
  IdentityFile ~/.ssh/id_rsa.heroku
Host *
  IdentityFile ~/.ssh/id_rsa

Host *는 모든 서버를 ~/.ssh/id_rsa나타내므로 사용할 기본 키로 설정 하는 데 사용합니다.


9
이 아이디어는 GitHub와 같은 한 서버에 여러 계정이 있고 각 계정에 대해 다른 개인 키를 원하는 경우에는 작동하지 않습니다.
Flimm

하나 개의 서버에 여러 계정의 경우이 응답 참조 stackoverflow.com/questions/3225862/...을
lexicalscope

23

내 시나리오에서 @Richard Smith 시나리오 (그 솔루션, BTW가 나를 위해 작동하지 않음)와 유사하게 다른 리포지토리에서 동일한 서버에 대해 다른 키를 사용해야합니다.

나를위한 해결 방법은 다음과 같이 환경 변수를 사용하여 세션을 올바르게 설정하는 것입니다 GIT_SSH_COMMAND.

export GIT_SSH_COMMAND="ssh -o IdentitiesOnly=yes -i ~/.ssh/my-secret-identitiy"

업데이트 :

여기서 주목해야 할 또 다른 사항은 환경 변수를 올바르게 설정하는 것이 번거로울 수 있으므로 Liquid Prompt 또는 Fish Shell 과 같은 것에서 제공하는 명령 프롬프트 수정 기능을 사용하여 에 연결하고 환경 변수를 계속 업데이트하고 있습니다. 현재 디렉토리 및 일부 규칙. 예를 들어, Gitlab과 함께 내 개인 SSH 키가 필요한 모든 개인 프로젝트가 아래에 ~/Documents/Projects/personal있으므로 셸 후크가 실행 pwd되고 현재 디렉터리가 해당 경로 아래에 있음을 발견하면 GIT_SSH_COMMAND필요에 따라 자동으로 변수를 설정 합니다.


15

사용 ssh-add path-to-private-key이 상자 밖으로 작동합니다.


5
두 개의 배포 키가 있고 특정 저장소에서만 작동하는 경우에는 그렇지 않습니다. 이 경우 잘못된 키를 사용하여 액세스 권한이 없다고 말할 수 있습니다.
cdmckay

나는 문제가 있다고 cdmckay가 말했다
Suge

7

--global 또는 --local 구성을 설정할 수 있습니다. global은 ~/.gitconfig파일 을 업데이트 하고 local은 저장소의 구성을 업데이트 .git/config하고 전역 (~ / .gitconfig) 구성을 재정의합니다.

git config --local --add core.sshCommand 'ssh -i ~ / .ssh / my_key'


2
매력으로 작동했습니다. 이것은 정확히 제가 필요로하는 특정 저장소에 대한 솔루션이었습니다.
Quaestor Lucem 19-06-23

6

여기 Windows 사용자, 방금이 문제가 발생하여 지금까지 읽은 것과 약간 다른 해결책이 있습니다. 내가 직면 한 문제는 특정 개인 ssh 키를 사용하여 단순히 저장소를 복제하고 PowerShell에서 작업하는 것처럼 git 구성을 전역 적으로 구성하거나 특정 git bash 설정을 추가 할 필요가 없다는 것입니다. 기본적으로 .ssh 폴더에 개인 키를 몇 개 넣고 필요에 따라 특정 저장소에서 참조합니다.

이를 위해 다음 명령이 작동합니다.

git clone -c core.sshCommand="ssh -i ~/.ssh/<PRIVATE KEY NAME>" <CLONE URL>

본질적으로 이것이하는 일은 git repo를 초기화 할 때 복제를 실행하기 전에 core.sshCommand 옵션을 설정하는 것입니다. 따라서이 저장소에 사용하려는 특정 ssh 키는이 저장소에만 설정됩니다. 이것은 모든 경우에 이상적인 솔루션은 아니지만 내가 원하는 것은 아닙니다.


감사합니다. 에 대한 -c옵션을 몰랐 습니다 git clone. 복제 할 때 제안한대로 환경을 설정하는 것보다 낫습니다.
리처드 스미스

1

다른 답변은 명령 줄 옵션 또는 (존재하는 경우) git remote -v 값에 따라 ssh 키를 선택하는 작은 스크립트를 작성하도록 영감을주었습니다. 도움이 되었기를 바랍니다.

실제로 질문에 답하려면 : gat를 사용하십시오.

참조 https://bitbucket.org/eikerobert/gat/src/master/

#!/bin/bash

usegat=false

for VAR in "$@"
do
    if [ "$VAR" != "${VAR/git@bitbucket.org:myaccount/}" ]; then
        usegat=true
    fi
done

if [ $usegat=false ]; then
   /usr/bin/git rev-parse --is-inside-work-tree >/dev/null 2>&1
   isinsidegitrepo=$?
    #echo $isinsidegitrepo
   if [ $isinsidegitrepo = 0 ]; then
       remote=`/usr/bin/git remote -v`
       if [ "$remote" != "${remote/git@bitbucket.org:myaccount/}" ]; then
           usegat=true
       fi
   fi
fi


if [ $usegat = true ]; then
    # echo "TRUE"
    /usr/bin/git -c core.sshCommand="/usr/bin/ssh -i /home/myaccount/.ssh/mykey" "$@"
else
     #echo "FALSE"
    /usr/bin/git "$@"
fi

1

또 다른 옵션은 core.sshCommand좀 더 스마트 하게 만들기 위해 작은 스크립트를 작성 하는 것입니다. 현재 작업 디렉토리에 특정 SSH 키가 구성되어 있는지 확인하고, 그렇다면이를 사용하고, 그렇지 않으면 표준 SSH 키 확인에 의존합니다.

내 첫 번째 버전은 다음과 같습니다.

#!/bin/bash
key="$(git config ssh.key)"
if [ -n "$key" ]; then
        ssh -o IdentitiesOnly=yes -i "$key" "$@"
else
        ssh "$@"
fi

그런 다음 전역 git SSH 명령 으로 설정합니다 .

chmod 755 ~/.local/bin/git-ssh-command
git config --global core.sshCommand ~/.local/bin/git-ssh-command

( SystemD 운영 체제에서 "여기에 사용자 스크립트 배치"에~/.local/bin 대한 현재 표준입니다. )

이를 설정 한 후 구성 옵션을 설정하여 특정 SSH 키를 사용하도록 저장소를 구성 할 수 있습니다 ssh.key.

git config --local ssh.key ~/.ssh/my-non-default-private-key

추가 옵션 트릭

  • ssh.key"기본이 아닌 SSH 키로의 기본 폴백"등을 갖도록 전역 을 설정하십시오 .
  • git core.sshCommand이 저장소의 루트 디렉토리에서 실행 되므로 사용자 정의 git-ssh-command는이를보고 디렉토리 이름에 대한 몇 가지 휴리스틱 스를 가질 수 있습니다. 이것은 else섹션 에서 수행 할 수 있으므로 휴리스틱은에 특정 키가없는 경우에만 시작됩니다 ssh.key.
  • git remote -vEike의 스크립트에서와 같이 리모컨을 기반으로 휴리스틱을 추가하기 위해 체크를 추가 할 수 있습니다.
  • 리포지토리 리모트를보고 싶지만 다른 키가 필요한 리모트가 여러 개인 remote="$1:$(sed "s,.* ,,;s,',,g"<<<"$2")"경우 스크립트 시작 부분에 추가 하여 작동중인 리모트를 해결하고이를 확인할 수 있습니다 ( 출력 $remote의 중간 열처럼 git remote -v표시됨).

최신 정보:

다음은 원격 URL을보고 몇 가지 휴리스틱을 수행하는 사용자 지정 SSH 명령의 버전입니다. 제 경우에는 동일한 공용 git 호스팅 서비스 (업무용, 개인용 등)를 사용하는 여러 다른 ID가 있으며 선택할 수 있습니다. 원격 URL을보고 올바른 ID를 확인합니다 (Gitlab 그룹 또는 Github 조직 검사 등).

#!/bin/bash
if [[ "$2" =~ ^git-lfs-authenticate.* ]]; then # reconstruct url for git-lfs
        remote="$1:$(awk '{print$2}'<<<"$2")"
else # reconstruct url for standard git commands
        remote="$1:$(sed "s,.* ,,;s,',,g"<<<"$2")"
fi
#echo "Detected $remote from $@" >&2 # optional debug log
key="$(git config ssh.key)"
if [ -n "$key" ]; then # use specified SSH key, if set
        ssh -o IdentitiesOnly=yes -i "$key" "$@"
elif [[ "$remote" == git@gitlab.com:my-company* ]]; then # use company id
        ssh -o IdentitiesOnly=yes -i ~/.ssh/company-id "$@"
elif [[ "$remote" =~ git@bitbucket.org:.*other-org.* ]]; then # bitbucket has weird urls
        ssh -o IdentitiesOnly=yes -i ~/.ssh/custom-org-key "$@"
else # otherwise use whatever the agent has (my personal key)
        ssh "$@"
fi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.