Tal vez una situación bastante inusual, pero quiero especificar una clave SSH privada para usar 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 [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?
-i
opción como lassh
tiene.git config core.sshCommand 'ssh -i private_key_file'
. Vea mi respuesta a continuaciónRespuestas:
Algo como esto debería funcionar (sugerido por orip):
si prefiere subcapas, puede intentar lo siguiente (aunque es más frágil):
Git invocará SSH que encontrará su agente por variable de entorno; Esto, a su vez, tendrá la clave cargada.
Alternativamente, la configuración
HOME
también puede ser útil, siempre que esté dispuesto a configurar un directorio que contenga solo un.ssh
directorio comoHOME
; esto puede contener un identity.pub o un archivo de configuración que configura IdentityFile.fuente
ssh-agent bash -c 'ssh-add sshkey; git clone url'
ssh-agent $(..)
sintaxis no funciona para mí y no estoy seguro de cómo se supone que funciona: (ba) sh debería ejecutar$(..)
primero los comandos dentro , luego ejecutar ssh-agent con la salida como parámetro.Ninguna de estas soluciones funcionó para mí.
En cambio, me explayé sobre la mención de @Martin v. Löwis de configurar un
config
archivo para SSH.SSH buscará el
~/.ssh/config
archivo del usuario . Tengo la configuración mía como:Y agrego un repositorio remoto de git:
Y luego los comandos git funcionan normalmente para mí.
NOTAS
IdentitiesOnly yes
requiere para evitar el comportamiento predeterminado de SSH de enviar el archivo de identidad que coincide 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
fuente
Host remote.server.com
y seguir usando la URL originalchmod 600 ~/.ssh/config
(ver aquí ). Y si está utilizando GitHub, reemplaceHost gitserv
conHost github.com
, omitaHostname remote.server.com
y agregue control remoto congit remote add origin [email protected]:user_name/repo_name.git
.A partir de Git 2.3.0 también tenemos el comando simple (no se necesita un archivo de configuración):
fuente
cannot run ssh -i /home/vagrant/.ssh/git: No such file or directory
a pesar de que existe444 Nov 16 18:12 /home/vagrant/.ssh/git
desdels -l /home/vagrant/.ssh/git
chmod 400 <path-to-private-key-file>
. De lo contrario, el comando git puede fallar sin un mensaje de error especial ...-o IdentitiesOnly=yes
para asegurarse de que la clave especificada con-i
se utiliza (en lugar de una clave del agente SSH).Las sugerencias de otras personas
~/.ssh/config
son muy complicadas. Puede ser tan simple como:fuente
IdentitiesOnly
opción.git remote add ssh://personal/org/proj.git && git remote add ssh://corporate/org/proj.git
. Entonces su configuración se ve comoHost personal HostName github.com ... Host corporate HostName github.com
Contenido de my_git_ssh_wrapper:
Luego puede usar la clave haciendo:
fuente
GIT_SSH="git_wrapper" git clone ssh://user@server/path/to/project"
Con git 2.10+ (Q3 2016: lanzado 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 respuesta de Rober Jack Will )Ver commit 3c8ede3 (26 de junio de 2016) por Nguyễn Thái Ngọc Duy (
pclouds
) .(Fusionada por Junio C Hamano -
gitster
- en commit dc21164 , 19 jul 2016)Significa que
git clone
puede ser:Incluso puede configurarlo para un solo comando:
Esto es más fácil de establecer una
GIT_SSH_COMMAND
variable de entorno, que, en Windows, como se ha señalado por Mátyás-Kuti Kreszács , seríafuente
git -c core.sshCommand="ssh -i private_key_file" clone host:repo.git
seguido del conjunto de configuracióngit config core.sshCommand 'ssh -i private_key_file'
Para resumir las respuestas y los comentarios , la mejor manera de configurar git para usar diferentes archivos clave y luego olvidarse de él, 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 editar
~/.ssh/config
(oc:\Users\<your user>\.ssh\config
) y especificar múltiples identidades:Luego, para clonar un proyecto como usuario personal, simplemente ejecute el
git clone
comando .Para clonar el repositorio como
workuser
, ejecutagit clone git@github-work:company/project.git
.fuente
dandv
yworkuser
para apoyar mi ejemplo, "por ejemplo, una cuenta personal de GitHub y una cuenta de trabajo".dandv
es mi nombre de usuario de GitHub.IdentitiesOnly yes
a mi archivo de configuración ssh.Como se indica aquí: https://superuser.com/a/912281/607049
Puede configurarlo por repo:
fuente
-F /dev/null
hacer? Hasta donde puedo ver, esto cambiará configFile del~/.ssh/config
valor predeterminado, pero ¿por qué es eso deseado? Para garantizar un comando sandboxed?El problema es cuando tienes diferentes repositorios remotos en el mismo host (por ejemplo, github.com) y quieres interactuar con ellos usando diferentes claves ssh (es decir, diferentes cuentas de GitHub).
Para hacer eso:
Primero debe declarar sus diferentes claves en el
~/.ssh/config
archivo.Al hacer esto, asocia la segunda clave con un nuevo nombre descriptivo "XXX" para github.com.
Luego debe cambiar el origen remoto de su repositorio particular, para que use el nombre descriptivo que acaba de definir.
Vaya a su carpeta de repositorio local dentro de un símbolo del sistema y muestre el origen remoto actual:
Luego cambie el origen con:
Ahora puedes empujar, buscar ... con la tecla correcta automáticamente.
fuente
o
fuente
Una idea mucho mejor para agregar ese host o ip al
.ssh/config
archivo de esta manera:fuente
git clone git@gh-work:repo/project.git
en mi ~ / .ssh / config tengo dos secciones que usan github.com para HostName. Simplemente tienen IdentityFile y Host diferentes~/.ssh/config
pastebin.com/8rYn7yCiFui con la variable de entorno GIT_SSH. Aquí está mi contenedor, similar al de Joe Block desde arriba, pero maneja cualquier cantidad de argumentos.
Archivo ~ / gitwrap.sh
Luego, en mi .bashrc, agregue lo siguiente:
fuente
gitwrap.sh
, por ejemplo/home/ubuntu/gitwrap.sh
-o StrictHostKeyChecking=no
al comando sshSi ninguna de las otras soluciones aquí funciona para usted, y ha creado varias claves ssh, pero aún no puede hacer cosas simples como
luego, suponiendo que tenga dos archivos de clave ssh como
luego dentro del repositorio de git, intente:
y también asegúrese de que su nombre de usuario y ID de usuario predeterminados de github sean correctos:
Consulte https://gist.github.com/jexchan/2351996 para obtener más información.
fuente
Could not open a connection to your authentication agent.
, intente$ eval `ssh-agent -s`
e intente nuevamente.ssh-add
truco de comando funcionó para mí. Agrega la clave de identidad a la lista de aquellos que se prueban cuando ssh se autentica. ¡Esto funcionó bien para mí!ssh-add
?.git
dentro del repositorio, no el programa git a nivel mundial. Puede usar--global
para configurar el nombre de usuario global y el correo electrónico.Cuando es necesario conectar a github con una petición normal (
git pull origin master
), estableciendo el anfitrión como*
en el~/.ssh/config
trabajado para mí, cualquier otro host (por ejemplo, "github" o "GB") no estaba funcionando.fuente
Host my-host-alias
, tiene que configurarremote.origin.url=git@my-host-alias:[username]/[repo].git
.Muchas de estas soluciones parecían atractivas. Sin embargo, encontré que el enfoque genérico git-wrapping-script en el siguiente enlace es el más útil:
Cómo especificar un archivo de clave ssh con el
git
comandoEl punto es que no hay un
git
comando como el siguiente:La solución de Alvin es utilizar una secuencia de comandos bash-wrapper bien definida que llene este vacío:
Donde
git.sh
es:Puedo comprobar que este resolvió un problema que estaba teniendo con el reconocimiento de usuario / clave para un acuerdo de recompra bitbucket remoto con
git remote update
,git pull
ygit clone
; todo lo cual ahora funciona bien en unacron
secuencia de comandos de trabajo que, de lo contrario, tenía problemas para navegar por el shell limitado. También pude llamar a este script desde R y aún resolver exactamente lo mismocron
problema de ejecución (p. Ej.system("bash git.sh -i ~/.ssh/thatuserkey.pem pull")
).No es que R sea lo mismo que Ruby, pero si R puede hacerlo ... O :-)
fuente
GIT_SSH_COMMAND="ssh -i ~/.ssh/thatuserkey.pem" git clone clone [email protected]:/git/repo.git
según la respuesta de Robert Jack Will ?si tiene un directorio en su ruta donde desea firmar con un determinado archivo de identificación, puede especificar el uso de un archivo de identificación específico a través del archivo .ssh / config configurando, por
ControlPath
ejemplo:Luego
ssh
usará el archivo de identidad especificado al hacer comandos git bajo la ruta de trabajo dada.fuente
ControlMaster auto
yControlPersist yes
, por lo que no necesita volver a escribir la contraseña cada vez. Encontré la información en este artículoNecesita crear un ~ / .ssh / config como se muestra a continuación
permiso como abajo
Agregue su clave pública en su git (cat ~ / .ssh / id_rsa_pub [o nombre similar])
y luego git clone como a continuación
fuente
Muchas buenas respuestas, pero algunas de ellas suponen conocimientos previos de administración.
Creo que es importante enfatizar explícitamente que si comenzaste tu proyecto clonando la URL de la web ,
https://github.com/<user-name>/<project-name>.git
entonces debes asegurarte de que el
url
valor debajo de[remote "origin"]
en.git/config
se haya cambiado a la URL de SSH (ver el bloque de código a continuación).Además de eso, asegúrese de agregar lo
sshCommmand
que se menciona a continuación:Lea más sobre esto aquí .
fuente
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"'
por ejemplo: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 cambiargit remote add origin
congit clone
.Después de ingresar esto a Git Bash, ¡te pedirá una frase de contraseña!
¡Tenga en cuenta que la clave privada de openssh y la clave privada de masilla son diferentes!
Si ha creado sus claves con puttygen, ¡debe convertir su clave privada a openssh!
fuente
Podría usar la variable de entorno GIT_SSH. Pero deberá envolver ssh y opciones en un script de shell.
Vea el manual de git:
man git
en su shell de comandos.fuente
Utilizo
zsh
y las claves diferentes se cargan en mi shell zshssh-agent
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 necesita actualizarse a menudo. (En este caso, es eldotfiles
que quiero y la misma versión más reciente en todas mis máquinas, donde sea que esté trabajando).cd
directorio de repositorio tiene éxito, extraiga del repositorio remotofuente
para el gitlab
RSAAuthentication yes
el documento está aquí
fuente
Para que la variable de entorno GIT_SSH_COMMAND funcione en Windows en lugar de:
Utilizar:
La cita tiene que ser como
Algunos antecedentes: https://stackoverflow.com/a/34402887/10671021
fuente
Si el número de puerto SSH no es 22 (por defecto), añadir
Port xx
en~/.ssh/config
En mi caso (sinología),
Luego clone usando el título del Host en la configuración. ("my_synology". para evitar @chopstik 's "*")
fuente
Si eres como yo, puedes:
Mantenga sus claves ssh organizadas
Mantenga sus comandos git clone simples
Maneje cualquier cantidad de claves para cualquier cantidad de repositorios.
Reduzca el mantenimiento de su clave ssh.
Guardo mis llaves en mi
~/.ssh/keys
directorio.Prefiero la convención sobre la configuración.
Creo que el código es ley; cuanto más simple sea, mejor.
PASO 1 - Crear alias
Agregue este alias a su shell:
alias git-clone='GIT_SSH=ssh_wrapper git clone'
PASO 2 - Crear secuencia de comandos
Agregue este script ssh_wrapper a su RUTA:
EJEMPLOS
Use la clave github.com/l3x:
El siguiente ejemplo también usa la clave github.com/l3x (por defecto):
Use la clave bitbucket.org/lsheehan:
NOTAS
Cambie el SSH_KEY predeterminado en el script ssh_wrapper a lo que usa la mayor parte del tiempo. De esa manera, no necesita usar la variable KEY la mayor parte del tiempo.
Puede pensar: "¡Oye! Eso está sucediendo con un alias, un script y un directorio de teclas", pero para mí es una convención. Casi todas mis estaciones de trabajo (y servidores para el caso) están configuradas de manera similar.
Mi objetivo aquí es simplificar los comandos que ejecuto regularmente.
Mis convenciones, por ejemplo, secuencias de comandos Bash, alias, etc., crean un entorno coherente y me ayudan a simplificar las cosas.
El beso y los nombres importan.
Para obtener más consejos de diseño, consulte el Capítulo 4 Diseño SÓLIDO en Ir de mi libro: https://www.amazon.com/Learning-Functional-Programming-Lex-Sheehan-ebook/dp/B0725B8MYW
Espero que ayude. - Lex
fuente
Puede probar el paquete sshmulti npm para mantener varias claves ssh.
fuente
El problema con este método es, al menos cuando se ejecuta bash.exe en Windows, que creará un nuevo proceso cada vez que permanecerá inactivo.
Si desea usar eso para sincronizar el repositorio según lo programado, entonces debe agregar "&& ssh-agent -k" al final.
Algo como:
ssh-agent -k matará el proceso cuando esté hecho.
fuente
Solo necesitaba agregar la clave y luego ejecutar el clon git nuevamente.
fuente
Aquí está el truco de la clave ssh que encontré al encontrar una solución a este problema:
Por ejemplo, tiene 2 juegos de llaves diferentes:
key1, key1.pub, key2, key2.pub
Mantenga estas claves en su
.ssh
directorioAhora en su archivo
.bashrc
o.bash_profile
alias, agregue estos comandosalias key1='cp ~/.ssh/key1 id_rsa && cp ~/.ssh/key1.pub id_rsa.pub'
alias key2='cp ~/.ssh/key2 id_rsa && cp ~/.ssh/key2.pub id_rsa.pub'
Voila! ¡Tienes un atajo para cambiar las teclas cuando quieras!
Espero que esto funcione para usted.
fuente