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



8 Answers

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 repositorio 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

Question

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?




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



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 tenía con el reconocimiento de usuario / clave para un repositorio 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 :-)




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



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



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)






Para resumir respuestas y comments , 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\<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 regular git clone .

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









Related