주어진 도메인의 git push에 SSH 키를 지정하십시오.


342

다음과 같은 유스 케이스가 있습니다. git@git.company.com:gitolite-adminuser의 개인 키 gitolite-admingit@git.company.com:some_repo사용 하도록 푸시하고 '나만의'개인 키 를 사용하여 푸시하고 싶습니다 . AFAIK, 나는 ~/.ssh/config사용자 이름과 서버 이름이 두 경우 모두 동일 하기 때문에을 사용하여 이것을 해결할 수 없습니다 . 주로 개인 키를 사용하므로에 ~/.ssh/config대해 정의한 키가 있습니다 git@git.company.com. 누구나 단일 git호출에 사용되는 키를 재정의하는 방법을 알고 있습니까?

(외부 : gitolite는 키를 기반으로 푸시를 수행하는 사람을 구별하므로 액세스, 소유권 및 감사 측면에서 user @ server 문자열이 다른 사용자에게 동일하다는 것은 문제가되지 않습니다.)


답변:


597

사용자와 호스트가 동일하더라도에서 구별 할 수 있습니다 ~/.ssh/config. 예를 들어 구성이 다음과 같은 경우

Host gitolite-as-alice
  HostName git.company.com
  User git
  IdentityFile /home/whoever/.ssh/id_rsa.alice
  IdentitiesOnly yes

Host gitolite-as-bob
  HostName git.company.com
  User git
  IdentityFile /home/whoever/.ssh/id_dsa.bob
  IdentitiesOnly yes

그런 다음 URL에서 호스트 이름 대신 gitolite-as-alice및을 gitolite-as-bob사용하십시오.

git remote add alice git@gitolite-as-alice:whatever.git
git remote add bob git@gitolite-as-bob:whatever.git

노트

IdentitiesOnly yes기본 ID를 사용하지 못하게하는 옵션을 포함하려고합니다 . 그렇지 않으면, 기본 이름과 일치하는 id 파일이있는 경우 다른 구성 옵션 ( "first in wins"를 따름)과 달리 IdentityFile옵션 이 시도 할 ID 목록에 추가 되기 때문에 먼저 시도됩니다. 참조 : /server/450796/how-could-i-stop-ssh-offering-a-wrong-key/450807#450807


9
정말 고마워 ~ / .ssh / config
Confusion

4
이 답변에 감사드립니다! 나를위한 하나의 문제는 IdentityFile이 전체 경로 여야한다는 것입니다 (IdIrs에 대한 인수로 id_rsa.rick 만 넣었으므로 실패했습니다). IdentityFile에 대한 다른 구문은 ssh_config (5) 매뉴얼 페이지를 참조하십시오.
rickumali

1
명확하고 매우 유용한 답변을 주셔서 대단히 감사합니다. 나는이 작업을 잠시 동안 시도했지만 동일한 사용자가 동일한 id_rsa 개인 키 파일을 사용해야한다는 가정으로 포기했습니다.
DrCord

7
git@그것이 주어진 바와 같이 원격의 부분이 필요하지 않다 User는 config 라인.
고인돌

2
호스트에 대한 IdentitiesOnly yes줄 바로 뒤에 포함 된 다른 줄을 추가 할 때 까지이 솔루션으로 고심하고있었습니다 IdentityFile. 여러 ID를 통과 한 것으로 보이며 그 중 하나가 호스트에 액세스 할 수 없도록 차단되었습니다.
Fitter Man

57

받는 다른 방법 마크 Longair 이상 제공 한 실행 별칭 사용하는 것입니다 어떤 에, 자식 명령을 어떤 다른 SSH 키, 원격. 아이디어는 기본적으로 git 명령을 실행할 때 SSH ID를 전환하는 것입니다.

다른 답변의 호스트 별칭 접근 방식과 관련된 장점 :

  • 함께 작동합니다 어떤 사용자가 지정할 수없는 경우에도, 자식 명령이나 별칭을 remote명시 적으로.
  • 각 리포지토리마다 리포지토리 당 한 번이 아니라 클라이언트 시스템 당 한 번만 설정하면되므로 여러 리포지토리에서보다 쉽게 ​​작업 할 수 있습니다.

나는 작은 스크립트와 자식 별칭을 사용 admin합니다. 예를 들어 내가 할 수있는 방법 :

git admin push 

대체 ( "admin") SSH 키를 사용하여 기본 원격으로 푸시합니다. 다시이 push별칭과 함께 모든 명령을 사용할 수 있습니다 . git admin clone ..."관리자"키만 사용하여 액세스 할 수있는 저장소를 복제 할 수도 있습니다.

1 단계 : 다른 SSH 키를 생성하고 다른 사람의 컴퓨터에서이 작업을 수행 할 경우 암호를 선택적으로 설정합니다.

2 단계 : SSH를 사용하지만 기본값이 아닌 지정된 SSH 키를 사용하는 항목을 실행하는 "ssh-as.sh"라는 스크립트를 만듭니다.

#!/bin/bash
exec ssh ${SSH_KEYFILE+-i "$SSH_KEYFILE"} "$@"

3 단계 : 제공된 SSH 키를 사용하여 git 명령을 실행하는“git-as.sh”라는 스크립트를 만듭니다.

#!/bin/bash
SSH_KEYFILE=$1 GIT_SSH=${BASH_SOURCE%/*}/ssh-as.sh exec git "${@:2}"

4 단계 : 별칭을 추가합니다 (아래 "PATH_TO_SCRIPTS_DIR"에 적절한 것을 사용).

# Run git commands as the SSH identity provided by the keyfile ~/.ssh/admin
git config --global alias.admin \!"PATH_TO_SCRIPTS_DIR/git-as.sh ~/.ssh/admin"

자세한 내용은 http://noamlewis.wordpress.com/2013/01/24/git-admin-an-alias-for-running-git-commands-as-a-privileged-ssh-identity/


4
아주 좋은 대답입니다. 큰 따옴표를 추가하는 것을 잊지 마세요 $@-> "$@"안전합니다.
kevinarpe

@sinelaw 이것이 여전히 작동합니까? 내가 권한 오류를 항상 거부 얻을
알록 쿠마르

56

git environment variable을 활용할 수 있습니다 GIT_SSH_COMMAND. 터미널에서 git 저장소 아래에서 이것을 실행하십시오 :

GIT_SSH_COMMAND='ssh -i ~/.ssh/your_private_key' git submodule update --init

교체 ~/.ssh/your_private_key사용 싶어 SSH 개인 키의 경로. 그리고 당신은 (예에 후속 자식 명령을 변경할 수 있습니다 git submodule update --init다른 사람 등에) git pull,git fetch


1
전체 문서는 git-scm.com/docs/git#git-codeGITSSHcode에 있습니다 . 그것은 필요 recentish 하지만 힘내 (> = 2.3. *).
Christian Ulbrich

2
하나의 환경 변수를 설정하는 것 외에는 아무것도 필요없는 간단한 솔루션에 감사드립니다.
노아 서스 먼

4
~ / .ssh / id_rsa (또는 기본 키가 무엇이든)는 -i를 통해 전달한 것보다 우선합니다. 당신이 정말로 GIT_SSH_COMMAND를 사용하려면 그래서 = '는 ssh -i ~ / 스푸핑 / your_private_key -o IdentitiesOnly = 예'가 다른 키를 무시하도록합니다
staktrace을

git push를 어떻게 업데이트 할 수 있습니까? 문서에서 찾을 수 없습니다
lebed2045

sinelaw의 답변과 비슷하지만 어딘가에 스크립트를 작성하는 대신이 방법을 사용하여 bash 또는 git 별명을 작성하는 것이 좋습니다.
Inigo

14

하나의 Unix 기반 시스템 (Linux, BSD, Mac OS X)에서 기본 아이디는 $ HOME / .ssh 디렉토리 에 2 개의 파일로 저장됩니다. 옵션없이 private key: $HOME/.ssh/id_rsa public key: $HOME/.ssh/id_rsa.pub 사용하는 ssh경우-i , 그것은 원격 시스템을 인증 할 수있는 기본 개인 키를 사용합니다.

사용하려는 다른 개인 키 (예 : $ HOME / .ssh / deploy_key )가있는 경우 사용해야합니다ssh -i ~/.ssh/deploy_key ...

성가시다. $ HOME / .bash_profile 에 다음 행을 추가 할 수 있습니다 . ssh-add ~/.ssh/deploy_key ssh-add ~/.ssh/id_rsa

당신이 사용할 때마다 그래서 sshgit또는 scp(기본적으로 ssh너무), 당신은 옵션을 사용할 필요가 없습니다-i 더 이상.

$ HOME / .bash_profile 파일에서 원하는만큼 키를 추가 할 수 있습니다 .


10

또 다른 대안은 ssh-ident를 사용하여 ssh ID를 관리하는 것 입니다.

현재 작업 디렉토리, ssh 옵션 등에 따라 다른 키를 자동으로로드하고 사용합니다. 즉, ssh를 사용하여 다른 키와 ID를 사용하여 투명하게 끝나는 작업 / 디렉토리 및 개인 / 디렉토리를 쉽게 가질 수 있습니다.


9

Win7에서 Git Bash를 사용하고 있습니다. 다음은 나를 위해 일했습니다.

~ / .ssh / config 또는 c : / users / [your_user_name] /. ssh / config에서 구성 파일을 작성하십시오. 파일에 다음을 입력하십시오.

Host your_host.com
     IdentityFile [absolute_path_to_your_.ssh]\id_rsa

호스트는 "이름"또는 호스트에 대한 참조가 아니라 URL이어야한다고 생각합니다. 예를 들어

Host github.com
     IdentityFile c:/users/[user_name]/.ssh/id_rsa

경로는 / c / users / [user_name] / ...로도 쓸 수 있습니다.

Giordano Scalzo가 제공하는 솔루션도 훌륭합니다. https://stackoverflow.com/a/9149518/1738546


9

git 2.10부터 gitconfig sshCommand 설정을 사용할 수도 있습니다. 문서 상태 :

이 변수가 설정되면 git fetch 및 git push는 원격 시스템에 연결해야 할 때 ssh 대신 지정된 명령을 사용합니다. 명령은 GIT_SSH_COMMAND 환경 변수와 동일한 형식이며 환경 변수가 설정되면 대체됩니다.

사용 예는 다음과 같습니다. git config core.sshCommand "ssh -i ~/.ssh/[insert_your_keyname]

ssh_config가 명령을 재정의하기 때문에 일부 경우에는 작동하지 않습니다.이 경우 ssh -i ~/.ssh/[insert_your_keyname] -F /dev/nullssh_config를 사용하지 마십시오.


8

몇 가지 기술을 결합한 다른 답변을 읽은 결과를 바탕으로 github을 사용하여 다음과 같은 접근 방식을 테스트했습니다.

  • 올바른 SSH 구성
  • 자식 URL 재 작성

이 접근 방식의 장점은 일단 설정 한 후에는 올바른 작업을 위해 추가 작업이 필요하지 않다는 것입니다. 예를 들어 원격 URL을 변경하거나 사물을 다르게 복제 할 필요가 없습니다. URL 재 작성은 모든 작업을 수행합니다. .

~/.ssh/config

# Personal GitHub
Host github.com
  HostName github.com
  User git
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/github_id_rsa

# Work GitHub
Host github-work
  HostName github.com
  User git
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/work_github_id_rsa

Host *
  IdentitiesOnly yes

~/.gitconfig

[user]
    name = My Name
    email = personal@personal.email

[includeIf "gitdir:~/dev/work/"]
    path = ~/dev/work/.gitconfig

[url "github-work:work-github-org/"]
    insteadOf = git@github.com:work-github-org/

~/dev/work/.gitconfig

[user]
    email = work@work.email

모든 작업 저장소를 ~ / dev / work 및 다른 곳에 보관하는 한 git은 서버에 가져 오기 / 복제 / 푸시를 수행 할 때 올바른 SSH 키를 사용하며 모든 전자 메일 주소에 올바른 전자 메일 주소를 첨부합니다. 당신의 커밋.

참고 문헌 :


복제와 어떻게 작동합니까? 내가 생각한 디렉토리 includeIf가있는 경우에만 작동해야 .git합니까?
detly

잠깐만, 그것을 처리하는 URL 다시 작성입니다. 이 답변은 매우 유용합니다!
detly

4

Windows에서 Git 버전의 ssh를 사용하는 경우 ssh 구성의 ID 파일 행은 다음과 같습니다.

IdentityFile /c/Users/Whoever/.ssh/id_rsa.alice

어디 /c있어c:

확인하려면 git 's bash에서

cd ~/.ssh
pwd 

3

기본 호스트 구성을 제거하거나 주석 처리해야 할 수도 있습니다. .ssh / config


1

파일 구성 키 ssh에서 가장 많이 지정했습니다.

# Default GitHub user
Host one
 HostName gitlab.com
 User git
 PreferredAuthentications publickey
 IdentityFile ~/.ssh/key-one
 IdentitiesOnly yes

#two user
Host two
 HostName gitlab.com
 User git
 PreferredAuthentications publickey
 IdentityFile ~/.ssh/key-two
 IdentitiesOnly yes

0

다른 사람이 언급했듯이 core.sshCommandconfig를 사용하여 SSH 키 및 기타 매개 변수를 무시할 수 있습니다.

여기에 이름이 바뀐 대체 키가 ~/.ssh/workrsa있고 아래에 복제 된 모든 리포지토리에 사용하려는 예가 있습니다 ~/work.

  1. .gitconfig아래에 새 파일을 작성하십시오 ~/work.
[core]
  sshCommand = "ssh -i ~/.ssh/workrsa"
  1. 전역 git 설정 ~/.gitconfig에서 다음을 추가하십시오.
[includeIf "gitdir:~/work/"]
  path = ~/work/.gitconfig

0

사용하는 한 가지 가능성 ~/.ssh/configMatch제한 대신 제한 을 사용하는 것입니다 Host. 특히 Match Exec선언을 적용할지 여부를 결정하기 위해 쉘 명령을 호출합니다. bash에서는 다음 명령을 사용할 수 있습니다.

[ git@git.company.com:gitolite-admin = $(git config --get remote.origin.url)'' ]

bash [명령을 사용하여 두 문자열이 같은지 확인합니다. 이 경우 문자열 git@git.company.com:gitolite-admin$(git config --get remote.origin.url)''명령 에서 얻은 출력과 일치 하는지 테스트합니다 .

쉘이있는 저장소를 식별하는 다른 명령을 사용할 수 있습니다. 이것이 작동 하려면 변수를 쉘에 정의 하는 것이 중요 합니다 . 전체 예는 다음과 같습니다 .$SHELL/bin/bash~/.ssh/config

Match Exec "[ git@git.company.com:gitolite-admin = $(git config --get remote.origin.url)'' ]"
  IdentityFile ~/.ssh/gitolite-admin
  IdentitiesOnly yes
  ForwardAgent no
  ForwardX11 no
  ForwardX11Trusted no

Match Exec "[ git@git.company.com:some_repo = $(git config --get remote.origin.url)'' ]"
  IdentityFile ~/.ssh/yourOwnPrivateKey
  IdentitiesOnly yes
  ForwardAgent no
  ForwardX11 no
  ForwardX11Trusted no

이 예에서 나는 그 가정 ~/.ssh/yourOwnPrivateKey자신의 개인 키를 포함하고 그 ~/.ssh/gitolite-admin사용자의 개인 키를 포함 gitolite-admin. IdentitiesOnly yesgit 서버에 하나의 키 만 제공되도록 선언을 포함 시켰습니다.Mark Longair가 . 다른 선언은 git의 표준 ssh 옵션입니다.

some_repo다른 키와 함께 여러 가지를 사용하려는 경우이 구성을 추가 할 수 있습니다 . 여러 저장소가 git@git.company.com있고 대부분의 저장소를 사용하는 ~/.ssh/yourOwnPrivateKey경우이 키를 호스트의 기본값으로 포함시키는 것이 더 합리적입니다. 이 경우 다음과 ~/.ssh/config같습니다.

Match Exec "[ git@git.company.com:gitolite-admin = $(git config --get remote.origin.url)'' ]"
  IdentityFile ~/.ssh/gitolite-admin
  IdentitiesOnly yes

Host git.company.com
  IdentityFile ~/.ssh/yourOwnPrivateKey
  IdentitiesOnly yes
  ForwardAgent no
  ForwardX11 no
  ForwardX11Trusted no

순서가 중요하고 Host git.company.com제한이 Match Exec하나 또는 그 뒤에 나타나야 합니다.


0

를 사용하여 리포지토리를 구성하십시오 git config. 예를 들면 다음과 같습니다.

git config --add --local core.sshCommand 'ssh -i ~/.ssh/<<<PATH_TO_SSH_KEY>>>'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.