¿Cómo especificar la clave SSH privada que se utilizará al ejecutar el comando Shell en Git?
Quizás sea una situación bastante inusual, pero quiero especificar una clave SSH privada para usar al ejecutar un git
comando 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::SSH
que utiliza una clave privada específica, pero este es un comando local. ¿Es posible?
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 config
archivo para SSH.
SSH buscará el ~/.ssh/config
archivo 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.git
una 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 yes
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. Si tiene un archivo con ese nombre~/.ssh/id_rsa
, se probará ANTES de que~/.ssh/id_rsa.github
no tenga esta opción.AddKeysToAgent yes
le permite evitar volver a ingresar la frase de contraseña clave cada vez.También puedes agregar
User git
para evitar escribirgit@
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?
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 HOME
también puede funcionar, siempre que esté dispuesto a configurar un directorio que contenga solo un .ssh
directorio como HOME
; Esto puede contener un archivo Identity.pub o un archivo de configuración que configure IdentityFile.
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=yes
es 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.
Las sugerencias de otras personas ~/.ssh/config
son muy complicadas. Puede ser tan simple como:
Host github.com
IdentityFile ~/.ssh/github_rsa
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.sshCommand
Se ha agregado una nueva variable de configuración para especificar qué valorGIT_SSH_COMMAND
usar por repositorio.core.sshCommand:
Si esta variable está configurada,
git fetch
utilizarágit push
el comando especificado en lugar dessh
cuando necesiten conectarse a un sistema remoto.
El comando tiene el mismo formato que laGIT_SSH_COMMAND
variable de entorno y se anula cuando se establece la variable de entorno.
Significa que git pull
puede 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/config
que modificar, primero puede configurarlo para un solo comando como git clone
o 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_COMMAND
variable 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=yes
para 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 .zshrc
siguiente 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/config
es el lugar adecuado para conseguir la asociación adecuada y tiene las capacidades adecuadas para el trabajo (verman ssh_config
).
Consulte la respuesta de HeyWatchThis para obtener una ilustración.
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