Ce sera un peu plus compliqué, mais la combinaison de plusieurs éléments le fera fonctionner :
Explication
-
Pour forcer
ssh
utiliser$SSH_ASKPASS
programme, vous ne pouvez pas autoriserssh
pour voir le vraitty
. C'est juste un état. Cela peut être fait en utilisantsetsid
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. -
Configurer
ControlMaster
enssh_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
indiquesetsid
attendre la fin du programme. Dans ce cas, cela se produit lorsque SSH passe en arrière-plan. Combiné avecssh -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.