2 개의 다른 SSH 키가 필요한 2 개의 Git 서버가 있습니다.
git clone user1@server1:blahblahblah
를 사용 ~/.ssh/id_rsa
하지만 연결중인 서버에 따라 사용할 키를 지정해야합니다.
이 작업을 수행하는 Git 명령 줄 매개 변수는 무엇입니까? (저는 Linux를 실행하고 있습니다.)
2 개의 다른 SSH 키가 필요한 2 개의 Git 서버가 있습니다.
git clone user1@server1:blahblahblah
를 사용 ~/.ssh/id_rsa
하지만 연결중인 서버에 따라 사용할 키를 지정해야합니다.
이 작업을 수행하는 Git 명령 줄 매개 변수는 무엇입니까? (저는 Linux를 실행하고 있습니다.)
답변:
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
이 기사 에는 더 자세한 내용이 있습니다.
ssh-agent
하고 사용할 수도 있습니다 ssh-add
. git이 ssh를 통해 연결되면 키가 이미 활성화되어 있습니다. 여러 가지 방법이 있지만 원래 답변은 실제로 도움이되지 않습니다.
또 다른 가능성이 있습니다. 설정하는 것입니다 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
명령을 사용하여 이를 영구적으로 설정할 수 있습니다 .
git init
저장소를 만들고 올바른 ssh 명령을 사용하도록 로컬로 구성한 다음 원격을 추가 할 수 있습니다 ( "git clone"을 사용하는 1 개에 비해 3 단계).
일반적으로이를 위해 사용 ~/.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
나타내므로 사용할 기본 키로 설정 하는 데 사용합니다.
내 시나리오에서 @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
필요에 따라 자동으로 변수를 설정 합니다.
--global 또는 --local 구성을 설정할 수 있습니다. global은 ~/.gitconfig
파일 을 업데이트 하고 local은 저장소의 구성을 업데이트 .git/config
하고 전역 (~ / .gitconfig) 구성을 재정의합니다.
git config --local --add core.sshCommand 'ssh -i ~ / .ssh / my_key'
여기 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
. 복제 할 때 제안한대로 환경을 설정하는 것보다 낫습니다.
다른 답변은 명령 줄 옵션 또는 (존재하는 경우) 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
또 다른 옵션은 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 키로의 기본 폴백"등을 갖도록 전역 을 설정하십시오 .core.sshCommand
이 저장소의 루트 디렉토리에서 실행 되므로 사용자 정의 git-ssh-command
는이를보고 디렉토리 이름에 대한 몇 가지 휴리스틱 스를 가질 수 있습니다. 이것은 else
섹션 에서 수행 할 수 있으므로 휴리스틱은에 특정 키가없는 경우에만 시작됩니다 ssh.key
.git remote -v
Eike의 스크립트에서와 같이 리모컨을 기반으로 휴리스틱을 추가하기 위해 체크를 추가 할 수 있습니다.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