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


342

다음과 같은 유스 케이스가 있습니다. git@git.company.com:gitolite-adminuser의 개인 키 gitolite-admin를 git@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

당신이 사용할 때마다 그래서 ssh나 git또는 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/config은 Match제한 대신 제한 을 사용하는 것입니다 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.