GNU/Linux >> Tutoriels Linux >  >> Linux

Puis-je faire en sorte que SSH utilise un programme askpass même s'il a été exécuté à partir d'un terminal ?

Ce sera un peu plus compliqué, mais la combinaison de plusieurs éléments le fera fonctionner :

Explication

  1. Pour forcer ssh utiliser $SSH_ASKPASS programme, vous ne pouvez pas autoriser ssh pour voir le vrai tty . C'est juste un état. Cela peut être fait en utilisant setsid et en utilisant -n passer à ssh .

    Ce cas initierait la connexion, mais vous ne seriez pas en mesure d'interagir avec le shell, ce qui est probablement aussi votre exigence ;) (et casse également votre TTY local).

    Mais vous pouvez renoncer à la "première séance". Vous devez également ajouter -N switch, qui supprimera la commande à distance et fera juste l'authentification .

    De plus, la sortie possible "junk" peut être redirigée vers &> /dev/null si cela ne vous intéresse pas.

  2. Configurer ControlMaster en ssh_config . C'est une fonctionnalité intéressante et une fois la connexion établie, vous pouvez "lancer" des sessions assez rapidement. Cet extrait en ~/.ssh/config devrait faire ça :

    ControlPath ~/.ssh/controlmasters/%[email protected]%h:%p
    ControlMaster auto
    ControlPersist 5m
    

    Vous pouvez ajouter cela dans certains host bloquer la liste de vos "candidats lents", ou juste partout. Il n'y a presque pas de frais généraux.

Ligne finale

Ensuite, vous devriez pouvoir vous connecter de cette manière à l'hôte qui devrait prendre un certain temps :

setsid ssh -nN host
# wait, insert password in the X11 prompt
ssh host
# will bring you directly to your session

L'ensemble du processus pourrait être simplifié par alias ou la fonction bash faisant les deux en une seule étape, mais cela est laissé à l'imagination des lecteurs.

Uniquement les arguments de ligne de commande

Vous pouvez joindre les deux choses ensemble sur la ligne de commande sans ssh_config partie :

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 fonction suivante devrait fonctionner lorsque les options SSH ne sont pas spécifiées :

ssh() {
    if ! command ssh -o PasswordAuthentication=no "$1" true
    then
        setsid -w ssh -fnN "$1"
    fi
    command ssh "[email protected]"
}
  • -f ordonne à SSH d'aller en arrière-plan juste avant l'exécution du programme, c'est-à-dire après avoir obtenu le mot de passe.
  • -w indique setsid attendre la fin du programme. Dans ce cas, cela se produit lorsque SSH passe en arrière-plan. Combiné avec ssh -f , l'attente manuelle entre les deux commandes SSH peut être éliminée.
  • La fonction suppose que le premier argument est le nom d'hôte.
  • Le test sert uniquement à empêcher les connexions SSH inutiles.

A selon le manuel SSH (man ssh ):

Si ssh n'a pas de terminal associé mais DISPLAY et SSH_ASKPASS sont définis, il exécutera le programme spécifié par SSH_ASKPASS.

Par conséquent, vous devez dissocier le terminal (par exemple en ajoutant un tuyau) et vous assurer que DISPLAY n'est pas défini (si vous souhaitez utiliser terminal pour votre phrase de passe à la place).

Exemple simple :

echo foo | SSH_ASKPASS=/my/cmd DISPLAY= ssh ...

Idem avec ssh-add :

$ echo foo | SSH_ASKPASS=/my/cmd DISPLAY= ssh-add id_rsa
ssh_askpass: exec(/my/cmd): No such file or directory

Avec OpenSSH 8.4, vous pouvez définir $SSH_ASKPASS_REQUIRE variable d'environnement à force . Citant la page de manuel 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.

Comme OpenSSH 8.4 est sorti le 27 septembre 2020, vous devrez attendre un peu pour que cette fonctionnalité soit disponible dans n'importe quelle distribution Linux majeure.


Linux
  1. Ssh - Définir les couleurs du terminal de la machine locale pour utiliser celles de la machine dans laquelle je me connecte avec Ssh ?

  2. Comment envoyer des frappes (f5) du terminal à un programme Gui ?

  3. Comment utiliser SSMTP pour envoyer un e-mail à partir d'un terminal Linux

  4. Comment puis-je obtenir la date et l'heure actuelles dans le terminal et définir une commande personnalisée dans le terminal pour cela ?

  5. Comment exécuter un script .sh à partir de n'importe quel chemin dans un terminal ?

Comment utiliser l'outil de compression 7zip à partir du terminal Linux

Exécuter un script shell dans un nouveau terminal à partir du terminal actuel

Comment puis-je obtenir des valeurs uniques à partir d'un tableau dans Bash ?

Échec du programme lynx avec "Impossible d'accéder au fichier de démarrage" ?

Puis-je récupérer un processus nano d'un terminal précédent ?

Comment puis-je obtenir un binaire à partir d'un fichier .py