git - keygen - ¿Especificar clave SSH privada para usar cuando se ejecuta el comando de shell?




ssh-rsa key (12)

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

GIT_SSH_COMMAND='ssh -i private_key_file' git clone [email protected]:repo.git

Es posible que necesite un reinicio para el servicio ssh en su máquina.

Quizás sea una situación bastante inusual, pero quiero especificar una clave SSH privada para usar cuando se ejecuta un comando de shell (git) 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 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 [email protected]:user/project.git'

Si prefieres las subshells, 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 tendrá, a su vez, la llave cargada.

Alternativamente, configurar HOME también puede hacer el truco, siempre que esté dispuesto a configurar un directorio que contenga solo un directorio .ssh como HOME ; esto puede contener una identidad.pub o una configuración del archivo de configuración IdentityFile.


Con git 2.10+ (Q3 2016: publicado el 2 de septiembre de 2016), tiene la posibilidad de establecer una configuración para GIT_SSH_COMMAND (y no solo una variable de entorno como se describe en la answer )

Ver commit 3c8ede3 (26 de junio de 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 utilizar GIT_SSH_COMMAND por repositorio.

core.sshCommand:

Si se establece esta variable, git fetch y git push utilizarán el comando especificado en lugar de ssh cuando necesiten conectarse a un sistema remoto.
El comando tiene la misma forma que la variable de entorno GIT_SSH_COMMAND y se anula 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

Contenido de my_git_ssh_wrapper:

#!/bin/bash

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

Luego puedes usar la llave haciendo:

GIT_SSH=my_git_ssh_wrapper git clone [email protected]:TheUser/TheProject.git


En Windows con Git Bash puede usar lo siguiente para agregar un repositorio 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 [email protected]:test/test.git' ssh-agent bash -c 'ssh-add /d/test/PrivateKey.ppk; git remote add origin [email protected]:test/test.git' Qué clave privada está en la unidad D, prueba de carpeta de la computadora. Además, si desea clonar un repositorio, puede cambiar git remote add origin git clone con el git clone .

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

¡Tenga en cuenta que la clave privada opensh y la clave privada de masilla son diferentes!

Si ha creado sus claves con puttygen, debe convertir su clave privada a openssh!


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 "[email protected]"

Luego, en mi .bashrc, agregue lo siguiente:

export GIT_SSH=~/gitwrap.sh

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

Host github.com
  IdentityFile ~/.ssh/github_rsa

Ninguna de estas soluciones funcionó para mí.

En lugar de eso, elaboro sobre 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 mina como:

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

Y agrego un repositorio de git remoto:

git remote add origin [email protected]:myrepo.git

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

git push -v origin master

NOTAS

  • IdentitiesOnly yes es necesario para evitar que el comportamiento predeterminado de SSH de enviar el archivo de identidad 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


Para resumir las respuestas y los comments , la mejor manera de configurar git para usar diferentes archivos de claves y luego olvidarlo, que también es compatible con diferentes usuarios para el mismo host (por ejemplo, una cuenta de GitHub personal y una de trabajo), que funciona en Windows también, es 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 comando git clone regular.

Para clonar el repositorio como el workuser del workuser , ejecute git clone [email protected]:company/project.git .


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

En mi caso (sinología),

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

Luego clone usando el título del Host en la configuración. ("my_synology". para evitar @chopstik 's "*")

git clone my_synology:path/to/repo.git

Uso zsh y se cargan diferentes claves ssh-agent mi shell zsh 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 repositorios que debe actualizarse con frecuencia. (En este caso, son mis dotfiles que quiero igual y la ú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 repositorio git
  • Si cd to repo dir tiene éxito, extraiga del repositorio remoto
  • Mata al ssh-agente generado. (No querría que muchos de los agentes permanezcan por ahí).




ssh