Ejecutar SSH Agent al iniciar Git Bash en Windows


152

Estoy usando git bash. Tengo que usar

eval `ssh-agent.exe`
ssh-add /my/ssh/location/

cada vez que comienzo un nuevo git bash.

¿Hay alguna manera de configurar el agente ssh de forma permanente? ¿O Windows tiene una buena manera de administrar las claves ssh?

Soy un chico nuevo, por favor dame un tutorial detallado, ¡gracias!


3
es /my/ssh/location/igual a algo como /c/Users/Foobar/.ssh/?
Nick

Se ha publicado un problema similar en superuser.com/q/1238486/478378 que se resuelve ahora. El siguiente resumen contiene todos los detalles gist.github.com/jiggneshhgohel/afe96f0d57bdbf8beba305a73905402d . Gracias.
Jignesh Gohel

Respuestas:


138

En una sesión de Git Bash, se puede añadir una secuencia de comandos para ~/.profileo ~/.bashrc( con el ~que se suele establecer a%USERPROFILE% ), a fin de que dicha sesión se inicie automáticamente al ssh-agent. Si el archivo no existe, simplemente créelo.

Esto es lo que GitHub describe en " Trabajar con frases clave de SSH ".

La sección " Inicio automático de ssh-agent en Git para Windows " de ese artículo tiene una secuencia de comandos robusta que comprueba si el agente se está ejecutando o no. A continuación se muestra solo un fragmento, consulte el artículo de GitHub para obtener la solución completa.

# This is just a snippet. See the article above.
if ! agent_is_running; then
    agent_start
    ssh-add
elif ! agent_has_keys; then
    ssh-add
fi

Otros recursos:

" Hacer que ssh-agent funcione con git ejecutado desde el shell de comandos de Windows " tiene una secuencia de comandos similar, pero me referiría principalmente al artículo de GitHub anterior, que es más robusto y actualizado.


Una pequeña molestia que tuve fue que si supiera que no iba a usar git, no ingresaría la frase de contraseña de la clave ssh, y luego cada caparazón que abrí me lo pidió nuevamente. Este es el estado 1, el agente se ejecuta sin clave, por lo que puede eliminar ssh-add de esta sección y, si no ingresa su frase de contraseña la primera vez, no se le volverá a preguntar hasta que ejecute ssh-add manualmente.
Andy2K11

@Gordon ¿Qué parte de ese help.github.com/articles/working-with-ssh-key-passphrases GitHub ha cambiado? Su contenido todavía está allí, y todavía parece relevante para esta respuesta.
VonC

1
@ Andy2K11 Si desea ingresar la frase de contraseña la primera vez que la necesita, y no al abrir un shell, la forma más limpia para mí es eliminar el ssh-add del .bash_profile, como mencionó, y agregar "AddKeysToAgent yes" a su archivo .ssh / config (vea esta respuesta: superuser.com/a/1114257/523133 ). De esta manera, ni siquiera tiene que recordar haber ejecutado ssh-add.
endurecidos

30

PD: Estas instrucciones están en el contexto de un shell Bash abierto en Windows 10 Linux Subsystem y no menciona las claves SSH de enlace simbólico generadas en Windows con Bash en Ubuntu en Windows

1) Actualice su .bashrc agregando lo siguiente en él

# Set up ssh-agent
SSH_ENV="$HOME/.ssh/environment"

function start_agent {
    echo "Initializing new SSH agent..."
    touch $SSH_ENV
    chmod 600 "${SSH_ENV}"
    /usr/bin/ssh-agent | sed 's/^echo/#echo/' >> "${SSH_ENV}"
    . "${SSH_ENV}" > /dev/null
    /usr/bin/ssh-add
}

# Source SSH settings, if applicable
if [ -f "${SSH_ENV}" ]; then
    . "${SSH_ENV}" > /dev/null
    kill -0 $SSH_AGENT_PID 2>/dev/null || {
        start_agent
    }
else
    start_agent
fi

2) Luego ejecuta $ source ~/.bashrcpara recargar tu configuración.

Los pasos anteriores se han tomado de https://github.com/abergs/ubuntuonwindows#2-start-an-bash-ssh-agent-on-launch

3) Cree un archivo de configuración SSH, si no está presente. Use el siguiente comando para crear uno nuevo:.ssh$ touch config

4) Añadir siguiente a ~/.ssh/config

Host github.com-<YOUR_GITHUB_USERNAME> 
HostName github.com
User git
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_work_gmail # path to your private key
AddKeysToAgent yes


Host csexperimental.abc.com
IdentityFile ~/.ssh/id_work_gmail # path to your private key
AddKeysToAgent yes

<More hosts and github configs can be added in similar manner mentioned above>

5) Agregue su clave al agente SSH usando el comando $ ssh-add ~/.ssh/id_work_gmaily luego debería poder conectarse a su cuenta github o host remoto usando ssh. Por ejemplo, en el contexto de los ejemplos de código anteriores:

$ ssh github.com-<YOUR_GITHUB_USERNAME>

o

$ ssh <USER>@csexperimental.abc.com

Esta adición de clave al agente SSH debe realizarse solo una vez.

6) Ahora cierre la sesión de su sesión de Bash en el subsistema de Windows Linux, es decir, salga de todas las consolas de Bash nuevamente e inicie una nueva consola nuevamente e intente SSH a su Github Host u otro host configurado en el archivo de configuración SSH y debería funcionar sin necesidad de ningún extra pasos.

Nota:

Gracias.


1
Alternativa interesante, usando WSL. +1
VonC

@JigneshGohel Gracias, este script es perfecto y muy limpio. Sin embargo, me preguntaba, ¿por qué lo tienes >> "${SSH_ENV}"? ¿No debería ser así > "${SSH_ENV}"? El tuyo funciona, por supuesto, pero termina con un ~/.ssh/environmentarchivo cada vez más largo y lento , porque (¡como lo creo actualmente !?) no hay razón ... ¡Muchas, muchas gracias! Siento que este script solo debe incluirse en el valor predeterminado .bashrcpara WSL Ubuntu, ¡es muy útil!
MikeBeaton

5

Encontré que la forma más sencilla de lograr esto era usar Pageant como agente SSH y plink.

Debe tener una sesión de masilla configurada para el nombre de host que se utiliza en su control remoto.

También necesitará plink.exe, que se puede descargar desde el mismo sitio que putty.

Y necesita que se ejecute el concurso con su clave cargada. Tengo un acceso directo al concurso en mi carpeta de inicio que carga mi clave SSH cuando inicio sesión.

Cuando instala git-scm, puede especificar que use tortuga / plink en lugar de OpenSSH.

El efecto neto es que puede abrir git-bash cuando lo desee y empujar / tirar sin ser desafiado por frases de contraseña.

Lo mismo se aplica con las sesiones de masilla y WinSCP cuando el concurso tiene su clave cargada. Hace la vida mucho más fácil (y segura).


2

Como no me gusta usar masilla en Windows como solución alternativa, creé una utilidad muy simple ssh-agent-wrapper . Escanea tus carpetas .ssh y agrega todas tus claves al agente. Simplemente necesita ponerlo en la carpeta de inicio de Windows para que funcione.

supuestos :

  • ssh-agent en ruta
  • shh-add en ruta (ambos eligiendo la opción "ROJO" al instalar git
  • las claves privadas están en la carpeta% USERPROFILE% /. ssh
  • los nombres de claves privadas comienzan con id (por ejemplo, id_rsa)

¡Agradable! +1. Siempre trabajo con openssh (no masilla), por lo que es una solución interesante para claves privadas con frases de contraseña.
VonC

Como ya está en github, ¿por qué no hacer que la fuente sea un repositorio git?
Thorbjørn Ravn Andersen

Simplemente elimine los / releases de la ruta. ;-)
Erez A. Korn

1

No pude lograr que esto funcionara con la mejor respuesta, probablemente porque soy un novato de PC y me falta algo obvio. Pero solo para su información en caso de que ayude a alguien tan desafiado como yo, lo que FINALMENTE funcionó fue a través de uno de los enlaces aquí (referenciado en las respuestas). Esto implicó simplemente pegar lo siguiente a mi .bash_profile:

env=~/.ssh/agent.env

agent_load_env () { test -f "$env" && . "$env" >| /dev/null ; }

agent_start () {
    (umask 077; ssh-agent >| "$env")
    . "$env" >| /dev/null ; }

agent_load_env

# agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2= agent not running
agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?)

if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then
    agent_start
    ssh-add
elif [ "$SSH_AUTH_SOCK" ] && [ $agent_run_state = 1 ]; then
    ssh-add
fi

unset env

Probablemente tengo algo configurado extraño, pero no tuve éxito cuando lo agregué a mi .profileo .bashrc. El otro desafío real que he encontrado es que no soy administrador en esta computadora y no puedo cambiar las variables de entorno sin que sea aprobado por TI, por lo que esta es una solución para aquellos que no pueden acceder a eso.

Sabes que está funcionando si se te solicita tu contraseña ssh cuando abres git bash. Aleluya algo finalmente funcionó.


1

Ponga esto en su ~ / .bashrc (o en un archivo que se haya obtenido de él), lo que evitará que se ejecute varias veces innecesariamente por shell:

if [ -z "$SSH_AGENT_PID" ]; then
        eval `ssh-agent -s`
fi

Y luego agregue "AddKeysToAgent yes" a ~ / .ssh / config:

Host *
    AddKeysToAgent yes

ssh a su servidor (o git pull) normalmente y solo se le pedirá una contraseña / frase de contraseña una vez por sesión.


0

Cree un nuevo archivo .bashrc en su directorio ~.

Allí puede poner sus comandos que desea ejecutar cada vez que inicie el bash


Tiene que funcionar Intente poner algo simple a dicho .bashrcarchivo (como echo testy verifique si está cargado cuando ejecuta Git Bash.)
David Ferenczy Rogožan

También tenga en cuenta que ~ en PowerShell es probablemente diferente de ~ en Git Bash / Cygwin dependiendo de qué versión se instaló y las opciones de usuario especificadas.
dragon788

@Yar En Windows, coloque .bashrcen su carpeta de usuario, por ejemplo C:\Users\john.
Martin van Driel

0

Solución simple de dos cadenas de esta respuesta :

Para sh , bash , etc.

# ~/.profile
if ! pgrep -q -U `whoami` -x 'ssh-agent'; then ssh-agent -s > ~/.ssh-agent.sh; fi
. ~/.ssh-agent.sh

Para csh , tcsh , etc.

# ~/.schrc
sh -c 'if ! pgrep -q -U `whoami` -x 'ssh-agent'; then ssh-agent -c > ~/.ssh-agent.tcsh; fi'
eval `cat ~/.ssh-agent.tcsh`
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.