man ssh
sagt:
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.
Ich möchte, dass SSH ein Askpass-Programm verwendet, auch wenn es von einem Terminal ausgeführt wurde.
Gelegentlich muss ich eine Verbindung zu Servern herstellen, bei denen es zu Verzögerungen beim Anzeigen einer Kennwortabfrage kommt (möglicherweise aufgrund von Netzwerkproblemen, möglicherweise aufgrund versuchter Reverse-DNS-Suchvorgänge usw.). Ich ärgere mich und wechsle zu etwas anderem und vergesse den Verbindungsversuch. (Fügen Sie einen Witz über die Aufmerksamkeitsspanne eines Goldfisches ein.) Wenn ich endlich darauf zurückkomme, läuft die Eingabeaufforderung ab und sogar ein korrektes Passwort würde nur zu einer geschlossenen Verbindung führen.
Schlüssel wären eine Lösung, aber nicht jedes System, das ich verwende, verfügt über meine üblichen SSH-Schlüssel. Normalerweise verwende ich jedoch Ubuntu-Systeme und Ubuntu hat standardmäßig ein SSH-Askpass-Programm installiert.
Wenn jedoch ein Askpass-Fenster auftauchte, würde ich es sofort bemerken. Das ist ein guter Kompromiss für mich, wenn ich ihn nur zum Laufen bringen kann.
/dev/tty
(LD_PRELOAD
?).Antworten:
Dies wird etwas komplizierter sein, aber die Kombination mehrerer Teile wird es funktionieren lassen:
Erläuterung
Um
ssh
die Verwendung des$SSH_ASKPASS
Programms zu erzwingen , können Sie nicht zulassenssh
, dass das Original angezeigt wirdtty
. Es ist nur Bedingung. Dies kann durch Verwendensetsid
und Verwenden von-n
switch to erfolgenssh
.Dieser Fall würde eine Verbindung initiieren, aber Sie könnten nicht mit der Shell interagieren, was wahrscheinlich auch Ihre Anforderung ist;) (und auch Ihre lokale TTY unterbricht).
Sie können aber die "erste Sitzung" aufgeben. Sie sollten auch einen
-N
Schalter hinzufügen , der den Remote-Befehl unterdrückt und nur die Authentifizierung durchführt .Auch die mögliche Ausgabe "Junk" kann umgeleitet werden,
&> /dev/null
wenn Sie nicht daran interessiert sind.Einrichten
ControlMaster
inssh_config
. Es ist eine coole Funktion und sobald die Verbindung hergestellt ist, können Sie Sitzungen ziemlich schnell "starten". Dieser Ausschnitt~/.ssh/config
sollte das tun:Sie können das in einen
host
Block einfügen, in dem Ihre "langsamen Kandidaten" aufgeführt sind, oder einfach überall. Es ist fast kein Overhead.Letzte Zeile
Dann sollten Sie in der Lage sein, auf diese Weise eine Verbindung zu dem Host herzustellen, von dem Sie erwarten, dass er eine Weile dauert:
Der gesamte Prozess kann durch die
alias
Bash-Funktion vereinfacht oder beides in einem Schritt ausgeführt werden, bleibt jedoch der Vorstellungskraft des Lesers überlassen.Nur Befehlszeilenargumente
Sie können beide Dinge in der Befehlszeile ohne
ssh_config
Teil zusammenfügen:Die folgende Funktion sollte funktionieren, wenn keine SSH-Optionen angegeben sind:
-f
weist SSH an, kurz vor der Programmausführung in den Hintergrund zu treten, nachdem das Kennwort erhalten wurde.-w
weistsetsid
an, auf das Ende des Programms zu warten. In diesem Fall geschieht dies, wenn SSH in den Hintergrund tritt. In Kombination mitssh -f
kann das manuelle Warten zwischen den beiden SSH-Befehlen vermieden werden.quelle
ControlMaster
ist bereits eingerichtet, gerade weil es in solchen Fällen so schwierig ist, Passwörter einzugeben. Es sollte nicht schwierig sein, eine Funktion zu schreiben, die einen vorhandenen Master testet und den Askpass verwendet, wenn er keinen findet. Vielen Dank!A gemäß SSH-Handbuch (
man ssh
):Daher müssen Sie das Terminal trennen (z. B. durch Hinzufügen einer Pipe) und sicherstellen, dass
DISPLAY
es nicht festgelegt ist (wenn Sie stattdessen das Terminal für Ihre Passphrase verwenden möchten).Einfaches Beispiel:
Das gleiche mit
ssh-add
:quelle
Pseudo-terminal will not be allocated because stdin is not a terminal
, also scheint die Pfeife etwas zu tun.ssh </dev/null
hatte den gleichen Effekt. In beiden Fällen wird jedoch immer noch nach einem Kennwort gefragt, und ich kann immer noch eines eingeben. Ich habe es unter Linux und Mac versucht. Ich habe es versucht,ssh -vvv
aber es sagt nichts Nützliches aus.SSH_ASKPASS=/foo DISPLAY= setsid ssh host
funktioniert aber.