Quiero ejecutar ssh-agent (con la opción de duración máxima), pero no agregar ninguna clave al inicio, sino agregarlas a pedido.
Como la primera vez que inicio sesión en algún servidor, debería solicitar una frase de contraseña; la próxima vez (a menos que haya esperado más de una hora) debería conectarse limpiamente:
ssh server1
Enter passphrase for key '/home/vi/.ssh/id_dsa':
server1> ...
ssh server2
server2> # no passphrase this time
# wait for lifetime
ssh server2
Enter passphrase for key '/home/vi/.ssh/id_dsa':
No quiero recordar manualmente cómo ejecutar 'ssh-add' cada vez. (por ejemplo, ingresó la frase de contraseña solo para ssh y "Oh, no la recuerda, es necesario volver a escribirla").
¿Cómo configurar ssh para agregar automáticamente la clave al ssh-agent si el usuario proporcionó la frase de contraseña?
Respuesta1
ssh admite agregar una clave al agente en el primer uso (desde la versión 7.2). Puede habilitar esa función colocando lo siguiente en ~/.ssh/config
:
AddKeysToAgent yes
Esto también funciona cuando se utilizan herramientas derivadas, como git.
Desde el7.2 registro de cambios:
- ssh(1): agregue una opción de cliente AddKeysToAgent que se puede configurar en "sí", "no", "preguntar" o "confirmar", y el valor predeterminado es "no". Cuando está habilitado, se agregará una clave privada que se usa durante la autenticación a ssh-agent si se está ejecutando (con la confirmación habilitada si está configurada en 'confirmar').
Respuesta2
Podrías hacer trampa y poner algo como alias ssh='ssh-add -l || ssh-add && ssh'
en tu .bashrc
/ .profile
. Esto primero se ejecuta ssh-add -l
, que puede devolver 0 (hay claves en el agente), 1 (no hay claves) o 2 (no se ejecuta ningún agente); si devuelve 0, ssh
se ejecutará; si es 1, ssh-add
se ejecutará y luego ssh
; si es 2, ssh-add
fallará y ssh
no se ejecutará. Reemplace &&
con ;
si desea ssh
ejecutar incluso cuando no haya ningún agente ejecutándose.
Respuesta3
Hasta que ssh admita auto-call-ssh-add, agregué esto en mi archivo .bashrc
, basado en la propuesta de Kovensky:
ssh-add -l >/dev/null || alias ssh='ssh-add -l >/dev/null || ssh-add && unalias ssh; ssh'
El alias se crea solo si no se agrega la identidad y el alias se destruye a sí mismo una vez que se ejecuta.
De esta manera, se utiliza el comando ssh normal después de agregar la identidad.
Respuesta4
Estoy usando la siguiente función de shell:
ssh() {
local possible_keys=($(/usr/bin/env ssh -G $@ | grep '^identityfile' \
| cut -d " " -f 2- | sed -e "s|^~|$HOME|"))
for k in $possible_keys; do
if [[ -f $k ]]; then
local fingerprint=$(ssh-keygen -lf $k)
ssh-add -l | grep -q "$fingerprint" || ssh-add $k
fi
done
/usr/bin/env ssh $@
return $?
}
Primero resuelve la configuración del host al que estoy intentando conectarme, luego agrega posibles claves para ese host al agente ssh si aún no se han agregado y finalmente se conecta al host. Estoy seguro de que se puede mejorar, así que estoy abierto a recibir comentarios.