¿Cómo evitar que la contraseña para descifrar la clave privada se ingrese cada vez que se usa Git Bash en Windows?


125

Tengo un servicio de construcción automática que se descarga desde un repositorio privado git. El problema es que cuando intenta clonar el repositorio necesita proporcionar la contraseña, porque no se recuerda; así que como no hay interacción humana, espera para siempre la contraseña. ¿Cómo puedo forzarlo a recordar de id_rsa.pub?

Respuestas:


255

Para los usuarios de Windows, solo una nota de que así es como configuré el entorno de Git Bash para iniciar sesión una vez cuando lo inicio. Edito mi ~/.bashrcarchivo:

eval `ssh-agent`
ssh-add

Entonces, cuando comienzo Git Bash, parece que:

Welcome to Git (version 1.7.8-preview20111206)
(etc)
Agent pid 3376
Enter passphrase for /c/Users/starmonkey/.ssh/id_dsa:
Identity added: /c/Users/starmonkey/.ssh/id_dsa (/c/Users/starmonkey/.ssh/id_dsa)

Y ahora puedo enviar ssh a otros servidores sin iniciar sesión cada vez.


9
Si no tiene un archivo ~ / .bashrc, simplemente cree un nuevo archivo de texto (bloc de notas o algún otro editor) y agregue las dos líneas mencionadas por starmonkey.
pbz

77
'~' se refiere a su "directorio de inicio". En Windows, puede encontrar esto abriendo un shell de comando (cmd) y escribiendo "echo% USERPROFILE%".
Hawkeye Parker

14
Para mí, esta sintaxis no funciona. Tuve que escribir en su eval $(ssh-agent)lugar.
choque

1
Mi problema era que necesitaba especificar el archivo para que ssh-add lo usara. Probablemente porque tengo más de uno y no estaba usando el nombre predeterminado. Ejemplossh-add ~/.ssh/myfile_rsa
error de sintaxis el

1
copy > ~/.bashrcen git bash para crear el archivo bashrc en windows, ignore el error
Ruben

61

Esta respuesta explica cómo obtener el nombre de usuario y la contraseña de GitHub para que se almacenen permanentemente, no la frase de contraseña de la clave SSH.

En Windows, solo ejecuta

$ git config --global credential.helper wincred

Esto significa que la próxima vez que presione, ingresará su nombre de usuario y contraseña como de costumbre, pero se guardarán en las credenciales de Windows. No tendrá que ingresarlos nuevamente, después de eso.

Al igual que en Push to GitHub sin ingresar el nombre de usuario y la contraseña cada vez (Git Bash en Windows) .


2
después de este comando, debe escribir su nombre de usuario y contraseña.
Stephen Tun Aung

55
¿Esto pertenece a las claves SSH, o solo a la autenticación HTTPS (nombre de usuario y contraseña)? La pregunta parece ser sobre el uso de claves SSH.
Sean

Funcionó perfectamente para mí, supongo que estoy usando autenticación HTTPS (nombre de usuario y contraseña).
Jonatan

Ejecutar esto no produjo ningún resultado en absoluto.
user9993

@ user9993 No lo hará. Es un cambio de configuración, por lo tanto, aunque no se realizará ninguna salida, gitcambiará su comportamiento de acuerdo con el conjunto de directivas de configuración.
starbeamrainbowlabs

9

Prefiero no tener que escribir mi frase de contraseña SSH al abrir nuevas terminales; desafortunadamente, la solución de starmonkey requiere que se ingrese la contraseña para cada sesión. En cambio, tengo esto en mi .bash_profilearchivo:

# Note: ~/.ssh/environment should not be used, as it
#       already has a different purpose in SSH.

env=~/.ssh/agent.env

# Note: Don't bother checking SSH_AGENT_PID. It's not used
#       by SSH itself, and it might even be incorrect
#       (for example, when using agent-forwarding over SSH).

agent_is_running() {
    if [ "$SSH_AUTH_SOCK" ]; then
        # ssh-add returns:
        #   0 = agent running, has keys
        #   1 = agent running, no keys
        #   2 = agent not running
        ssh-add -l >/dev/null 2>&1 || [ $? -eq 1 ]
    else
        false
    fi
}

agent_has_keys() {
    ssh-add -l >/dev/null 2>&1
}

agent_load_env() {
    . "$env" >/dev/null
}

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

if ! agent_is_running; then
    agent_load_env
fi

# If your keys are not stored in ~/.ssh/id_rsa or ~/.ssh/id_dsa, you'll need
# to paste the proper path after ssh-add
if ! agent_is_running; then
    agent_start
    ssh-add
elif ! agent_has_keys; then
    ssh-add
fi

unset env

Esto también recordará mi frase de contraseña para nuevas sesiones de terminal; Solo tengo que escribirlo una vez cuando abro mi primer terminal después de arrancar.

Me gustaría dar crédito a donde obtuve esto; Es una modificación del trabajo de otra persona, pero no recuerdo de dónde vino. Gracias autor anónimo!

Actualización 2019-07-01: No creo que todo esto sea necesario. Ahora siempre tengo esto funcionando asegurándome de que mi .bash_profilearchivo ejecuta el agente ssh:

eval $(ssh-agent)

Luego configuré un ssharchivo de configuración como este:

touch ~/.ssh/config
chmod 600 ~/.ssh/config
echo 'AddKeysToAgent yes' >> ~/.ssh/config

Todavía me piden mi frase de contraseña cada vez.
Ryan

1
@ Ryan espera que la actualización que acabo de agregar aborde su problema. Mantengo la información actualizada en una publicación de blog en conan.is/blogging/clojure-on-windows.html , y me hice la misma pregunta en stackoverflow.com/questions/52423626/…
Conan el

Gracias, revisaré esto.
Ryan

@Conan La solución actualizada funciona por sesión bash. Después de cerrar mi sesión de bash en ejecución y abrir una nueva, nuevamente se me solicitó ingresar la contraseña.
Tushar Raj

5

Si entiendo la pregunta correctamente, ¿ya está utilizando una clave SSH autorizada en el servicio de compilación, pero desea evitar tener que escribir la frase de contraseña para cada clon?

Puedo pensar en dos formas de hacer esto:

  1. Si su servicio de compilación se inicia de forma interactiva: antes de iniciar el servicio de compilación, comience ssh-agentcon un tiempo de espera ( -topción) suficientemente largo . Luego use ssh-add(msysGit debería tener esos) para agregar todas las claves privadas que necesita antes de comenzar su servicio de compilación. Aún tendría que escribir todas las frases de contraseña, pero solo una vez por inicio de servicio.

  2. Si desea evitar tener que escribir las frases de contraseña, siempre puede eliminarlas de las claves SSH, como se describe en /server/50775/how-do-i-change-my- frase de contraseña de clave privada , estableciendo una nueva frase de contraseña vacía. Esto debería eliminar por completo la solicitud de contraseña, pero es aún menos segura que la opción anterior.


Gracias por la segunda opción, la necesitaba.
Stanislav Verjikovskiy

1

Cuando intenté insertar mi código, recibí el siguiente error:

$ git push origin dev

remote: Too many invalid password attempts. Try logging in through the website with your password.
fatal: unable to access 'https://naushadqamar-1@bitbucket.org/xxxx/xxxx-api.git/': The requested URL returned error: 403

Después de algunas horas de investigación, descubrí que necesito usar el siguiente comando:

$ git config --global credential.helper cache

Después de ejecutar el comando anterior, recibí el mensaje para ingresar mi nombre de usuario y contraseña de GitHub. Después de proporcionar las credenciales correctas, puedo insertar mi código.


Esto acaba de generar "git: 'credential-cache' no es un comando git". Sin embargo, "git config --global credential.helper store" funcionó: puede que no sea el mejor, pero me veo obligado a usar HTTPS en lugar de mi SSH preferido y solo quiero que funcione.
Terry Brown

0

La solución correcta es:

  1. Ejecute el terminal predeterminado de Windows - cmd y obtenga el directorio de su perfil maestro

    echo %USERPROFILE%
    
  2. Ejecute Git Bash en el directorio anterior y cree el .bashrcarchivo con el comando

    echo "" > .bashrc
    
  3. Abra el .bashrcarchivo con su editor de texto favorito y pegue el código de la Ayuda de GitHub en ese archivo:

    env=~/.ssh/agent.env
    ...
    COPY WHOLE CODE FROM URL - I can't add it to Stack Overflow because it breaks layout... OMG!
    
  4. Reinicie Git Bash y le pedirá su contraseña (solo la primera vez) y listo. No hay contraseña molestando de nuevo.


-1

Debe crear el authorized_keysarchivo en la .sshcarpeta del usuario con el que se va a conectar al servidor del repositorio. Por ejemplo, suponiendo que use el nombre buildservicede usuario repo.server, puede ejecutar:

cd ~buidservice
mkdir ./ssh
cat id_rsa.pub >> .ssh/authorized_keys

Luego debe verificar lo siguiente:

  1. Esa id_rsaclave privada correspondiente se presenta en builservice@build.server:~/.shh/id_rsa.

  2. Esa huella digital de repo.server se almacena en el buildservice@build.server:~/.ssh/known_hostsarchivo. Por lo general, eso se hará después del primer intento de sshconectarse a repo.server.


Se me olvida decir En Windows, su directorio de inicio probablemente sería C: \ Users \ Username
beduin el

55
Mmm .. Git bash lo tiene todo, lea más cuidadosamente el título de la pregunta. También de la pregunta supuse que el par de claves ya se ha generado (porque se le preguntó cómo forzar al servidor de repositorios a recordar id_rsa.pub). Perdón por el formateo.
beduin

1
Ok, nunca he oído hablar de 'git bash' antes. Perdón por eso
sehe

Supongo que esto está usando msysgit. Estoy agregando la etiqueta.
Adam Dymitruk

3
¡Advertencia! El uso cat id_rsa.pub > .ssh/authorized_keyssobrescribirá cualquier clave autorizada existente. Utilizar>> para agregar en lugar de sobrescribir.
David Pärsson el
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.