man ssh
dit:
SSH_ASKPASS
If ssh needs a passphrase, it will read the passphrase from the
current terminal if it was run from a terminal. If ssh does not
have a terminal associated with it but DISPLAY and SSH_ASKPASS
are set, it will execute the program specified by SSH_ASKPASS
and open an X11 window to read the passphrase.
J'aimerais que SSH utilise un programme askpass même s'il était exécuté à partir d'un terminal.
À l'occasion, je dois me connecter à des serveurs, où il y a un certain retard dans l'affichage d'une invite de mot de passe (peut-être en raison de problèmes de réseau, peut-être en raison de tentatives de recherches DNS inversées,…). Je suis agacé et je passe à autre chose, et j'oublie la tentative de connexion. (Insérez une blague sur la durée d'attention d'un poisson rouge.) Quand j'y reviens enfin, le délai d'attente de l'invite et même un mot de passe correct entraîneraient simplement une connexion fermée.
Les clés seraient une solution, mais tous les systèmes que j'utilise n'ont pas mes clés SSH habituelles. Cependant, j'utilise généralement des systèmes Ubuntu et Ubuntu a un programme askpass SSH installé par défaut.
Si une fenêtre askpass apparaissait, cependant, j'en serais immédiatement conscient. C'est un assez bon compromis pour moi, si seulement je peux le faire fonctionner.
/dev/tty
(LD_PRELOAD
?).Réponses:
Ce sera un peu plus compliqué, mais la combinaison de plusieurs pièces le fera fonctionner:
Explication
Pour forcer
ssh
à utiliser le$SSH_ASKPASS
programme, vous ne pouvez pas permettressh
de voir le réeltty
. C'est juste une condition. Cela peut être fait en utilisantsetsid
et en utilisant le-n
commutateur versssh
.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 rompt également votre ATS local).
Mais vous pouvez renoncer à la "première session". Vous devez également ajouter un
-N
commutateur, qui supprimera la commande à distance et effectuera uniquement l'authentification .La sortie "indésirable" peut également être redirigée
&> /dev/null
si vous n'êtes pas intéressé.Installer
ControlMaster
dansssh_config
. C'est une fonctionnalité intéressante et une fois la connexion établie, vous pouvez "lancer" des sessions assez rapidement. Cet extrait~/.ssh/config
devrait faire cela:Vous pouvez ajouter cela dans un
host
bloc répertoriant vos "candidats lents", ou juste partout. Ce ne sont presque pas des frais généraux.Ligne finale
Ensuite, vous devriez pouvoir vous connecter de cette manière à l'hôte que vous attendez, cela prendra un certain temps:
L'ensemble du processus peut être simplifié par
alias
ou bash fonction faisant les deux en une seule étape, mais il 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:La fonction suivante devrait fonctionner lorsque les options SSH ne sont pas spécifiées:
-f
indique à SSH de passer en arrière-plan juste avant l'exécution du programme, c'est-à-dire après avoir obtenu le mot de passe.-w
indiquesetsid
d'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 source
ControlMaster
est déjà configuré, précisément parce qu'il est si difficile de saisir des mots de passe dans de tels cas. Il ne devrait pas être difficile d'écrire une fonction qui teste un maître existant et utilise le askpass s'il n'en trouve pas. Merci!Un par manuel SSH (
man ssh
):Par conséquent, vous devez dissocier le terminal (par exemple en ajoutant un tube) et vous assurer qu'il
DISPLAY
n'est pas défini (si vous souhaitez utiliser le terminal pour votre phrase secrète à la place).Exemple simple:
La même chose avec
ssh-add
:la source
Pseudo-terminal will not be allocated because stdin is not a terminal
, il semble donc que la pipe fasse quelque chose.ssh </dev/null
eu le même effet. Cependant, dans les deux cas, il demande toujours un mot de passe, et je peux toujours en saisir un. J'ai essayé sur Linux et Mac. J'ai essayéssh -vvv
mais ça ne dit rien d'utile.SSH_ASKPASS=/foo DISPLAY= setsid ssh host
fonctionne bien.