Cum pentru a specifica privat SSH-cheie pentru a utiliza atunci când execută comenzi shell pe Git?

O situație destul de neobișnuită poate, dar vreau să specificați un privat SSH-cheie pentru a utiliza atunci când execută un shell (git) comanda de pe computerul local.

Practic astfel:

git clone git@github.com:TheUser/TheProject.git -key "/home/christoffer/ssh_keys/theuser"

Sau chiar mai bine (în Ruby):

with_key("/home/christoffer/ssh_keys/theuser") do
  sh("git clone git@github.com:TheUser/TheProject.git")
end

Am văzut exemple de conectarea la un server de la distanță cu Net::SSH care folosește o anumită cheie privată, dar acest lucru este un local de comandă. Este posibil?

Comentarii la întrebare (4)

Niciuna dintre aceste soluții nu a lucrat pentru mine.

În schimb, am elaborat pe @Martin v. Löwis 's mai vorbim de a stabili un "config" fișierul pentru SSH.

SSH va arata pentru utilizator's `~/.ssh/config file. Eu pe al meu setup ca:

Host gitserv
    Hostname remote.server.com
    IdentityFile ~/.ssh/id_rsa.github
    IdentitiesOnly yes # see NOTES below

Și adaug-o la distanță git repository:

git remote add origin git@gitserv:myrepo.git

Și apoi git comenzi de lucru în mod normal pentru mine.

git push -v origin master

NOTE

  • La IdentitiesOnly da este necesar pentru a a preveni SSH comportamentul implicit de a trimite identitatea fișier de potrivire implicit de fișier pentru fiecare protocol. Dacă aveți un fișier cu numele ~/.ssh/id_rsa care vor fi încercate ÎNAINTE de ta `~/.ssh/id_rsa.github fără această opțiune.

Bibliografie

Comentarii (18)
Soluția

Ceva de genul asta ar trebui sa mearga (sugerat de către orip):

ssh-agent bash -c 'ssh-add /somewhere/yourkey; git clone git@github.com:user/project.git'

dacă preferați subshells, ai putea încerca următoarele (deși este mult mai fragil):

ssh-agent $(ssh-add /somewhere/yourkey; git clone git@github.com:user/project.git)

Git va invoca SSH care va găsi agent de variabila de mediu; acesta, la rândul său, cheia încărcate.

Alternativ, setarea "ACASĂ" poate face, de asemenea truc, dacă ești dispus să setup un director care conține numai un .ssh director ca "ACASĂ"; acest lucru poate conține o identitate.pub, sau o config setarea IdentityFile.

Comentarii (17)

Alte persoane's sugestii despre ~/.ssh/config sunt foarte complicate. Acesta poate fi la fel de simplu ca:

Host github.com
  IdentityFile ~/.ssh/github_rsa
Comentarii (4)

Pornind de la Git 2.3.0 avem, de asemenea, simplă comandă (nici un fișier de configurare este necesar):

GIT_SSH_COMMAND='ssh -i private_key_file' git clone user@host:repo.git

Aveți nevoie de un restart pentru serviciul ssh pe mașina dumneavoastră.

Comentarii (10)

Conținutul de my_git_ssh_wrapper:

#!/bin/bash

ssh -i /path/to/ssh/secret/key $1 $2

Apoi, puteți utiliza tastele de a face:

GIT_SSH=my_git_ssh_wrapper git clone git@github.com:TheUser/TheProject.git
Comentarii (5)

Pentru a rezuma răspunsurile și commentscel mai bun mod de a configura git de a utiliza diferite fișiere cheie și apoi uita despre asta, care sprijină, de asemenea, utilizatori diferiți pentru aceeași gazdă (de exemplu, un personal de pe contul GitHub și o), care funcționează pe Windows la fel de bine, este de a edita ~/.ssh/config "(sau " c:\Users\<dvs. de utilizator>\.ssh\config) și să specificați mai multe identități:

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

Apoi, pentru a clona un proiect ca dvs. personal de utilizator, trebuie doar să rulați regulat `git clona comandă.

Pentru a clona repo ca workuser, run git clona git@github-work:company/project.git.

Comentarii (6)

Cu git 2.10+ (T3 2016: lansat Sept. 2d, 2016), aveți posibilitatea să setați o configurare pentru GIT_SSH_COMMAND (și nu doar o variabilă de mediu așa cum este descris în Rober Jack Va's răspunde)

A se vedea comite 3c8ede3 (26 Iunie 2016) până la Nguyễn-Leaáam Ngọc Duy (pclouds). (Fuzionat cu Junio C Hamano -- gitster -- în comite dc21164, 19 Iulie 2016)

O nouă configurație variabilă de bază.sshCommand` a fost adăugat la precizați ce valoare pentru GIT_SSH_COMMAND pentru a utiliza pe repository.

core.sshCommand:

Dacă această variabilă este setată, git fetch " și " git push va folosi comanda specificată în loc de ssh atunci când au nevoie să se conecteze la un sistem la distanță. Comanda este în aceeași formă ca GIT_SSH_COMMAND variabila de mediu și este înlocuită atunci când variabila de mediu este stabilit.

Aceasta înseamnă git clona poate fi:

cd /path/to/my/repo
git config core.sshCommand 'ssh -i private_key_file' 
# later on
git clone host:repo.git
Comentarii (6)

După cum se menționează aici: https://superuser.com/a/912281/607049

Puteți să-l configurați pe-repo:

git config core.sshCommand "ssh -i ~/.ssh/id_rsa_example -F /dev/null"
git pull
git push
Comentarii (7)

O modalitate mai bună idee să adaug că host sau ip la `.ssh/config file astfel:

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)
Comentarii (10)

M-am dus cu GIT_SSH variabilă de mediu. Aici's înveliș mea, similară cu cea de la Joe Bloc de mai sus, dar se ocupă de orice sumă de argumente.

Fișierul ~/gitwrap.sh

#!/bin/bash
ssh -i ~/.ssh/gitkey_rsa "$@"

Apoi, în a mea .bashrc, se adaugă următoarele:

export GIT_SSH=~/gitwrap.sh
Comentarii (4)
GIT_SSH_COMMAND="ssh -i /path/to/git-private-access-key" git clone $git_repo
Comentarii (0)

Problema este atunci când aveți diferite depozitele de la distanță pe aceeași gazdă (sa zicem github.com), și doriți pentru a interacționa cu ei folosind diferite chei ssh (de exemplu, diferite GitHub conturi).

În scopul de a face asta:

  1. în Primul rând ar trebui să declare chei diferite în ~/.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

Făcând acest lucru vă asocia la a doua cheie cu un nou nume prietenos "XXX" pentru github.com.

2), Atunci trebuie să modificați de la distanță originea special de depozit, astfel încât acesta utilizează numele prietenos te'am juste definite.

Du-te la depozit local folder într-un prompt de comandă și de afișare curent de la distanță origine:

>git remote -v
origin  git@github.com:myuser/myrepo.git (fetch)
origin  git@github.com:myuser/myrepo.git (push)

Apoi schimba origine cu:

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

Acum puteți împinge, aduce cu tasta dreapta în mod automat.

Comentarii (1)

Dacă nici una dintre soluțiile de lucru pentru tine, și ați creat mai multe ssh-chei, dar încă nu poate face lucruri simple cum ar fi

git pull

apoi, presupunând că aveți două chei ssh fișiere, cum ar fi

id_rsa
id_rsa_other_key

apoi în interiorul git repo, încercați:

# Run these commands INSIDE your git directory
eval `ssh-agent -s`
ssh-add ~/.ssh/id_rsa
ssh-add ~/.ssh/id_rsa_other_key

și, de asemenea, asigurați-vă că github implicit numele de utilizator și id-ul de utilizator sunt corecte prin:

# Run these commands INSIDE your git directory
git config user.name "Mona Lisa"
git config user.email "mona.lisa@email.com"

Vezi https://gist.github.com/jexchan/2351996 pentru mai multe informații.

Comentarii (2)

Multe dintre aceste soluții uitat ispititoare. Cu toate acestea, am găsit generic git-ambalaj-script abordare la link-ul următor pentru a fi cele mai utile:

Cum pentru a Specifica o Cheie ssh File cu git command

Ideea fiind că nu există nici o git de comandă cum ar fi următoarele:

git -i ~/.ssh/thatuserkey.pem clone thatuser@myserver.com:/git/repo.git

Alvin's soluție este de a utiliza un bine definite bash script înveliș care umple acest gol:

git.sh -i ~/.ssh/thatuserkey.pem clone thatuser@myserver.com:/git/repo.git

Unde git.sh` este:

#!/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 "$@"

Pot confirma că acest lucru s-a rezolvat problema am avut cu user/cheie de recunoaștere pentru o distanță bitbucket repo cu git de actualizare de la distanță, git pull", și " git clona; toate de care acum funcționează bine într-un cron job script care a fost de altfel nu are probleme de navigație limitată-shell. Am fost, de asemenea, capabil de a apela acest script din cadrul R și încă rezolva exact același cron executa problema (de exemplu, sistemul("bash git.sh -i ~/.ssh/thatuserkey.pem pull")`).

Nu că R este aceeași ca Ruby, dar daca-R face-o... O:-)

Comentarii (2)

Atunci când aveți nevoie să se conecteze la github cu o cerere normală (git pull origine master), setarea Gazdă ca*in~/.ssh/config` a lucrat pentru mine, orice altă Gazdă (de exemplu, "github" sau "gb") n't de lucru.

Host *
    User git
    Hostname github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_xxx
Comentarii (2)

Aveți nevoie pentru a crea un ~/.ssh/config de mai jos

Host 
User 
Hostname 
IdentitiesOnly yes
IdentityFile ~/.ssh/id_rsa This is your private key file

permisiunea ca mai jos

-rw------- $HOME/.ssh/config

Adăuga cheia publică în git (cat ~/.ssh/id_rsa_pub [sau simillar nume])

și apoi git clona de mai jos

git clone ssh://blahblah@blah.com/userid/test.git
Comentarii (0)

dacă aveți director de pe calea ta în cazul în care doriți să semneze cu o anumită identifyfile puteți specifica pentru a utiliza o anumită identifica fișierul prin intermediul .ssh/config prin setarea ControlPath exemplu:

gazdă github.com ControlPath ~/Proiectelor/locul de muncă/** HostName github.com IdentityFile ~/.ssh/id_work Utilizator git

Apoi ssh va utiliza specificate de identitate fișier atunci când faci git comenzi sub anumit traseu de lucru.

Comentarii (1)

În Windows cu Git Bash puteți utiliza următoarele opțiuni pentru a adăuga un depozit ssh-agent bash -c &#39;ssh-add "cheie-adresa"; git remote adauga origine "rep-adresa"&#39; de exemplu: ssh-agent bash -c &#39;ssh-add /d/test/PrivateKey.ppk; git remote adauga origine git@git.test.com:test/test.git&#39; Care cheia privată este, în unitatea D, dosar test de calculator. De asemenea, dacă doriți pentru a clona un depozit, puteți schimba git remote adauga origine " cu " git clona.

După ce introduceți acest lucru la Git Bash, vi se va cere pentru o frază de acces!

Fi Conștienți de faptul că openssh cheie privată și chit cheie privată sunt diiferent!

Dacă ați creat cheile cu puttygen, trebuie să efectuați conversia cheia privată pentru a openssh!

Comentarii (0)

pentru gitlab RSAAuthentication da

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

doc este aici

Comentarii (1)

Ai putea folosi GIT_SSH variabilă de mediu. Dar va trebui să-și încheie ssh și opțiuni într-un script de shell.

Vezi git manual: om git în comandă shell.

Comentarii (0)