etc./StackOverFlow

Git에서 셸 명령을 실행할 때 사용할 개인 SSH 키를 지정하는 방법은 무엇입니까?

청렴결백한 만능 재주꾼 2022. 7. 9. 02:48
반응형

질문자 :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öwis

Git 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

philfreo

git 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 fetchgit 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"

VonC

my_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 계정)를 사용하여 이들과 상호 작용하려는 경우입니다.

그렇게 하려면:

  1. ~/.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"와 연결합니다.

  2. 그런 다음 방금 정의한 친숙한 이름을 사용하도록 특정 리포지토리의 원격 원본을 변경해야 합니다.

    명령 프롬프트 내에서 로컬 저장소 폴더로 이동하여 현재 원격 원본을 표시합니다.

     >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)

    이제 올바른 키를 사용하여 자동으로 푸시, 가져오기를 수행할 수 있습니다.


rodzmkii

GIT_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

Jamie

Git 버전 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 을 참조하십시오.


cgnorthcutt

git 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 pullgit 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

자세한 내용은 여기를 참조하십시오.


RtmY

ControlPath 를 설정하여 .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 Gomes

2021. 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

Fattie

Git 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 Zygal

GIT_SSH 환경 변수를 사용할 수 있습니다. 그러나 ssh와 옵션을 셸 스크립트로 래핑해야 합니다.

명령 셸에서 git manual: man git


rudimeier

zsh 사용하고 랩톱에서 다른 목적(예: 원격 서버에 대한 액세스)을 위해 자동으로 다른 키가 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를 종료합니다. (많은 요원이 주변에 머무르는 것을 원하지 않습니다.)

user3905644

gitlab RSAAuthentication yes

 Host gitlab.com RSAAuthentication yes IdentityFile ~/.ssh/your_private_key_name IdentitiesOnly yes

문서가 여기 있습니다


Alupotha

GIT_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ács

SSH 포트 번호가 22(기본값)가 아닌 경우 ~/.ssh/configPort 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 키를 정리하세요

  • git clone 명령을 간단하게 유지

  • 원하는 수의 리포지토리에 대해 원하는 수의 키를 처리합니다.

  • SSH 키 유지 관리를 줄이십시오.

~/.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

반응형