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.
Como se indica aquí: https://superuser.com/a/912281/607049
Puedes configurarlo por repo:
git config core.sshCommand "ssh -i ~/.ssh/id_rsa_example -F /dev/null"
git pull
git push
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
ygit push
utilizarán el comando especificado en lugar dessh
cuando necesiten conectarse a un sistema remoto.
El comando tiene la misma forma que la variable de entornoGIT_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
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 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