Especifique la clave SSH privada para usar al ejecutar el comando de shell?

Una situación bastante inusual tal vez, pero quiero especificar una clave SSH privada para utilizar al ejecutar un comando de shell (git) desde la computadora local.

Básicamente así:

git clone git@github.com: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 git@github.com:TheUser/TheProject.git") end 

He visto ejemplos de conexión a un servidor remoto con Net :: SSH que usa una clave privada especificada, pero este es un comando local. ¿Es posible?

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

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

si prefiere las subcapas, puede intentar lo siguiente (aunque es más frágil):

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

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

Alternativamente, establecer HOME también puede ser útil, siempre que esté dispuesto a configurar un directorio que contenga solo un directorio .ssh como HOME ; esto puede contener un identity.pub o un archivo de configuración que establezca IdentityFile.

Ninguna de estas soluciones funcionó para mí.

En cambio, explico la mención de @Martin v. Löwis de establecer un archivo de config para SSH.

SSH buscará el archivo ~/.ssh/config del usuario. Tengo la configuración de la mía como:

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

Y añado un repository remoto de git:

 git remote add origin git@gitserv:myrepo.git 

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

 git push -v origin master 

NOTAS

  • IdentitiesOnly yes se requiere IdentitiesOnly yes 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 llamado ~/.ssh/id_rsa que se probará ANTES de su ~/.ssh/id_rsa.github sin esta opción.

Referencias

  • La mejor forma de usar varias claves privadas SSH en un cliente
  • ¿Cómo podría detener a ssh ofreciendo una clave incorrecta?

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

 Host github.com IdentityFile ~/.ssh/github_rsa 

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' git clone user@host:repo.git 

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 git@github.com:TheUser/TheProject.git 

Para resumir respuestas y comentarios , la mejor manera de configurar git para usar diferentes archivos de claves y luego olvidarse de eso, que también admite diferentes usuarios para el mismo host (por ejemplo, una cuenta personal de GitHub y una de trabajo), que funciona en Windows también, es para editar ~/.ssh/config (o c:\Users\\.ssh\config ) y especificar múltiples 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 

Luego, para clonar un proyecto como su usuario personal, simplemente ejecute el comando regular git clone .

Para clonar el repository como el workuser del workuser , ejecute git clone git@github-work:company/project.git .

Con git 2.10+ (Q3 2016: publicado el 2 de septiembre de 2016), tienes la posibilidad de configurar una configuración para GIT_SSH_COMMAND (y no solo una variable de entorno como se describe en la respuesta de Rober Jack Will )

Ver commit 3c8ede3 (26 Jun 2016) por Nguyễn Thái Ngọc Duy ( pclouds ) .
(Fusionada por Junio ​​C Hamano – gitster – in commit dc21164 , 19 de julio de 2016)

Se ha agregado una nueva variable de configuración core.sshCommand para especificar qué valor debe usar GIT_SSH_COMMAND por repository.

 core.sshCommand: 

Si se establece esta variable, git fetch y git push usarán el comando especificado en lugar de ssh cuando necesiten conectarse a un sistema remoto.
El comando está en la misma forma que la variable de entorno GIT_SSH_COMMAND y se reemplaza cuando se establece la variable de entorno.

Significa que el git clone puede ser:

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

Como se indica aquí: https://superuser.com/a/912281/607049

Puede configurarlo por repo:

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

Es mejor idea agregar ese host o ip al archivo .ssh/config forma:

 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) 

Fui con la variable de entorno GIT_SSH. Aquí está mi envoltorio, similar al de Joe Block desde arriba, pero maneja cualquier cantidad de argumentos.

Archivo ~ / gitwrap.sh

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

Luego, en mi .bashrc, agregue lo siguiente:

 export GIT_SSH=~/gitwrap.sh 

Cuando necesitas conectarte a github con una solicitud normal ( git pull origin master ), configurar el host como * en ~/.ssh/config funcionó para mí, cualquier otro host (por ejemplo, “github” o “gb”) wasn ‘ t trabajando

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

Muchas de estas soluciones parecían atractivas. Sin embargo, encontré el enfoque genérico git-wrapping-script en el siguiente enlace para ser el más útil:

Cómo especificar un archivo de clave ssh con el comando git

El punto es que no hay ningún comando git como el siguiente:

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

La solución de Alvin es usar una secuencia de comandos bash-wrapper bien definida que llene este espacio:

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

Donde git.sh es:

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

Puedo verificar que esto resolvió un problema que estaba teniendo con el reconocimiento de usuario / clave para un repository bitbucket remoto con git remote update git pull , git pull y git clone ; todo lo cual ahora funciona bien en una secuencia de comandos de trabajo cron que de lo contrario tenía problemas para navegar por la shell limitada. También pude llamar a este script desde R y aún así resolver exactamente el mismo problema de ejecución cron (por ejemplo, system("bash git.sh -i ~/.ssh/thatuserkey.pem pull") ).

No es que R sea lo mismo que Ruby, pero si R puede hacerlo … O 🙂

Podría usar la variable de entorno GIT_SSH. Pero deberá incluir ssh y opciones en un script de shell.

Vea el manual de git: man git en su shell de comandos.

El truco para mí fue usar git @ hostname en lugar de http: // hostname

En Windows con Git Bash, puede usar lo siguiente para agregar un repository ssh-agent bash -c 'ssh-add "key-address"; git remote add origin "rep-address"' ssh-agent bash -c 'ssh-add "key-address"; git remote add origin "rep-address"' por ejemplo: ssh-agent bash -c 'ssh-add /d/test/PrivateKey.ppk; git remote add origin git@git.test.com:test/test.git' ssh-agent bash -c 'ssh-add /d/test/PrivateKey.ppk; git remote add origin git@git.test.com:test/test.git' Cuál clave privada está en la unidad D, prueba de la carpeta de la computadora. Además, si desea clonar un repository, puede cambiar git remote add origin git clone con git clone .

¡Después de ingresar esto a Git Bash, te pedirá una frase de contraseña!

Tenga en cuenta que openssh clave privada y masilla clave privada son diferentes!

Si ha creado sus claves con Puttygen, debe convertir su clave privada en openssh.

Utilizo zsh y diferentes claves se cargan en el ssh-agent mi shell zsh automáticamente para otros fines (es decir, acceso a servidores remotos) en mi computadora portátil. Modifiqué la respuesta de @ Nick y la estoy usando para uno de mis repositorys que debe actualizarse a menudo. (En este caso, son mis dotfiles que quiero la misma y última versión en todas mis máquinas, donde sea que esté trabajando).

 bash -c 'eval `ssh-agent`; ssh-add /home/myname/.dotfiles/gitread; ssh-add -L; cd /home/myname/.dotfiles && git pull; kill $SSH_AGENT_PID' 
  • Engendrar un ssh-agente
  • Agregar clave de solo lectura al agente
  • Cambiar el directorio a mi git repo
  • Si cd to repo dir es exitoso, extraiga de repo remoto
  • Matar engendrado ssh-agent. (No me gustaría que muchos agentes permanezcan cerca).

para el gitlab RSAAuthentication yes

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

doc está aquí

Si el número de puerto SSH no es 22 (predeterminado), agregue Port xx en ~/.ssh/config

En mi caso (synology),

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

Luego clonar usando el título del Host en config. (“my_synology”. para evitar @chopstik ‘s “*”)

 git clone my_synology:path/to/repo.git