keygen generate generar clave git bash shell ssh

git - generate - ssh-keygen-t rsa



¿Especificar clave SSH privada para usar cuando se ejecuta el comando de shell? (18)

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?


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

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


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


Cuando necesita conectarse 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") no estaba " t trabajando

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



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!


Es una mejor idea agregar ese host o ip al archivo .ssh/config así:

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


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

Host github.com IdentityFile ~/.ssh/github_rsa


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

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

El punto es que no hay un comando git como el siguiente:

git -i ~/.ssh/thatuserkey.pem clone [email protected]:/git/repo.git

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

git.sh -i ~/.ssh/thatuserkey.pem clone [email protected]:/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 repositorio remoto de bitbucket con git remote update , git pull y git clone ; todo lo cual ahora funciona bien en un script de trabajo cron que, de lo contrario, tenía problemas para navegar por el shell limitado. También pude llamar a este script desde R y seguir resolviendo exactamente el mismo problema de ejecución cron (por ejemplo, system("bash git.sh -i ~/.ssh/thatuserkey.pem pull") ).

No es que R sea igual a Ruby, pero si R puede hacerlo ... O :-)


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 git@gitserv: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 git@github-work:company/project.git .


Podrías usar la variable de entorno GIT_SSH. Pero tendrá que envolver ssh y opciones en un script de shell.

Consulte el manual de git: man git en su consola de comandos.


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í).

para el gitlab RSAAuthentication yes

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

doc esta aqui