¿Cómo hacer que ssh-agent agregue automáticamente la clave a pedido?

¿Cómo hacer que ssh-agent agregue automáticamente la clave a pedido?

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, sshse ejecutará; si es 1, ssh-addse ejecutará y luego ssh; si es 2, ssh-addfallará y sshno se ejecutará. Reemplace &&con ;si desea sshejecutar 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.

información relacionada