¿Cómo especificar la clave SSH privada que se utilizará al ejecutar el comando Shell en Git?

Resuelto Christoffer asked hace 13 años • 41 respuestas

Quizás sea una situación bastante inusual, pero quiero especificar una clave SSH privada para usar al ejecutar un gitcomando de shell () desde la computadora local.

Básicamente así:

git clone [email protected]:TheUser/TheProject.git -key "/home/christoffer/ssh_keys/theuser"

O incluso mejor (en Ruby):

with_key("/home/christoffer/ssh_keys/theuser") do
  sh("git clone [email protected]:TheUser/TheProject.git")
end

He visto ejemplos de conexión a un servidor remoto Net::SSHque utiliza una clave privada específica, pero este es un comando local. ¿Es posible?

Christoffer avatar Dec 31 '10 02:12 Christoffer
Aceptado

Ninguna de estas soluciones funcionó para mí.

En lugar de eso, analizo la mención de @Martin v. Löwis sobre la configuración de un configarchivo para SSH.

SSH buscará el ~/.ssh/configarchivo del usuario. Tengo el mío configurado como:

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

Y agrego un repositorio git remoto:

git remote add origin git@gitserv:myrepo.git

(o clonar una copia nueva del repositorio con git@gitserv:myrepo.gituna dirección)

Y luego los comandos de git funcionan normalmente para mí.

git push -v origin master

Si tiene submódulos, también puede ejecutar lo siguiente en el directorio del repositorio para forzar a los submódulos a usar la misma clave:

git config url.git@gitserv:.insteadOf https://remote.server.com

NOTAS

  • Es IdentitiesOnly yesnecesario para evitar el comportamiento predeterminado de SSH de enviar el archivo de identidad que coincida con el nombre de archivo predeterminado para cada protocolo. Si tiene un archivo con ese nombre ~/.ssh/id_rsa, se probará ANTES de que ~/.ssh/id_rsa.githubno tenga esta opción.

  • AddKeysToAgent yesle permite evitar volver a ingresar la frase de contraseña clave cada vez.

  • También puedes agregar User gitpara evitar escribir git@cada vez.

Referencias

  • La mejor manera de utilizar varias claves privadas SSH en un cliente
  • ¿Cómo podría evitar que ssh ofrezca una clave incorrecta?
HeyWatchThis avatar Jun 28 '2012 19:06 HeyWatchThis

Algo como esto debería funcionar (sugerido por orip):

ssh-agent bash -c 'ssh-add /somewhere/yourkey; git clone [email protected]:user/project.git'

Si prefieres subcapas, puedes probar lo siguiente (aunque es más frágil):

ssh-agent $(ssh-add /somewhere/yourkey; git clone [email protected]:user/project.git)

Git invocará SSH que encontrará su agente por variable de entorno; esto, a su vez, tendrá la clave cargada.

Alternativamente, la configuración HOMEtambién puede funcionar, siempre que esté dispuesto a configurar un directorio que contenga solo un .sshdirectorio como HOME; Esto puede contener un archivo Identity.pub o un archivo de configuración que configure IdentityFile.

Martin v. Löwis avatar Dec 30 '2010 19:12 Martin v. Löwis

A partir de Git 2.3.0 también tenemos el comando simple (no se necesita ningún archivo de configuración):

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

Tenga en cuenta que -o IdentitiesOnly=yeses necesario para evitar el comportamiento predeterminado de SSH de enviar el archivo de identidad que coincida con el nombre de archivo predeterminado para cada protocolo, como se indica en la respuesta anterior.

Robert Jack Will avatar Apr 20 '2015 17:04 Robert Jack Will

Las sugerencias de otras personas ~/.ssh/configson muy complicadas. Puede ser tan simple como:

Host github.com
  IdentityFile ~/.ssh/github_rsa
philfreo avatar Sep 17 '2013 00:09 philfreo

Con git 2.10+ (tercer trimestre de 2016: lanzado el 2 de septiembre de 2016), tiene la posibilidad de establecer una configuración (GIT_SSH_COMMAND y no solo una variable de entorno como se describe en la respuesta de Rober Jack Will )

Véase el compromiso 3c8ede3 (26 de junio de 2016) de Nguyễn Thái Ngọc Duy ( pclouds) .
(Fusionado por Junio ​​C Hamano -- gitster-- en commit dc21164 , 19 de julio de 2016)

core.sshCommandSe ha agregado una nueva variable de configuración para especificar qué valor GIT_SSH_COMMANDusar por repositorio.

core.sshCommand:

Si esta variable está configurada, git fetchutilizará git pushel comando especificado en lugar de sshcuando necesiten conectarse a un sistema remoto.
El comando tiene el mismo formato que la GIT_SSH_COMMANDvariable de entorno y se anula cuando se establece la variable de entorno.

Significa que git pullpuede ser:

cd /path/to/my/repo/already/cloned
git config core.sshCommand 'ssh -i private_key_file' 
# later on
git pull

Al clonar un nuevo repositorio, donde aún no hay ninguno .git/configque modificar, primero puede configurarlo para un solo comando como git cloneo git submodule add:

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

Una vez que exista el repositorio, puede configurar la opción de forma permanente en .git/config:

cd <repo or submodule you just cloned>
git config core.sshCommand "ssh -i private_key_file"

Esto es más fácil que configurar una GIT_SSH_COMMANDvariable de entorno que, en Windows, como señaló Mátyás Kuti-Kreszács , sería

set "GIT_SSH_COMMAND=ssh -i private_key_file"

Para todos esos comandos, puede agregar un límite -o IdentitiesOnly=yespara limitar SSH a la clave pública/privada que está especificando:

git config core.sshCommand 'ssh -i private_key_file -o IdentitiesOnly=yes' 
# or
git -c core.sshCommand="ssh -i private_key_file -o IdentitiesOnly=yes" clone host:repo.git
# or
set "GIT_SSH_COMMAND=ssh -i private_key_file -o IdentitiesOnly=yes"

gsullins sugiere en los comentarios agregar al .zshrcsiguiente alias:

alias git.key1="git config core.sshCommand 'ssh -i <absolute path to private key>'"

Como señaló Jaredo Mills en un comentario :

Un problema: si refleja su repositorio en más de un host (Github, Gitlab), con diferentes claves privadas, este método enviará la clave incorrecta.
La clave no está asociada con el repositorio, sino con un nombre de usuario y un nombre de host. ~/.ssh/configes el lugar adecuado para conseguir la asociación adecuada y tiene las capacidades adecuadas para el trabajo (ver man ssh_config).

Consulte la respuesta de HeyWatchThis para obtener una ilustración.

VonC avatar Jul 20 '2016 06:07 VonC

Contenido de my_git_ssh_wrapper:

#!/bin/bash

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

Entonces puedes usar la clave haciendo:

GIT_SSH=my_git_ssh_wrapper git clone [email protected]:TheUser/TheProject.git
Joe Block avatar Feb 17 '2012 01:02 Joe Block