Como especificar a chave SSH privada a ser usada ao executar o comando shell no Git?


1110

Uma situação bastante incomum, talvez, mas quero especificar uma chave SSH privada para usar ao executar um comando shell (git) no computador local.

Basicamente assim:

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

Ou ainda melhor (em Ruby):

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

Eu já vi exemplos de conexão com um servidor remoto com o Net :: SSH que usa uma chave privada especificada, mas este é um comando local. É possível?



28
Eu estou me perguntando por que isso é tão incomum que o Git não tem uma -iopção como ssha.
Nick T

29
Com git 2,10 (Q3 2016), você também tem uma nova configuração: git config core.sshCommand 'ssh -i private_key_file'. Veja minha resposta abaixo
VonC:

3
Na minha opinião, a resposta HeyWatchThis deve ser a resposta aceita, pois permite que todos os comandos git sejam executados normalmente após a instalação, em vez de precisar criar um subshell para cada comando git, conforme a resposta atual aceita.
gloriphobia

Respostas:


801

Algo assim deve funcionar (sugerido pelo orip):

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

se você preferir sub-conchas, tente o seguinte (embora seja mais frágil):

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

O Git invocará o SSH, que encontrará seu agente pela variável de ambiente; por sua vez, a chave será carregada.

Como alternativa, a configuração HOMEtambém pode funcionar, desde que você esteja disposto a configurar um diretório que contenha apenas um .sshdiretório como HOME; isso pode conter um identity.pub ou uma configuração de arquivo de configuração IdentityFile.


5
Mas isso adicionará a chave permanentemente como uma chave SSH aceita, certo? Quero evitar isso para que o usuário2 não possa mexer nos projetos do usuário. É para um aplicativo da web, portanto, não é prático usar diferentes usuários do sistema operacional, o que seria a melhor opção.
Christoffer

28
Não, quando o git é concluído, o ssh-agent termina e a chave é esquecida.
Martin v. Löwis

6
este comando não funciona no windows git bash. Ele diz erro de sintaxe próximo ao token inesperado 'ssh-add'
Mohit

116
A linha de comando fixa (para Windows ou Linux) seria algo como:ssh-agent bash -c 'ssh-add sshkey; git clone url'
orip

4
A ssh-agent $(..)sintaxe não está funcionando para mim e não tenho certeza de como isso deve funcionar: (ba) sh deve executar os comandos dentro $(..)primeiro e depois executar o ssh-agent com a saída como parâmetro.
Johannes 'fish' Ziemke

1200

Nenhuma dessas soluções funcionou para mim.

Em vez disso, elaborei a menção de @Martin v. Löwis em definir um configarquivo para SSH.

O SSH procurará o ~/.ssh/configarquivo do usuário . Eu tenho a minha configuração como:

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

E eu adiciono um repositório remoto do git:

git remote add origin git@gitserv:myrepo.git

E então os comandos git funcionam normalmente para mim.

git push -v origin master

NOTAS

  • O IdentitiesOnly yesé necessário para evitar o comportamento padrão SSH de enviar o arquivo de identidade combinando o nome de arquivo padrão para cada protocolo. Se você tiver um arquivo nomeado ~/.ssh/id_rsaque será tentado ANTES de você ~/.ssh/id_rsa.githubsem essa opção.

Referências


17
Descobri que quando você especifica várias chaves usando .ssh / config, é necessário usar o nome do amigo do host na linha "Host" como parte do comando "git remote add". Se a linha for "Host stg", você precisará usar o git remote, adicionar <someName> usuário @ stg: /path_to_git_repo.git ". Se você usar o nome exato do servidor como user@myserver.com: /path_to_git_repo.git, o arquivo de configuração .. não é captado pelo git por isso, não é escolher arquivo de chave privada correctamente Eu tentei isso, empurrando mesmo conteúdo para o GitHub e heroku e só funciona quando você dá nome amigável em "git remoto adicionar"
Gopinath MR

2
Eu não tinha certeza sobre o host do github. Encontrei este link: gist.github.com/jexchan/2351996 .
22414 Karsten

1
Dê uma olhada aqui se você quiser ter poucos arquivos-chave para alguns repositórios git
e271p314

1
Você pode usar Host remote.server.come continuar usando o URL original
MauganRa

5
Isso funcionou para mim depois de duas mudanças. Se o arquivo de configuração for novo, não esqueça de fazer chmod 600 ~/.ssh/config(veja aqui ). E se você estiver usando o GitHub, substitua Host gitservpor Host github.com, omita Hostname remote.server.come adicione remoto por git remote add origin git@github.com:user_name/repo_name.git.
Miguelmorin

480

A partir do Git 2.3.0, também temos o comando simples (nenhum arquivo de configuração é necessário):

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

3
Eu cannot run ssh -i /home/vagrant/.ssh/git: No such file or directoryacho que existe a 444 Nov 16 18:12 /home/vagrant/.ssh/gitpartir dels -l /home/vagrant/.ssh/git
ted

3
@ted: chmod 400 /home/vagrant/.ssh/git
Yash

8
Solução agradável e fácil. Sugiro criar um alias se você precisar fazer muito isso.
Lasse Meyer

5
Não esqueça chmod 400 <path-to-private-key-file>. Caso contrário, o comando git pode falhar sem nenhuma mensagem de erro especial ...
Eonil 10/10

5
Seria bom que essa resposta também fosse incluída -o IdentitiesOnly=yespara garantir que a chave especificada com -iseja usada (em oposição a uma chave do agente SSH).
robinst 6/01

423

As sugestões de outras pessoas ~/.ssh/configsão extremamente complicadas. Pode ser tão simples quanto:

Host github.com
  IdentityFile ~/.ssh/github_rsa

30
Você precisa da IdentitiesOnlyopção também.
Flimm

4
@EnzeChi você pode ter várias contas github por manipular os controles remotos: git remote add ssh://personal/org/proj.git && git remote add ssh://corporate/org/proj.git. Então você config pareceHost personal HostName github.com ... Host corporate HostName github.com
emory

@EnzeChi Faço algo semelhante para usar 2 teclas ssh diferentes - uma para buscar e outra para empurrar. A busca não possui uma senha. O empurrão faz.
Emory 4/17

144

Conteúdo de my_git_ssh_wrapper:

#!/bin/bash

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

Então você pode usar a chave fazendo:

GIT_SSH=my_git_ssh_wrapper git clone git@github.com:TheUser/TheProject.git

4
Muito boa solução se você tiver mais de uma conta ao mesmo domínio, que outras soluções não tratar bem
Beka

1
Ótima solução. Você também pode simplificar isso com> GIT_SSH = my_git_ssh_wrapper; git clone git@github.com: TheUser / TheProject.git
Shiva

2
Esta solução também cobre situações em que você deseja usar o git da conta sem o diretório inicial.
Piotrekkr

Fantástico. Você também pode usar este caminho para servidores privados:GIT_SSH="git_wrapper" git clone ssh://user@server/path/to/project"
ton

1
Esta é a única maneira que funcionou para mim em um ambiente cygwin
ChatterOne

113

Com git 2.10+ (Q3 2016: lançado setembro 2d, 2016), você tem a possibilidade de definir uma configuração para GIT_SSH_COMMAND(e não apenas uma variável de ambiente como descrito na Rober Jack Will 's resposta )

Ver commit 3c8ede3 (26 de junho de 2016) por Nguyễn Thái Ngọc Duy ( pclouds) .
(Mesclado por Junio ​​C Hamano - gitster- na confirmação dc21164 , 19 de julho de 2016)

Uma nova variável de configuração core.sshCommandfoi adicionada para especificar qual valor GIT_SSH_COMMANDusar por repositório.

core.sshCommand:

Se essa variável estiver configurada git fetche git pushusar o comando especificado em vez de sshquando eles precisarem se conectar a um sistema remoto.
O comando está na mesma forma que a GIT_SSH_COMMANDvariável de ambiente e é substituído quando a variável de ambiente é configurada.

Isso significa que git clonepode ser:

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

Você pode configurá-lo para apenas um comando:

git -c core.sshCommand="ssh -i private_key_file" clone host:repo.git

Isso é mais fácil do que definir uma GIT_SSH_COMMANDvariável de ambiente que, no Windows, conforme observado por Mátyás Kuti-Kreszács , seria

set "GIT_SSH_COMMAND=ssh -i private_key_file"

Datas de lançamento do @Flimm: calendar.google.com/calendar/…
VonC 04/08/19

Foi lançado.
Flimm

4
Trabalho. O pessoal deve considerar essa a melhor resposta. Uma vez emitido, pode ser informativo diferenciar o arquivo .git / config com uma versão copiada para / tmp previamente. Uma nova entrada foi criada: sshCommand = ... Para o que vale a pena, usei 'git config core.sshCommand "ssh -i $ HOME / .ssh / privatekeyfile".
WeakPointer 8/0318

1
@ Spanky Você pode executar o comando inline git -c core.sshCommand="ssh -i private_key_file" clone host:repo.gitseguido pelo conjunto de configuraçõesgit config core.sshCommand 'ssh -i private_key_file'
dav_i 09/01

1
Esta é definitivamente a melhor resposta!
Wagner Patriota

111

Para resumir respostas e comentários , a melhor maneira de configurar o git para usar arquivos-chave diferentes e depois esquecê-lo, que também suporta usuários diferentes para o mesmo host (por exemplo, uma conta pessoal do GitHub e outra funcional), que funciona no Windows também é editar ~/.ssh/config(ou c:\Users\<your user>\.ssh\config) e especificar várias identidades:

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

Em seguida, para clonar um projeto como seu usuário pessoal, basta executar o git clonecomando regular .

Para clonar o repositório como o workuser, execute git clone git@github-work:company/project.git.


3
Eu diminuí a votação porque tudo o que você diz já está coberto nas respostas acima e, aos meus olhos, ainda mais claramente. Por exemplo, por que exatamente você define o usuário para dandv e useruser, respectivamente?
hroptatyr

2
Você respondeu a uma pergunta de 4 anos sem novas informações e está afirmando que sua resposta é "a melhor maneira". Além disso, você votou mal e incomodou outros usuários para remover a resposta ... apenas para fazer com que a pessoa seja pressionada.
rudimeier 27/03

@hroptatyr: Eu usei dandve workuserpara apoiar o meu exemplo ", por exemplo, uma conta pessoal do GitHub e uma conta de trabalho". dandvé o meu nome de usuário do GitHub.
Dan Dascalescu 28/03

12
Eu acho que é uma resposta melhor do que a do @ thamster, mesmo porque explica aliases de host.
David Moles

2
Eu gosto desta resposta. No entanto, para mim, isso só funciona se eu adicionar IdentitiesOnly yesao meu arquivo de configuração ssh.
Winni2k 17/02

75

Como indicado aqui: https://superuser.com/a/912281/607049

Você pode configurá-lo por repo:

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

1
O que -F /dev/nullfaz? Tanto quanto posso ver, isso mudará o configFile do ~/.ssh/configpadrão, mas por que isso é desejado? Para garantir um comando em área restrita?
Dominic

3
linuxcommand.org/man_pages/ssh1.html , não especifica nenhum arquivo de configuração; portanto, quando o git for executado ssh, nenhum arquivo de configuração será passado (na verdade, é um tipo de modo sandbox, apenas ignore as opções padrão de configuração do usuário). mais informações sobre -F
David

1
O que eu estava procurando. Obrigado!
precisa saber é o seguinte

Solução AAAAA + para trabalhar no ambiente kuber. Obrigado!
Cobra vs Ninja

1
Oi Você sabe como propagar isso para um submódulo?
Arka Prava Basu

38

O problema é quando você tem repositórios remotos diferentes no mesmo host (por exemplo, github.com) e deseja interagir com eles usando diferentes chaves ssh (por exemplo, contas diferentes do GitHub).

A fim de fazer isso:

  1. Primeiro você deve declarar suas diferentes chaves no ~/.ssh/configarquivo.

    # 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

    Ao fazer isso, você associa a segunda chave a um novo nome amigável "XXX" para o github.com.

  2. Então você deve alterar a origem remota do seu repositório específico, para que ele use o nome amigável que você acabou de definir.

    Vá para a pasta do repositório local em um prompt de comando e exiba a origem remota atual:

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

    Altere a origem com:

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

    Agora você pode pressionar, buscar ... com a tecla certa automaticamente.


1
Esta é a resposta mais "correta" em minha mente, onde você organiza conexões e chaves no seu arquivo de configuração ssh que é uma prática recomendada e suportável a longo prazo.
jamescampbell

Outras soluções parecem soluções alternativas, isso está usando um ótimo recurso que a ferramenta suporta.
Craig.C

Incrível, exatamente o que eu estava procurando, obrigado !!
magikMaker 19/02

37
GIT_SSH_COMMAND="ssh -i /path/to/git-private-access-key" git clone $git_repo

ou

export GIT_SSH_COMMAND="ssh -i /path/to/git-private-access-key"
git clone REPO
git push

Este funcionou para mim.
mohammed_ayaz 4/03

36

Muito melhor ideia de adicionar esse host ou ip ao .ssh/configarquivo da seguinte maneira:

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)

1
Isso é útil, mas faz com que você use a chave de repo para toda interação com esse nome de host. Se houver outros repositórios no mesmo servidor que exijam chaves diferentes, é melhor usar um wrapper e dizer ao git para usá-lo com o GIT_SSH.
Joe Block

11
Isso não é necessariamente verdade. Uso várias chaves no Github - uma para o trabalho e outra para minha conta pessoal. Você não precisa colocar um nome de domínio para "Host". Você pode colocar qualquer tipo de alias que desejar. Por exemplo, uso gh-home e gh-work como meus nomes de host e, quando clono, uso, por exemplo, git clone git@gh-work:repo/project.git em ~ / .ssh / config, tenho duas seções que usam github.com para HostName. Eles apenas têm IdentityFile e Host diferentes
blockloop

@ brettof86 Essa estratégia funciona na maior parte do tempo, mas o que você faz quando um repositório que está fazendo check-out depende de uma gema que também está hospedada no github? A referência ao repo github no Gemfile costuma conter suas "Alias", bem a não ser que você quer quebrar as coisas para outros desenvolvedores sobre o projeto ...
KTEC

@ brettof86 Eu também tenho duas contas diferentes no github (trabalho, casa), mas não consigo fazer o exemplo funcionar para mim. Você pode postar uma amostra de dois?
Climbs_lika_Spyder

@Climbs_lika_Spyder aqui está o que está no meu ~/.ssh/config pastebin.com/8rYn7yCi
blockloop 5/15

32

Eu fui com a variável de ambiente GIT_SSH. Aqui está meu invólucro, semelhante ao de Joe Block acima, mas lida com qualquer quantidade de argumentos.

Arquivo ~ / gitwrap.sh

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

Em seguida, no meu .bashrc, adicione o seguinte:

export GIT_SSH=~/gitwrap.sh

Eu configurei isso em .bashrc. Mas quando eu faço login na instância do openshift, parece que não estou chamando. Estou esquecendo de algo ?
Jigar Shah

Ele falha com um erro para mim .. não é capaz de encontrar o evento de script embora esteja lá .. não tenho certeza do que está acontecendo ... erro: não é possível executar o arquivo /tmp/gitwrap.sh: Esse arquivo ou diretório não
existe

Se você enfrentar o erro "Não existe esse arquivo ou diretório", coloque o caminho completo gitwrap.sh, por exemplo/home/ubuntu/gitwrap.sh
Tahir Akhtar 27/10

você pode querer adicionar -o StrictHostKeyChecking=noao comando ssh
dan-man

12

Se nenhuma das outras soluções aqui funcionar para você e você criou várias chaves ssh, mas ainda não pode fazer coisas simples, como

git pull

supondo que você tenha dois arquivos de chave ssh como

id_rsa
id_rsa_other_key

depois, dentro do repositório git, tente:

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

e também verifique se o nome de usuário e o ID do usuário padrão do github estão corretos:

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

Consulte https://gist.github.com/jexchan/2351996 para obter mais informações.


Observe se você obtém Could not open a connection to your authentication agent., tenta $ eval `ssh-agent -s`e tenta novamente.
cgnorthcutt

1
Para aqueles que estão perdidos, o ssh-addtruque de comando funcionou para mim. Add é a chave de identidade na lista daqueles que são tentados quando o ssh se autentica. Isso funcionou para mim também!
Ben Cartwright

Por que você acha que importa em qual diretório você executa ssh-add?
tripleee 4/03

@BenCartwright Como você está modificando as configurações locais, não as globais. Essa abordagem modifica .gitdentro do repositório, não o programa git globalmente. Você pode usar --globalpara definir o nome de usuário e o email globais.
cgnorthcutt 5/03

11

Quando você precisa se conectar a github com um pedido normal ( git pull origin master), dando o anfitrião como *no ~/.ssh/configfuncionou para mim, qualquer outro anfitrião (digamos, "github" ou "gb") não estava funcionando.

Host *
    User git
    Hostname github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_xxx

É melhor deixar a linha "Host *" inteira para fora então.
Lionello

1
Provavelmente não estava funcionando porque não correspondia ao seu URL remoto. Se você deseja usar Host my-host-alias, você deve definir remote.origin.url=git@my-host-alias:[username]/[repo].git.
David Moles

11

Muitas dessas soluções pareciam atraentes. No entanto, achei a abordagem genérica do git-wrapping-script no seguinte link a mais útil:

Como especificar um arquivo de chave ssh com o gitcomando

O ponto é que não há gitcomando como o seguinte:

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

A solução da Alvin é usar um script bem definido de wrapper que preencha esta lacuna:

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

Onde git.shfica:

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

Posso verificar se isso resolveu um problema que eu estava tendo com o usuário reconhecimento / chave para um repo bitbucket remoto com git remote update, git pulle git clone; agora tudo funciona bem em um cronscript de trabalho que estava tendo problemas para navegar no shell limitado. Também pude chamar esse script no R e ainda resolver exatamente o mesmo cronproblema de execução (por exemplo,system("bash git.sh -i ~/.ssh/thatuserkey.pem pull") ).

Não que R seja o mesmo que Ruby, mas se R puder fazê-lo ... O :-)


1
Parece ótimo! Vou testar isso e responder de volta.
BlueBird 27/05

3
Além da sintaxe, como isso é melhor do que GIT_SSH_COMMAND="ssh -i ~/.ssh/thatuserkey.pem" git clone clone thatuser@myserver.com:/git/repo.gitde acordo com a resposta de Robert Jack Will ?
David Moles

6

se você tiver um diretório no caminho em que deseja assinar com um determinado arquivo de identificação, poderá especificar o uso de um arquivo de identificação específico por meio do arquivo .ssh / config, definindo o ControlPathexemplo:

host github.com
  ControlPath ~/Projects/work/**
  HostName github.com
  IdentityFile ~/.ssh/id_work
  User git

Em seguida ssh, usará o arquivo de identidade especificado ao executar comandos git no caminho de trabalho especificado.


Descobri mais tarde que você também pode definir as propriedades ControlMaster autoe ControlPersist yes, para não precisar redigitar a senha todas as vezes. Encontrou a informação neste artigo
cristobal

3

Você precisa criar um ~ / .ssh / config como abaixo

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

permissão como abaixo

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

Adicione sua chave pública ao seu git (cat ~ / .ssh / id_rsa_pub [ou nome similar])

e depois git clone como abaixo

git clone ssh://blahblah@blah.com/userid/test.git

3

Muitas respostas boas, mas algumas delas assumem conhecimento prévio em administração.

Eu acho que é importante enfatizar explicitamente que, se você iniciou o projeto clonando a URL da Web - https://github.com/<user-name>/<project-name>.git
precisará garantir que o url valor abaixo [remote "origin"]do .git/config foi alterado para a URL SSH (consulte o bloco de código abaixo).

Além disso, certifique-se de adicionar o sshCommmandmencionado abaixo:

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

Leia mais sobre isso aqui .


1
Muito obrigado, gastei muito tempo tentando descobrir por que o git não está usando a tecla ssh. Não entendo por que o github fornece o URL https como padrão no botão clone.
Chakradar Raju

2

No Windows com Git Bash, você pode usar o seguinte para adicionar um repositório, ssh-agent bash -c 'ssh-add "key-address"; git remote add origin "rep-address"' por exemplo: ssh-agent bash -c 'ssh-add /d/test/PrivateKey.ppk; git remote add origin git@git.test.com:test/test.git'Qual chave privada está na unidade D, teste de pasta do computador. Além disso, se você deseja clonar um repositório, pode alterar git remote add origincom git clone.

Depois de inserir isso no Git Bash, ele solicitará uma senha.

Esteja ciente de que a chave privada openssh e a putty private key são diferentes.

Se você criou suas chaves com puttygen, deve converter sua chave privada em openssh!


1

Você pode usar a variável de ambiente GIT_SSH. Mas você precisará agrupar ssh e opções em um script de shell.

Veja o manual do git: man gitno seu shell de comando.


1

Eu uso zshe chaves diferentes são carregadas no meu shell zsh ssh-agentautomaticamente para outros fins (ou seja, acesso a servidores remotos) no meu laptop. Modifiquei a resposta de @ Nick e a uso em um dos meus repositórios que precisam ser atualizados com frequência. (Nesse caso, é meu dotfilesque eu quero a mesma e a versão mais recente em todas as minhas máquinas, onde quer que esteja trabalhando.)

bash -c 'eval `ssh-agent`; ssh-add /home/myname/.dotfiles/gitread; ssh-add -L; cd /home/myname/.dotfiles && git pull; kill $SSH_AGENT_PID'
  • Cria um agente ssh
  • Adicionar chave somente leitura ao agente
  • Alterar diretório para meu repositório git
  • Se o cdrepo dir tiver êxito, puxe do repo remoto
  • Mate o agente ssh gerado. (Eu não gostaria que muitos agentes permanecessem por aqui.)

1

para o gitlab RSAAuthentication yes

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

doc está aqui


não parece ser mencionado no link que você forneceu mais
rbennell


0

Se o número da porta SSH não é 22 (padrão), adicione Port xxem~/.ssh/config

No meu caso (sinologia),

Host my_synology
    Hostname xxxx.synology.me
    IdentityFile ~/.ssh/id_rsa_xxxx
    User myname
    Port xx

Em seguida, clone usando o título Host na configuração. ("my_synology". para evitar @chopstik 's "*")

git clone my_synology:path/to/repo.git

0

Se você é como eu, pode:

  • Mantenha suas chaves ssh organizadas

  • Mantenha seus comandos git clone simples

  • Manipule qualquer número de chaves para qualquer número de repositórios.

  • Reduza sua manutenção de chave ssh.

Eu mantenho minhas chaves na minha ~/.ssh/keys diretório.

Eu prefiro convenção do que configuração.

Eu acho que código é lei; quanto mais simples, melhor.

PASSO 1 - Criar alias

Adicione este alias ao seu shell: alias git-clone='GIT_SSH=ssh_wrapper git clone'

PASSO 2 - Criar Script

Adicione este script ssh_wrapper ao seu 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}" "$@"

EXEMPLOS

Use a chave github.com/l3x:

KEY=github.com/l3x git-clone https://github.com/l3x/learn-fp-go

O exemplo a seguir também usa a chave github.com/l3x (por padrão):

git-clone https://github.com/l3x/learn-fp-go

Use a chave bitbucket.org/lsheehan:

KEY=bitbucket.org/lsheehan git-clone git@bitbucket.org:dave_andersen/exchange.git

NOTAS

Altere o SSH_KEY padrão no script ssh_wrapper para o que você usa na maioria das vezes. Dessa forma, você não precisa usar a variável KEY na maioria das vezes.

Você pode pensar: "Ei! Isso está acontecendo muito com um apelido, um script e um diretório de chaves", mas para mim é uma convenção. Quase todas as minhas estações de trabalho (e servidores) estão configuradas da mesma forma.

Meu objetivo aqui é simplificar os comandos que executo regularmente.

Minhas convenções, por exemplo, scripts Bash, aliases etc., criam um ambiente consistente e me ajudam a manter as coisas simples.

BEIJO e nomes importam.

Para obter mais dicas de design, consulte o Capítulo 4 do SOLID Design no Go do meu livro: https://www.amazon.com/Learning-Functional-Programming-Lex-Sheehan-ebook/dp/B0725B8MYW

Espero que ajude. - Lex



0

O problema com esse método é que, pelo menos ao executar o bash.exe no Windows, ele cria um novo processo sempre que permanecer inativo.

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

Se você quiser usá-lo para sincronizar o repositório na programação, precisará adicionar "&& ssh-agent -k" no final.

Algo como:

ssh-agent bash -c 'ssh-add C:/Users/user/.ssh/your_key; git -C "C:\Path\to\your\repo" pull && ssh-agent -k' 

O ssh-agent -k matará o processo quando terminar.


0

Eu só precisava adicionar a chave e executar o clone git novamente.

ssh-add ~/.ssh/id_rsa_mynewkey
git clone git@bitbucket.org:mycompany/myrepo.git

-1

Aqui está o hack da chave ssh que encontrei ao encontrar a solução para esse problema:

Por exemplo, você tem 2 conjuntos diferentes de chaves:

key1, key1.pub, key2, key2.pub

Mantenha essas chaves em seu .sshdiretório

Agora no seu arquivo .bashrcou .bash_profilealias, adicione estes comandos

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'

Voila! Você tem um atalho para alternar as teclas quando quiser!

Espero que funcione para voce.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.