Come rendere ssh-agent aggiungere automaticamente la chiave su richiesta?


51

Voglio eseguire ssh-agent (con l'opzione di durata massima), ma non aggiungere alcuna chiave all'avvio, ma invece aggiungerli su richiesta.

Come la prima volta che accedo ad alcuni server, dovrebbe chiedere la passphrase, la prossima volta (a meno che non abbia atteso più di un'ora) dovrebbe connettersi in modo pulito:

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':

Non voglio ricordare manualmente di aver eseguito 'ssh-add' ogni volta. (ad es., inserire la passphrase solo per ssh e "Oh, non si è ricordato, è necessario digitare nuovamente").

Come configurare ssh per aggiungere automaticamente la chiave a ssh-agent se l'utente ha fornito la passphrase?


Risposte:


58

ssh supporta l'aggiunta di una chiave all'agente al primo utilizzo (dalla versione 7.2). È possibile abilitare quella funzione inserendo quanto segue ~/.ssh/config:

AddKeysToAgent yes

Questo funziona anche quando si usano strumenti derivati, come git.

Dal log delle modifiche 7.2 :

  • ssh (1): aggiunge un'opzione client AddKeysToAgent che può essere impostata su 'yes', 'no', 'ask' o 'confirm' e per impostazione predefinita è 'no'. Se abilitato, una chiave privata utilizzata durante l'autenticazione verrà aggiunta a ssh-agent se è in esecuzione (con la conferma abilitata se impostata su 'conferma').

Ciò richiede l'esecuzione di un agente ssh. Fare riferimento a stackoverflow.com/a/24347344/4573065 + i suoi commenti per un buon modo per avviarlo (solo una volta).
ST-DDT,

18

Potresti barare e mettere qualcosa di simile alias ssh='ssh-add -l || ssh-add && ssh'sul tuo .bashrc/ .profile. Questo viene eseguito per primo ssh-add -l, che può restituire 0 (ci sono chiavi sull'agente), 1 (nessuna chiave) o 2 (nessun agente in esecuzione); se restituisce 0, sshverrà eseguito; se 1, ssh-addverrà eseguito e quindi ssh; se 2, ssh-addfallirà e sshnon verrà eseguito. Sostituire &&con ;se si desidera ssheseguire anche quando non è in esecuzione alcun agente.


3
Richiederà passphrase alla chiave anche quando ulteriori comandi ssh non la usano.
Vi.

@Vi. vero, ma rari sono i comandi che non li usano (a meno che non ci si connetta a un server che utilizza la tastiera interattiva). La chiave sarà nell'agente ogni volta che ne avrai bisogno in seguito. Inoltre, l'alias fortunatamente (o sfortunatamente) non cambia gli usi backend di ssh (come con git o rsync).
Jessidhia,

2
(pensando di scrivere la patch auto-call-ssh-add per il client ssh)
Vi.

Sulla base di questa risposta è possibile creare un alias per un determinato host: alias ssh-hostname='(ssh-add -l | grep hostname > /dev/null) || ssh-add ~/.ssh/id_rsa_hostname && ssh -p 12345 username@hostname'. Potresti anche metterlo in un ciclo per tutti i tuoi tasti ssh e generare alias. Un trucco sporco, ma funziona.
dset0x

5

Fino a quando auto-call-ssh-add non è supportato da ssh, l'ho aggiunto nella mia .bashrc, in base alla proposta di Kovensky:

ssh-add -l >/dev/null || alias ssh='ssh-add -l >/dev/null || ssh-add && unalias ssh; ssh'

L'alias viene creato solo se l'identità non viene aggiunta e l'alias si distrugge una volta eseguito.

In questo modo il normale comando ssh viene utilizzato dopo l'aggiunta dell'identità.


Nel mio caso non funzionerà perché ssh-add ha anche il timeout configurato, ma l'idea è abbastanza buona.
Vi.

@Vi. In che modo un timeout influirebbe su questo? Sembra funzionare alla grande per me.
lanrat,

1
@lanrat, controlla se la chiave è presente in ssh-agent e configura l'alias in base alla presenza. Ma a causa del timeout ( ssh-add -t ...) la chiave aggiunta a ssh-agent potrebbe andare via bruscamente, ma e l'alias rimarrà in quanto la chiave è ancora in memoria.
Vi.

1

Sto usando la seguente funzione di 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 $?
}

Risolve innanzitutto la configurazione per l'host a cui sto tentando di connettermi, quindi aggiunge le chiavi possibili per quell'host all'agente ssh se non sono ancora state aggiunte e infine si connette all'host. Sono sicuro che può essere migliorato, quindi sono aperto al feedback.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.