Cómo evitar que se me pida una frase de contraseña cada vez que presiono Bitbucket

217

Configuré mis cosas ssh con la ayuda de esta guía , y solía funcionar bien (podía correr hg pushsin que me pidieran una frase de contraseña). Lo que podría haber sucedido entre entonces y ahora, teniendo en cuenta que todavía estoy usando el mismo directorio de inicio.

$ cat .hg/hgrc 
[paths]
default = ssh://[email protected]/tshepang/bloog

$ hg push
Enter passphrase for key '/home/wena/.ssh/id_rsa': 
pushing to ssh://[email protected]/tshepang/bloog
searching for changes
...
tshepang
fuente

Respuestas:

337

Necesita usar un agente ssh. Respuesta corta: prueba

$ ssh-add

antes de empujar Proporcione su frase de contraseña cuando se le solicite.

Si aún no está ejecutando un agente ssh, recibirá el siguiente mensaje:

Could not open a connection to your authentication agent.

En esa situación, puede iniciar uno y configurar su entorno de esta manera

eval $(ssh-agent)

Luego repite el ssh-addcomando.

Vale la pena echar un vistazo a la página de manual del agente ssh .

jmtd
fuente
2
¿Cuál es el punto de la evalpodría simplemente escribir ssh-agent?
James McMahon
44
Muestra algunos comandos que le permiten usarlo y no los ejecuta por usted; evalhace lo excitante.
tshepang
No está relacionado con la pregunta original, pero si sigue teniendo estos problemas en GitHub, Bitbucket, etc., asegúrese de estar utilizando la URL git / ssh, no la http, que seguirá solicitando nombre de usuario + contraseña.
Czechnology
Y si usted no tiene una clave por defecto, o si desea añadir múltiplos,ssh-add /path/to/key
hoosierEE
46

Una forma de resolver esto es con ssh-agenty ssh-add:

$ exec ssh-agent bash
$ ssh-add
Enter passphrase for ~/.ssh/id_rsa: 

Después de esto, la frase de contraseña se guarda para la sesión actual. y no me volverán a preguntar.

stefano
fuente
77
La mayoría de la gente no quiere ser molestada por sus frases de paso.
connexo
26

Yo uso Keychain para administrar claves ssh. También está disponible en Debian y, presumiblemente, Ubuntu con

apt-get install keychain

Aquí está la página del paquete de llavero Debian . Como puede ver, el proyecto no es muy activo, pero funciona para mí. También comenté un poco sobre esto en otra respuesta aquí

Faheem Mitha
fuente
2
//, Esto funcionó para mí. Es mucho mejor que ssh-agent, ya que no necesito ingresar mi contraseña de clave ssh cada vez que abro un terminal .
Nathan Basanese
@NathanBasane, ¿estás diciendo que usando el llavero no necesitas ingresar la contraseña de la clave ssh cada vez que abres una terminal? ¿Cómo se configura eso? porque el llavero sigue pidiendo la contraseña cada vez que abro el terminal, solo la primera vez que lo abro después de arrancar, pero aún así. No quiero ingresar la frase de contraseña cada vez.
m4l490n el
@ m4l490n No, si está utilizando llavero, no debería necesitar ingresar la contraseña de la clave ssh cada vez que abra un terminal. Pero debe ingresarlo una vez después del arranque. La frase de contraseña no se guarda en el disco, eso sería inseguro.
Faheem Mitha
Para mí, pregunta cada vez que inicio sesión (tengo un repositorio git + claves ssh en un servidor remoto y cada vez que hago un "git pull" necesito ingresar la frase de contraseña)
Martin Thoma
@MartinThoma Eso se ve mal. Compruebe que ha configurado .ssh correctamente. En particular, ¿su shell está configurado correctamente? Si todavía no funciona para usted y no puede resolverlo, puede hacer una pregunta.
Faheem Mitha
13

Cree (o edite si existe) el siguiente archivo ~ / .ssh / config:

Host *
    UseKeychain yes
    AddKeysToAgent yes
    IdentityFile ~/.ssh/id_rsa
ness-EE
fuente
Pero estoy usando un par de claves diferente para cada servicio ...
connexo
@connexo puede reemplazar el asterisco comodín con su nombre de host individual y 'id_rsa' con su clave privada correspondiente
ness-EE
1
Necesitaba agregar IgnoreUnknown AddKeysToAgent,UseKeychainjusto arriba UseKeychain yes.
consideRatio
1
Recibo este error: "Mala opción de configuración: usekeychain" en la línea "UseKeychain yes".
m4l490n
@ m4l490n: parece que la UseKeychainopción se agregó en OpenSSH 7.1p2 (28/02/2016). Quizás tengas una versión anterior. openssh.com/txt/release-7.2
chus
6

Por conveniencia, el método óptimo es una combinación de las respuestas de jmtd y Faheem .

Usar ssh-agentsolo significa que se ssh-agentdebe crear una nueva instancia de cada nueva terminal que abra. keychaincuando se inicializa, pedirá la frase de contraseña para la (s) clave (s) privada (s) y la almacenará. De esa manera, su clave privada está protegida con contraseña, pero no tendrá que ingresarla una y otra vez.

El wiki de Arch recomienda inicializar el llavero desde /etc/profile.d/o su perfil de shell, como .bash_profileo .bashrc. Esto tiene la desventaja de que inicializa su llavero tan pronto como abre un terminal.

Un enfoque más flexible es combinarlo keychaincon una tmuxsesión específica . Entonces, en .bash_profile:

tsess=$(tmux ls 2>&1)

if [[ "${tsess%%:*}" = "secured" ]] && 
   [[ -f $HOME/.keychain/$HOSTNAME-sh ]]; then
    # start keychain
    /usr/bin/keychain -Q -q --nogui ~/.ssh/id_rsa
    . $HOME/.keychain/$HOSTNAME-sh
fi

... y luego es solo un caso de iniciar la tmuxsesión segura cuando sea necesario (iniciada desde una combinación de teclas):

#!/bin/bash
PID=$(pgrep tmux)
new="tmux -f $HOME/.tmux/conf new -s secured"
old="tmux attach -t secured -d"

if [[ -z "$SSH_AUTH_SOCK" ]]; then
    eval `ssh-agent`
    trap "kill $SSH_AGENT_PID" 0
fi

if [[ -z "$PID" ]]; then
    urxvtc -title "SSH" -e sh -c "${new}"
else
    urxvtc -title "SSH" -e sh -c "${old}"
fi

ssh-add

Ahora, su llavero solo se inicializará una vez cuando inicie esa tmuxsesión específica . Mientras esa sesión persista, podrá acceder a esas sshteclas y acceder a sus repositorios remotos.

jasonwryan
fuente
¿Cómo haría que esto funcione en una máquina remota? Modifiqué el segundo script para verificar $ SSH_CLIENT y, si existe, no ejecute urxvtc, solo tmux. Eso funciona, pero el problema es la porción .bash_profile. La primera vez que inicio sesión en el cuadro dice "servidor no encontrado: conexión rechazada", que es la salida de "tmux ls". Luego, cuando ejecuto el segundo script, tmux inicia una nueva sesión o se adjunta a una existente, pero no hay un aviso de llavero. Luego, cuando salgo de la sesión, el indicador del llavero está allí esperando.
jonyamo
He actualizado la respuesta para silenciar la salida de tmux si no hay sesión.
jasonwryan
Gracias, pero eso aún no resolvió el problema con el llavero. tmux crea la nueva sesión pero va directamente a cualquier mensaje vacío. Solo cuando salgo de la sesión de tmux veo el mensaje del llavero pidiendo mi frase de contraseña.
jonyamo
Supongo que debería dejar de decir llavero, ya que el llavero solo se ejecuta en .bash_profile. El problema es de ejecutar ssh-add. Aunque, si ejecuto ssh-add manualmente después de crear la sesión tmux, funciona.
jonyamo
1
Omita la segunda secuencia de comandos y simplemente inicie su sesión segura de tmux, de .profileesa manera obtendrá la solicitud de claves tan pronto como inicie sesión.
jasonwryan
0

Puedes usar sshpass:

$ sudo apt-get install sshpass
$ sshpass -p 'password' ssh username@server

Solo necesita agregar sshpass -p yourpassphraseantes de agregar su sshcomando habitual .

belka
fuente
2
Eso suena como una idea realmente estúpida. ¿No haría que su contraseña aparezca en texto claro en su historial de shell?
connexo
Exactamente, pero ¿no se supone que también debes proteger tu sesión con una contraseña?
belka
1
Incluso si lo hace, ¿con qué frecuencia tiene un colega sentado a su lado y ayudándolo / aprendiendo de usted?
connexo