Especifique la key SSH privada que se utilizará al ejecutar el command del shell con o sin Ruby.

Una situación bastante inusual tal vez, pero quiero especificar una key SSH privada para utilizar al ejecutar un command 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 connection a un server remoto con Net :: SSH que usa una key privada especificada, pero este es un command 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 key cargada.

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

Ninguna de estas soluciones funcionó para mí.

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

SSH searchá el file ~/.ssh/config del usuario. Tengo la configuration 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 commands de git funcionan normalmente para mí.

 git push -v origin master 

NOTAS

  • IdentitiesOnly yes se requiere IdentitiesOnly yes para evitar el comportamiento pnetworkingeterminado de SSH de enviar el file de identidad que coincida con el nombre de file pnetworkingeterminado para cada protocolo. Si tiene un file 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 keys privadas SSH en un cliente
  • ¿Cómo podría detener a ssh ofreciendo una key 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 command simple (no se necesita ningún file de configuration):

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

Contenido de my_git_ssh_wrapper:

 #!/bin/bash ssh -i /path/to/ssh/secret/key $1 $2 

Entonces puedes usar la key 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 files de keys y luego olvidarse de eso, que también admite diferentes usuarios para el mismo host (por ejemplo, una count personal de GitHub y una de trabajo), que funciona en Windows también, es para editar ~/.ssh/config (o c:\Users\<your user>\.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 command regular git clone .

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

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

Archivo ~ / gitwrap.sh

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

Luego, en mi .bashrc, agregue lo siguiente:

 export GIT_SSH=~/gitwrap.sh 

Con git 2.10+ (Q3 2016: publicado el 2 de septiembre de 2016), tienes la posibilidad de configurar una configuration 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 configuration 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 command especificado en lugar de ssh cuando necesiten conectarse a un sistema remoto.
El command 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 

Es mejor idea agregar ese host o ip al file .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) PrefernetworkingAuthentications publickey IdentityFile ~/.ssh/id_rsa_(the key you want for this repo) 

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 

Cuando necesitas conectarte a github con una request 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 PrefernetworkingAuthentications 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 file de key ssh con el command git

El punto es que no hay ningún command 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 commands 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 / key 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 commands 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á include ssh y opciones en un script de shell.

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

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 key privada está en la unidad D, testing 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 count que openssh key privada y masilla key privada son diferentes!

Si ha creado sus keys con Puttygen, debe convertir su key privada en openssh.

Utilizo zsh y diferentes keys se cargan en el ssh-agent mi shell zsh automáticamente para otros fines (es decir, acceso a serveres 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 key de solo lectura al agente
  • Cambiar el directory 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 (pnetworkingeterminado), 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