Das wird etwas komplizierter, aber die Kombination mehrerer Teile wird es funktionieren lassen:
Erklärung
-
Um
ssh
zu erzwingen um$SSH_ASKPASS
zu verwenden Programm können Siessh
nicht zulassen um die echtetty
zu sehen . Es ist nur Bedingung. Dies kann mitsetsid
erfolgen und mit-n
wechseln Sie zussh
.Dieser Fall würde eine Verbindung initiieren, aber Sie könnten nicht mit der Shell interagieren, was wahrscheinlich auch Ihre Anforderung ist;) (und auch Ihr lokales TTY unterbricht).
Aber Sie können die "erste Sitzung" aufgeben. Sie sollten auch
-N
hinzufügen Schalter, der den Remote-Befehl unterdrückt und nur die Authentifizierung durchführt .Auch die mögliche Ausgabe "Müll" kann auf
&> /dev/null
umgeleitet werden wenn Sie daran nicht interessiert sind. -
Richten Sie
ControlMaster
ein inssh_config
. Es ist eine coole Funktion und sobald die Verbindung hergestellt ist, können Sie Sitzungen ziemlich schnell "anfeuern". Dieses Snippet in~/.ssh/config
sollte das tun:ControlPath ~/.ssh/controlmasters/%[email protected]%h:%p ControlMaster auto ControlPersist 5m
Sie können das in einige
host
einfügen Blockieren Sie Ihre "langsamen Kandidaten" oder einfach überall. Es ist fast kein Overhead.
Schlusszeile
Dann sollten Sie in der Lage sein, sich auf diese Weise mit dem Host zu verbinden, von dem Sie erwarten, dass es eine Weile dauern wird:
setsid ssh -nN host
# wait, insert password in the X11 prompt
ssh host
# will bring you directly to your session
Der gesamte Prozess kann durch alias
vereinfacht werden oder Bash-Funktion, die beides in einem Schritt macht, aber es bleibt der Fantasie des Lesers überlassen.
Nur Befehlszeilenargumente
Sie können beide Dinge auf der Befehlszeile ohne ssh_config
zusammenführen Teil:
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
Die folgende Funktion sollte funktionieren, wenn keine SSH-Optionen angegeben sind:
ssh() {
if ! command ssh -o PasswordAuthentication=no "$1" true
then
setsid -w ssh -fnN "$1"
fi
command ssh "[email protected]"
}
-f
weist SSH an, kurz vor der Programmausführung, also nachdem es das Passwort erhalten hat, in den Hintergrund zu gehen.-w
sagtsetsid
warten, bis das Programm beendet ist. In diesem Fall passiert das, wenn SSH in den Hintergrund geht. Kombiniert mitssh -f
, kann das manuelle Warten zwischen den beiden SSH-Befehlen eliminiert werden.- Die Funktion geht davon aus, dass das erste Argument der Hostname ist.
- Der Test dient nur dazu, unnötige SSH-Verbindungen zu verhindern.
Ein pro SSH-Handbuch (man ssh
):
Wenn ssh
kein Terminal zugeordnet ist, aber DISPLAY und SSH_ASKPASS gesetzt sind, wird es das durch SSH_ASKPASS angegebene Programm ausführen.
Daher müssen Sie das Terminal trennen (z. B. durch Hinzufügen einer Pipe) und sicherstellen, dass DISPLAY
ist nicht gesetzt (wenn Sie stattdessen Terminal für Ihre Passphrase verwenden möchten).
Einfaches Beispiel:
echo foo | SSH_ASKPASS=/my/cmd DISPLAY= ssh ...
Dasselbe gilt für ssh-add
:
$ echo foo | SSH_ASKPASS=/my/cmd DISPLAY= ssh-add id_rsa
ssh_askpass: exec(/my/cmd): No such file or directory
Mit OpenSSH 8.4 können Sie $SSH_ASKPASS_REQUIRE
setzen Umgebungsvariable auf force
. Zitat von ssh(1) Manpage:
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.
Da OpenSSH 8.4 am 27. September 2020 veröffentlicht wurde, müssen Sie etwas warten, bis diese Funktion in einer größeren Linux-Distribution verfügbar ist.