GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Kann ich SSH dazu bringen, ein askpass-Programm zu verwenden, selbst wenn es von einem Terminal aus ausgeführt wurde?

Das wird etwas komplizierter, aber die Kombination mehrerer Teile wird es funktionieren lassen:

Erklärung

  1. Um ssh zu erzwingen um $SSH_ASKPASS zu verwenden Programm können Sie ssh nicht zulassen um die echte tty zu sehen . Es ist nur Bedingung. Dies kann mit setsid erfolgen und mit -n wechseln Sie zu ssh .

    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.

  2. Richten Sie ControlMaster ein in ssh_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 sagt setsid warten, bis das Programm beendet ist. In diesem Fall passiert das, wenn SSH in den Hintergrund geht. Kombiniert mit ssh -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.


Linux
  1. Ssh – Stellen Sie die Terminalfarben des lokalen Computers so ein, dass sie die Farben des Computers verwenden, auf den ich ssh?

  2. So verwenden Sie SSMTP zum Senden einer E-Mail vom Linux-Terminal

  3. Wo kann ich Umgebungsvariablen festlegen, die crontab verwendet?

  4. Führen Sie ein Shell-Skript im neuen Terminal vom aktuellen Terminal aus

  5. Wie kann ich eindeutige Werte aus einem Array in Bash erhalten?

So verwenden Sie das 7zip-Komprimierungstool vom Linux-Terminal

Wie führe ich ein .sh-Skript von einem beliebigen Pfad in einem Terminal aus?

Wie kann ich SSH mit einem SOCKS 5-Proxy verwenden?

So beenden Sie SSH von Vagrant im Terminal

Kann ich einen Nano-Prozess von einem vorherigen Terminal wiederherstellen?

Kann ein Programm erkennen, dass es unter sudo ausgeführt wird?