질문자 :Christoffer
다소 특이한 상황이지만 로컬 컴퓨터에서 git
) 명령을 실행할 때 사용할 개인 SSH 키를 지정하고 싶습니다.
기본적으로 다음과 같습니다.
git clone git@github.com:TheUser/TheProject.git -key "/home/christoffer/ssh_keys/theuser"
또는 더 나은(Ruby에서):
with_key("/home/christoffer/ssh_keys/theuser") do sh("git clone git@github.com:TheUser/TheProject.git") end
지정된 개인 키를 사용하는 Net::SSH
로 원격 서버에 연결하는 예를 보았지만 이것은 로컬 명령입니다. 가능합니까?
이러한 솔루션 중 어느 것도 나를 위해 일하지 않았습니다.
대신 SSH에 config
파일 설정에 대한 @Martin v. Löwis의 언급에 대해 자세히 설명합니다.
SSH는 사용자의 ~/.ssh/config
파일을 찾습니다. 내 설정은 다음과 같습니다.
Host gitserv Hostname remote.server.com IdentityFile ~/.ssh/id_rsa.github IdentitiesOnly yes # see NOTES below
그리고 원격 git 저장소를 추가합니다.
git remote add origin git@gitserv:myrepo.git
그런 다음 git 명령이 정상적으로 작동합니다.
git push -v origin master
노트
- 각 프로토콜의 기본 파일 이름과 일치하는 ID 파일을 보내는 SSH 기본 동작
IdentitiesOnly yes
가 필요합니다. 당신은라는 이름의 파일이있는 경우 ~/.ssh/id_rsa
당신의 전에 시도 얻을 것이다 ~/.ssh/id_rsa.github
없이이 옵션을 선택합니다.
참고문헌
HeyWatchThis다음과 같은 것이 작동해야 합니다(orip에서 제안).
ssh-agent bash -c 'ssh-add /somewhere/yourkey; git clone git@github.com:user/project.git'
하위 쉘을 선호하는 경우 다음을 시도할 수 있습니다(더 취약하지만).
ssh-agent $(ssh-add /somewhere/yourkey; git clone git@github.com:user/project.git)
Git은 환경 변수로 에이전트를 찾는 SSH를 호출합니다. 그러면 키가 로드됩니다.
.ssh
디렉토리만 포함된 디렉토리를 HOME
HOME
설정하는 것도 트릭을 수행할 수 있습니다. 이것은 identity.pub 또는 구성 파일 설정 IdentityFile을 포함할 수 있습니다.
Martin v. LöwisGit 2.3.0부터는 간단한 명령도 있습니다(구성 파일 필요 없음).
GIT_SSH_COMMAND='ssh -i private_key_file -o IdentitiesOnly=yes' git clone user@host:repo.git
-o IdentitiesOnly=yes
는 위의 답변에서 설명한 대로 각 프로토콜의 기본 파일 이름과 일치하는 ID 파일을 보내는 SSH 기본 동작을 방지하는 데 필요합니다.
Robert Jack Will~/.ssh/config
에 대한 다른 사람들의 제안은 매우 복잡합니다. 다음과 같이 간단할 수 있습니다.
Host github.com IdentityFile ~/.ssh/github_rsa
philfreogit 2.10+(2016년 3분기: 2016년 9월 2일 출시)를 사용하면 GIT_SSH_COMMAND에 대한 구성 을 GIT_SSH_COMMAND
(Rober Jack Will 의 답변에 설명된 환경 변수 뿐만 아니라).
Nguyễn Thái Ngọc Duy( pclouds
)의 commit 3c8ede3 (2016년 6월 26일)을 참조하십시오.
(2016년 7월 19일 dc21164 커밋 에서 Junio C gitster
-- gitster -- 병합)
저장소당 사용할 GIT_SSH_COMMAND
값을 지정하기 위해 새로운 구성 변수 core.sshCommand
core.sshCommand:
이 변수가 설정되면 git fetch
및 git push
는 원격 시스템에 연결해야 할 때 ssh
대신 지정된 명령을 사용합니다.
명령은 GIT_SSH_COMMAND
환경 변수와 동일한 형식이며 환경 변수가 설정되면 재정의됩니다.
git pull
이 다음과 같을 수 있음을 의미합니다.
cd /path/to/my/repo/already/cloned git config core.sshCommand 'ssh -i private_key_file' # later on git pull
git clone
과 같은 명령 하나만으로 설정할 수도 있습니다.
git -c core.sshCommand="ssh -i private_key_file" clone host:repo.git
이것은 Windows에서 Mátyás Kuti-Kreszács가 언급 한 GIT_SSH_COMMAND
환경 변수를 설정하는 것보다 쉽습니다.
set "GIT_SSH_COMMAND=ssh -i private_key_file"
VonCmy_git_ssh_wrapper의 내용:
#!/bin/bash ssh -i /path/to/ssh/secret/key $1 $2
그런 다음 다음을 수행하여 키를 사용할 수 있습니다.
GIT_SSH=my_git_ssh_wrapper git clone git@github.com:TheUser/TheProject.git
Joe Block답변과 의견 을 요약하자면, 다른 키 파일을 사용하도록 git을 설정하고 잊어버리는 가장 좋은 방법은 Windows에서 작동하는 동일한 호스트(예: 개인 GitHub 계정 및 직장 계정)에 대해 다른 사용자도 지원합니다. 또한 ~/.ssh/config
(또는 c:\Users\<your user>\.ssh\config
)를 편집하고 여러 ID를 지정하는 것입니다.
Host github.com HostName github.com IdentityFile /path/to/your/personal/github/private/key User dandv Host github-work HostName github.com IdentityFile /path/to/your/work/github/private/key User workuser
그런 다음 프로젝트를 개인 사용자로 git clone
명령을 실행하기만 하면 됩니다.
workuser
로 복제하려면 git clone git@github-work:company/project.git
합니다.
Dan Dascalescu여기에 명시된 대로: https://superuser.com/a/912281/607049
리포지토리별로 구성할 수 있습니다.
git config core.sshCommand "ssh -i ~/.ssh/id_rsa_example -F /dev/null" git pull git push
David문제는 동일한 호스트(예: github.com)에 다른 원격 저장소가 있고 다른 ssh 키 (즉, 다른 GitHub 계정)를 사용하여 이들과 상호 작용하려는 경우입니다.
그렇게 하려면:
~/.ssh/config
파일에 다른 키를 선언해야 합니다.
# Key for usual repositories on github.com Host github.com HostName github.com User git IdentityFile ~/.ssh/id_rsa # Key for a particular repository on github.com Host XXX HostName github.com User git IdentityFile ~/.ssh/id_other_rsa
이렇게 하면 두 번째 키를 github.com의 새로운 친숙한 이름 "XXX"와 연결합니다.
그런 다음 방금 정의한 친숙한 이름을 사용하도록 특정 리포지토리의 원격 원본을 변경해야 합니다.
명령 프롬프트 내에서 로컬 저장소 폴더로 이동하여 현재 원격 원본을 표시합니다.
>git remote -v origin git@github.com:myuser/myrepo.git (fetch) origin git@github.com:myuser/myrepo.git (push)
그런 다음 다음을 사용하여 원점을 변경합니다.
>git remote set-url origin git@XXX:myuser/myrepo.git >git remote -v origin git@XXX:myuser/myrepo.git (fetch) origin git@XXX:myuser/myrepo.git (push)
이제 올바른 키를 사용하여 자동으로 푸시, 가져오기를 수행할 수 있습니다.
rodzmkiiGIT_SSH_COMMAND="ssh -i /path/to/git-private-access-key" git clone $git_repo
또는
export GIT_SSH_COMMAND="ssh -i /path/to/git-private-access-key" git clone REPO git push
carlsborg다음과 같이 해당 호스트 또는 IP를 .ssh/config
Host (a space separated list of made up aliases you want to use for the host) User git Hostname (ip or hostname of git server) PreferredAuthentications publickey IdentityFile ~/.ssh/id_rsa_(the key you want for this repo)
thamster나는 GIT_SSH 환경 변수와 함께 갔다. 다음은 위의 Joe Block의 래퍼와 유사하지만 모든 양의 인수를 처리하는 래퍼입니다.
파일 ~/gitwrap.sh
#!/bin/bash ssh -i ~/.ssh/gitkey_rsa "$@"
그런 다음 내 .bashrc에 다음을 추가합니다.
export GIT_SSH=~/gitwrap.sh
JamieGit 버전 2.10.0부터 저장소별로 또는 전역적으로 구성할 수 있습니다.
git config core.sshCommand "ssh -i ~/.ssh/id_rsa_example -o 'IdentitiesOnly yes'"
이것은 ssh 키가 사용할 현재 저장소를 지정합니다. 이 전역을 지정하려면 --global
옵션만 설정하면 됩니다.
ciego여기에 있는 다른 솔루션이 효과가 없고 여러 ssh 키를 생성했지만 여전히 다음과 같은 간단한 작업을 수행할 수 없는 경우
git pull
그런 다음 두 개의 ssh 키 파일이 있다고 가정합니다.
id_rsa id_rsa_other_key
그런 다음 git repo 내부에서 다음을 시도하십시오.
# Run these commands INSIDE your git directory eval `ssh-agent -s` ssh-add ~/.ssh/id_rsa ssh-add ~/.ssh/id_rsa_other_key
또한 다음을 통해 github 기본 사용자 이름과 사용자 ID가 올바른지 확인하십시오.
# Run these commands INSIDE your git directory git config user.name "Mona Lisa" git config user.email "mona.lisa@email.com"
자세한 내용은 https://gist.github.com/jexchan/2351996 을 참조하십시오.
cgnorthcuttgit pull origin master
)으로 github에 연결해야 할 때 ~/.ssh/config
에서 *
로 호스트를 설정하면 다른 호스트(예: "github" 또는 "gb")가 작동하지 않습니다. 일.
Host * User git Hostname github.com PreferredAuthentications publickey IdentityFile ~/.ssh/id_rsa_xxx
chopstik이러한 솔루션 중 많은 부분이 매력적으로 보였습니다. 그러나 다음 링크에서 일반적인 git-wrapping-script 접근 방식이 가장 유용하다는 것을 알았습니다.
git
명령으로 ssh 키 파일을 지정하는 방법
요점은 다음과 같은 git
명령이 없다는 것입니다.
git -i ~/.ssh/thatuserkey.pem clone thatuser@myserver.com:/git/repo.git
Alvin의 솔루션은 이 간격을 채우는 잘 정의된 bash-wrapper 스크립트를 사용하는 것입니다.
git.sh -i ~/.ssh/thatuserkey.pem clone thatuser@myserver.com:/git/repo.git
git.sh
는 다음과 같습니다.
#!/bin/bash # The MIT License (MIT) # Copyright (c) 2013 Alvin Abad # https://alvinabad.wordpress.com/2013/03/23/how-to-specify-an-ssh-key-file-with-the-git-command if [ $# -eq 0 ]; then echo "Git wrapper script that can specify an ssh-key file Usage: git.sh -i ssh-key-file git-command " exit 1 fi # remove temporary file on exit trap 'rm -f /tmp/.git_ssh.$$' 0 if [ "$1" = "-i" ]; then SSH_KEY=$2; shift; shift echo "ssh -i $SSH_KEY \$@" > /tmp/.git_ssh.$$ chmod +x /tmp/.git_ssh.$$ export GIT_SSH=/tmp/.git_ssh.$$ fi # in case the git command is repeated [ "$1" = "git" ] && shift # Run the git command git "$@"
git remote update
, git pull
및 git clone
을 사용하여 원격 bitbucket 리포지토리에 대한 사용자/키 인식 문제가 해결되었음을 확인할 수 있습니다. 이제 제한된 쉘을 탐색하는 데 문제가 있었던 cron
작업 스크립트에서 모두 잘 작동합니다. 나는 또한 R 내에서 이 스크립트를 호출할 수 있었고 여전히 똑같은 cron
실행 문제를 system("bash git.sh -i ~/.ssh/thatuserkey.pem pull")
).
R이 Ruby와 같은 것은 아니지만 R이 할 수 있다면... O:-)
Paul McMurdie좋은 답변이 많이 있지만 일부는 사전 관리 지식을 가정합니다.
https://github.com/<user-name>/<project-name>.git
user- name>/<project-name>.git)을 복제하여 프로젝트를 시작했다면 명시적으로 강조하는 것이 중요하다고 생각합니다.
그런 다음 .git/config
의 [remote "origin"]
아래에 있는 url
값 이 SSH URL로 변경 되었는지 확인해야 합니다 (아래 코드 블록 참조).
그 외에도 아래에 언급된 대로 sshCommmand
를 추가해야 합니다.
user@workstation:~/workspace/project-name/.git$ cat config [core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true sshCommand = ssh -i ~/location-of/.ssh/private_key -F /dev/null <--Check that this command exist [remote "origin"] url = git@github.com:<user-name>/<project-name>.git <-- Make sure its the SSH URL and not the WEB URL fetch = +refs/heads/*:refs/remotes/origin/* [branch "master"] remote = origin merge = refs/heads/master
자세한 내용은 여기를 참조하십시오.
RtmYControlPath
를 설정하여 .ssh/config 파일을 통해 특정 식별 파일을 사용하도록 지정할 수 있습니다. 예:
host github.com ControlPath ~/Projects/work/** HostName github.com IdentityFile ~/.ssh/id_work User git
그런 다음 ssh
는 지정된 작업 경로에서 git 명령을 수행할 때 지정된 ID 파일을 사용합니다.
cristobal키를 추가한 다음 git clone을 다시 실행하기만 하면 됩니다.
ssh-add ~/.ssh/id_rsa_mynewkey git clone git@bitbucket.org:mycompany/myrepo.git
Rafael Corrêa Gomes2021. Mac을 사용하는 경우.
일반적으로 다음과 같이 연결하는 aws에 우분투 서버가 있다고 가정해 보겠습니다.
% ssh -i blah/yourkeypair.pem ubuntu@test.fattie.com
터미널에서 그냥
% export GIT_SSH_COMMAND="ssh -i /Users/fattie/Desktop/blah/yourkeypair.pem"
당신이 그것을 한 후. 그런 다음 자유롭게 할 수 있습니다 ...
% git clone ubuntu@test.fattie.com:/home/ubuntu/teste.git
그러면 서버의 저장소가 로컬 폴더 "teste"에 복제됩니다.
그런 다음 teste/와 같은 일반적인 명령을 수행할 때 자유롭게 할 수 있습니다.
% git push origin master
등등.
--
참고: https://stackoverflow.com/a/67287133/294884
서버에 관해서는 기본적으로
] git clone --bare the-actual-folder teste.git
그런 다음 teste.git에서
] git init --bare --shared
FattieGit Bash가 있는 Windows에서는 다음을 사용하여 리포지토리를 추가할 수 있습니다.
ssh-agent bash -c 'ssh-add "key-address"; git remote add origin "rep-address"'
예를 들어:
ssh-agent bash -c 'ssh-add /d/test/PrivateKey.ppk; git remote add origin git@git.test.com:test/test.git'
컴퓨터의 폴더 테스트인 D 드라이브에 있는 개인 키. 또한 저장소를 복제하려면 git clone
git remote add origin
을 변경할 수 있습니다.
이것을 Git Bash에 입력하면 암호를 묻습니다!
openssh 개인 키와 퍼티 개인 키는 다릅니다!
puttygen으로 키를 생성했다면 개인 키를 openssh로 변환해야 합니다!
Peyman Mahdavi아래와 같이 ~/.ssh/config를 생성해야 합니다.
Host <Your bitbucket server> User <userid> Hostname <Your bitbucket server as above> IdentitiesOnly yes IdentityFile ~/.ssh/id_rsa<file> This is your private key file
아래와 같이 허가
-rw------- $HOME/.ssh/config
git에 공개 키를 추가하십시오(cat ~/.ssh/id_rsa_pub [또는 유사한 이름]).
그런 다음 아래와 같이 git clone
git clone ssh://blahblah@blah.com/userid/test.git
gajanan malvade이 방법의 문제는 적어도 Windows에서 bash.exe로 실행할 때 휴면 상태로 유지될 때마다 새 프로세스를 생성한다는 것입니다.
ssh-agent bash -c 'ssh-add /somewhere/yourkey; git clone git@github.com:user/project.git'
일정에 따라 syncig repo에 사용하려면 끝에 "&& ssh-agent -k"를 추가해야 합니다.
다음과 같은 것:
ssh-agent bash -c 'ssh-add C:/Users/user/.ssh/your_key; git -C "C:\Path\to\your\repo" pull && ssh-agent -k'
ssh-agent -k는 완료되면 프로세스를 종료합니다.
Mike ZygalGIT_SSH 환경 변수를 사용할 수 있습니다. 그러나 ssh와 옵션을 셸 스크립트로 래핑해야 합니다.
명령 셸에서 git manual: man git
rudimeierzsh
사용하고 랩톱에서 다른 목적(예: 원격 서버에 대한 액세스)을 위해 자동으로 다른 키가 zsh 셸의 ssh-agent
@Nick의 답변을 수정했으며 자주 새로 고쳐야 하는 저장소 중 하나에 사용하고 있습니다. (이 경우 내가 일하는 곳 어디에서나 내 모든 컴퓨터에서 동일하고 최신 버전을 원하는 dotfiles
bash -c 'eval `ssh-agent`; ssh-add /home/myname/.dotfiles/gitread; ssh-add -L; cd /home/myname/.dotfiles && git pull; kill $SSH_AGENT_PID'
- SSH 에이전트 생성
- 에이전트에 읽기 전용 키 추가
- 내 git repo로 디렉토리 변경
-
cd
to repo dir이 성공하면 원격 repo에서 pull - 생성된 ssh-agent를 종료합니다. (많은 요원이 주변에 머무르는 것을 원하지 않습니다.)
user3905644gitlab RSAAuthentication yes
Host gitlab.com RSAAuthentication yes IdentityFile ~/.ssh/your_private_key_name IdentitiesOnly yes
문서가 여기 있습니다
AlupothaGIT_SSH_COMMAND 환경 변수가 다음 대신 Windows에서 작동하도록 하려면:
set GIT_SSH_COMMAND="ssh -i private_key_file"
사용하다:
set "GIT_SSH_COMMAND=ssh -i private_key_file"
인용문은 다음과 같아야 합니다.
set "variable=value"
일부 배경: https://stackoverflow.com/a/34402887/10671021
Mátyás Kuti-KreszácsSSH 포트 번호가 22(기본값)가 아닌 경우 ~/.ssh/config
에 Port xx
제 경우(시놀로지),
Host my_synology Hostname xxxx.synology.me IdentityFile ~/.ssh/id_rsa_xxxx User myname Port xx
그런 다음 구성에서 호스트 제목을 사용하여 복제합니다. ("my_synology". @chopstik의 "*"를 피하기 위해)
git clone my_synology:path/to/repo.git
w..k저와 같은 경우 다음을 수행할 수 있습니다.
~/.ssh/keys
디렉토리에 키를 보관합니다.
나는 구성보다 규칙을 선호합니다.
저는 코드가 법이라고 생각합니다. 단순할수록 좋습니다.
1단계 - 별칭 만들기
다음 별칭을 셸에 추가합니다. alias git-clone='GIT_SSH=ssh_wrapper git clone'
2단계 - 스크립트 생성
이 ssh_wrapper 스크립트를 PATH에 추가하십시오.
#!/bin/bash # Filename: ssh_wrapper if [ -z ${SSH_KEY} ]; then SSH_KEY='github.com/l3x' # <= Default key fi SSH_KEY="~/.ssh/keys/${SSH_KEY}/id_rsa" ssh -i "${SSH_KEY}" "$@"
예
github.com/l3x 키 사용:
KEY=github.com/l3x git-clone https://github.com/l3x/learn-fp-go
다음 예제에서는 github.com/l3x 키(기본값)도 사용합니다.
git-clone https://github.com/l3x/learn-fp-go
bitbucket.org/lsheehan 키 사용:
KEY=bitbucket.org/lsheehan git-clone git@bitbucket.org:dave_andersen/exchange.git
노트
ssh_wrapper 스크립트의 기본 SSH_KEY를 가장 많이 사용하는 것으로 변경하십시오. 그렇게 하면 대부분의 시간에 KEY 변수를 사용할 필요가 없습니다.
"이봐! 별칭, 스크립트 및 일부 키 디렉토리로 많은 일이 벌어지고 있다"고 생각할 수도 있지만 나에게는 관례입니다. 거의 모든 워크스테이션(및 해당 문제에 대한 서버)이 유사하게 구성됩니다.
여기서 내 목표는 정기적으로 실행하는 명령을 단순화하는 것입니다.
내 규칙(예: Bash 스크립트, 별칭 등)은 일관된 환경을 만들고 일을 단순하게 유지하는 데 도움이 됩니다.
KISS와 이름이 중요합니다.
더 많은 디자인 팁은 내 책 에서 4장 SOLID Design in Go 를 확인하십시오. https://www.amazon.com/Learning-Functional-Programming-Lex-Sheehan-ebook/dp/B0725B8MYW
도움이 되기를 바랍니다. - 렉스
l3x이 문제에 대한 해결책을 찾는 동안 발견한 ssh 키 해킹은 다음과 같습니다.
예를 들어 2개의 다른 키 세트가 있습니다.
key1, key1.pub, key2, key2.pub
.ssh
디렉토리에 보관하십시오.
이제 .bashrc
또는 .bash_profile
별칭 파일에 다음 명령을 추가합니다.
alias key1='cp ~/.ssh/key1 id_rsa && cp ~/.ssh/key1.pub id_rsa.pub'
alias key2='cp ~/.ssh/key2 id_rsa && cp ~/.ssh/key2.pub id_rsa.pub'
짜잔! 원할 때마다 키를 전환할 수 있는 단축키가 있습니다!
이것이 당신을 위해 작동하기를 바랍니다.
penduDev출처 : http:www.stackoverflow.com/questions/4565700/how-to-specify-the-private-ssh-key-to-use-when-executing-shell-command-on-git