Questo sarà un po' più complicato, ma la combinazione di diversi pezzi lo farà funzionare:
Spiegazione
-
Per forzare
sshper usare$SSH_ASKPASSprogramma, non puoi consentiresshper vedere il verotty. È solo condizione. Questo può essere fatto usandosetside utilizzando-npassa 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
-Nswitch, che sopprimerà il comando remoto e farà solo l'autenticazione .Anche l'eventuale output "spazzatura" può essere reindirizzato a
&> /dev/nullse non ti interessa. -
Imposta
ControlMasterinssh_config. È una funzionalità interessante e una volta stabilita la connessione, puoi "avviare" le sessioni abbastanza velocemente. Questo frammento in~/.ssh/configdovrebbe farlo:ControlPath ~/.ssh/controlmasters/%example@unixlinux.online%h:%p ControlMaster auto ControlPersist 5mPuoi aggiungerlo in alcuni
hostblocca 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 "example@unixlinux.online"
}
-fordina a SSH di andare in background appena prima dell'esecuzione del programma, ovvero dopo che ha ottenuto la password.-wdicesetsidper 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
sshnon 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.