GNU/Linux >> Linux Esercitazione >  >> Linux

Posso fare in modo che SSH utilizzi un programma askpass anche se è stato eseguito da un terminale?

Questo sarà un po' più complicato, ma la combinazione di diversi pezzi lo farà funzionare:

Spiegazione

  1. Per forzare ssh per usare $SSH_ASKPASS programma, non puoi consentire ssh per vedere il vero tty . È solo condizione. Questo può essere fatto usando setsid e utilizzando -n passa a ssh .

    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.

  2. Imposta ControlMaster in ssh_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 dice setsid per attendere la fine del programma. In questo caso, ciò accade quando SSH va in background. Combinato con ssh -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.


Linux
  1. Differenza tra il programma di avvio Systemd e Terminal?

  2. Ssh – Hai bisogno di un Tty per eseguire Sudo se posso Sudo senza password?

  3. Come utilizzare SSMTP per inviare un'e-mail dal terminale Linux

  4. Come posso ottenere la data e l'ora correnti nel terminale e impostare un comando personalizzato nel terminale per questo?

  5. Come eseguire uno script .sh da qualsiasi percorso in un terminale?

Come utilizzare lo strumento di compressione 7zip dal terminale Linux

programma lynx non riesce con "Impossibile accedere al file di avvio"?

Come posso utilizzare SSH con un proxy SOCKS 5?

Come uscire da SSH di vagabondo nel terminale

Posso configurare la posta di sistema in modo che utilizzi un server SMTP esterno?

Come posso ottenere un binario da un file .py