Questo sarà un po' più complicato, ma la combinazione di diversi pezzi lo farà funzionare:
Spiegazione
-
Per forzare
ssh
per usare$SSH_ASKPASS
programma, non puoi consentiressh
per vedere il verotty
. È solo condizione. Questo può essere fatto usandosetsid
e utilizzando-n
passa assh
.Questo caso avvierebbe la connessione, ma non saresti in grado di interagire con la shell, che probabilmente è anche un tuo requisito;) (e interrompe anche il tuo TTY locale).
Ma puoi rinunciare alla "prima sessione". Dovresti anche aggiungere
-N
switch, che sopprimerà il comando remoto e farà solo l'autenticazione .Anche l'eventuale output "spazzatura" può essere reindirizzato a
&> /dev/null
se non ti interessa. -
Imposta
ControlMaster
inssh_config
. È una funzionalità interessante e una volta stabilita la connessione, puoi "avviare" le sessioni abbastanza velocemente. Questo frammento in~/.ssh/config
dovrebbe farlo:ControlPath ~/.ssh/controlmasters/%[email protected]%h:%p ControlMaster auto ControlPersist 5m
Puoi aggiungerlo in alcuni
host
blocca l'elenco dei tuoi "candidati lenti" o semplicemente ovunque. Non è quasi un sovraccarico.
Riga finale
Quindi dovresti essere in grado di connetterti in questo modo all'host che prevedi ci vorrà un po':
setsid ssh -nN host
# wait, insert password in the X11 prompt
ssh host
# will bring you directly to your session
L'intero processo potrebbe essere semplificato da alias
o la funzione bash che fa entrambe le cose in un solo passaggio, ma è lasciata all'immaginazione dei lettori.
Solo argomenti della riga di comando
Puoi unire entrambe le cose insieme sulla riga di comando senza ssh_config
parte:
setsid ssh -nNMS ~/.ssh/masters/%C host
# wait, insert password in the X11 prompt
ssh -S ~/.ssh/masters/%C host
# will bring you directly to your session
La seguente funzione dovrebbe funzionare quando le opzioni SSH non sono specificate:
ssh() {
if ! command ssh -o PasswordAuthentication=no "$1" true
then
setsid -w ssh -fnN "$1"
fi
command ssh "[email protected]"
}
-f
ordina a SSH di andare in background appena prima dell'esecuzione del programma, ovvero dopo che ha ottenuto la password.-w
dicesetsid
per attendere la fine del programma. In questo caso, ciò accade quando SSH va in background. Combinato conssh -f
, l'attesa manuale tra i due comandi SSH può essere eliminata.- La funzione presuppone che il primo argomento sia il nome host.
- Il test serve solo a prevenire connessioni SSH non necessarie.
Un manuale SSH (man ssh
):
Se
ssh
non ha un terminale associato ma DISPLAY e SSH_ASKPASS sono impostati, eseguirà il programma specificato da SSH_ASKPASS.
Pertanto è necessario disassociare il terminale (ad es. aggiungendo una pipe) e assicurarsi che DISPLAY
non è impostato (se invece vuoi usare il terminale per la tua passphrase).
Esempio semplice:
echo foo | SSH_ASKPASS=/my/cmd DISPLAY= ssh ...
Lo stesso con ssh-add
:
$ echo foo | SSH_ASKPASS=/my/cmd DISPLAY= ssh-add id_rsa
ssh_askpass: exec(/my/cmd): No such file or directory
Con OpenSSH 8.4 puoi impostare $SSH_ASKPASS_REQUIRE
variabile d'ambiente a force
. Citando la pagina man di ssh(1):
SSH_ASKPASS_REQUIRE Allows further control over the use of
an askpass program. If this variable
is set to "never" then ssh will never
attempt to use one. If it is set to
"prefer", then ssh will prefer to use
the askpass program instead of the TTY
when requesting passwords. Finally, if
the variable is set to "force", then
the askpass program will be used for
all passphrase input regardless of
whether DISPLAY is set.
Poiché OpenSSH 8.4 è stato rilasciato il 27 settembre 2020, dovrai attendere un po' prima che questa funzionalità sia disponibile in qualsiasi delle principali distribuzioni Linux.