Verwenden Sie die tastaturinteraktive Authentifizierung, wenn Sie die SSH-Ausgabe an einen anderen Befehl weiterleiten

7

Ich möchte die Ausgabe von ssh an einen anderen Befehl weiterleiten. Zum Beispiel:

ssh myserver cat remote-file | diff local-file -

Das Problem ist, dass myserver nach einem Passwort fragt, ich es aber nicht eingeben kann. (Aus irgendeinem Grund ist die Authentifizierung mit öffentlichem Schlüssel auf dem Server nicht verfügbar. Ich kann dies nicht ändern.) Ich erhalte die Eingabeaufforderung "Kennwort:", aber die von mir eingegebenen Schlüssel werden wiedergegeben und nicht an ssh übergeben. Wie kann ich ssh dazu bringen, das Passwort zu bekommen?

Hinweis Ich versuche nicht, das Passwort in ssh weiterzuleiten . Ich versuche, die Ausgabe von ssh weiterzuleiten und das Passwort wie gewohnt einzugeben.

Falls es wichtig ist, verwende ich Bash unter OS X 10.7 (Lion) und dem Standardterminal. Ich habe keine Aliase eingerichtet, die dies verursachen könnten. Ich habe das gleiche Problem bei verschiedenen (Linux-) Systemen gesehen, daher glaube ich, dass es nicht spezifisch für mein Setup ist.

jdm
quelle
1
Bekommst du nicht dasselbe, wenn du ssh myserver cat remote-filealleine rennst? Was sehen Sie, wenn Sie das danach ausführen set -x?
Stéphane Chazelas
Sehen Sie , testwenn Sie echo test > /dev/tty?
Stéphane Chazelas
@StephaneChazelas: Danke, deine Kommentare haben mir geholfen, die Antwort herauszufinden! Wenn ich ssh myserver cat remote-filealleine laufe , funktioniert es wie erwartet, echo test > /dev/ttyfunktioniert auch. Allerdings läuft mit set -xSpucken eine Menge Müll aus. Es stellte sich heraus, dass ich meine Eingabeaufforderung angepasst hatte, um den Fenstertitel auf den aktuell ausgeführten Befehl zu setzen. Das hat eine Unterschale für jeden Befehl erstellt und das irgendwie durcheinander gebracht. Als ich die beleidigenden Zeilen auskommentierte, funktionierte es.
JDM

Antworten:

4

OK, es stellte sich heraus, dass dies auf eine bizarre Interaktion mit meiner Bash-Konfiguration zurückzuführen war.

Ich habe etwas in meinem .bash_profile, das den aktuell ausgeführten Befehl in den Fenstertitel oder die screenRegisterkarte einfügt. Es funktioniert mit trap:

trap 'bash_current_command' DEBUG

und davor:

function bash_current_command {
    # only works in bash > 3.1
    #set -- $BASH_COMMAND

    # for old bash
    set -- $(history 1)
    shift

    if [[ "$1" == "sudo" ]]; then
        cmd="*$(basename -- "$2")*"
    else
        cmd="$(basename -- "$1")"
    fi

    bash_set_title "$cmd"
}

bash_set_titleist eine kleine Funktion, die den Titel und den Symboltitel des aktuellen Terminals mithilfe von ANSI-Escape-Codes festlegt. Wie Sie sehen können, entstehen dadurch Unterschalen $(...), und meine Intuition sagte mir, dass dies das Problem sein könnte. In der Tat, nachdem ich diese Zeilen geändert hatte, funktionierte es!

Wenn jemand weiß, warum dies passiert, würde ich mich über Details freuen. Stehlen Subshells im Allgemeinen ttyEingaben? Oder ist es nur ein Problem in einer Debug-Falle? Ich erinnere mich nicht an Probleme mit der regulären stdinEingabe / Weiterleitung in Befehle.

(Wie Sie auch sehen können, gibt es ohnehin einige Probleme mit meiner Funktion - sie verwendet eine der Subshells als Problemumgehung, damit sie auf einer archaischen Bash-Version ausgeführt werden kann (ich bin auf einem Legacy-System festgefahren, aber immer noch gewollt eine einheitliche Konfiguration). Die andere Subshell wird verwendet, um den eigentlichen Befehl bei der Verwendung zu extrahieren. sudoDies schlägt jedoch fehl, wenn sudo mit Schaltern wie aufgerufen wird sudo -H -u user command. Daher betrachte ich dies als Gelegenheit, diesen Code zu reparieren ...)

jdm
quelle
Das klingt nach einem Fehler bash. Mit 3.0.16 reproduziere ich Ihren nicht, aber ich sehe bash: child setpgid (24993 to 24990): Operation not permittedbeim Ausführen des Basisnamens. Mein Verdacht ist, dass ssher sich nicht in der Vordergrundprozessgruppe des Terminals befindet und daher angehalten wird, wenn er versucht, das Echo zu deaktivieren. Deshalb können Sie Ihr Echo-Passwort sehen. Das Protokoll von a strace -fwürde uns mehr sagen.
Stéphane Chazelas
2

Diese Antwort erklärt Ihr spezifisches Problem nicht, bietet jedoch einige mögliche Problemumgehungen, die wahrscheinlich auch Ihr Leben angenehmer machen.

Wenn Sie ssh nur verwenden, um auf Remote-Dateien zuzugreifen und keine Remote-Befehle auszuführen, können Sie das Remote-Dateisystem über sshfs bereitstellen . Sie müssen zuerst FUSE für OS X und SSHFS installieren . (Ich weiß nicht, ob es Binärdistributionen für OSX gibt.) Führen Sie dann aus

mkdir ~/myserver
sshfs myserver:/ ~/myserver

Sie müssen sich nur authentifizieren, wenn Sie den sshfsBefehl ausführen . Danach sind die Remote-Dateien unter verfügbar ~/myserver, sodass Sie sich keine diff ~/myserver/path/to/remote-file local-fileSorgen mehr machen müssen, dass eine der Dateien remote ist. Ausführen, fusermount -u ~/myserverum die Bereitstellung des Dateisystems aufzuheben.

Ein anderer Ansatz, mit dem Sie sich einmal authentifizieren und dann viele ssh-Befehle ausführen können, besteht darin, eine Master-Verbindung einzurichten. Weitere Informationen zu wiederholten rsync-Befehlen finden Sie unter Wiederverwenden der ssh-Sitzung

Gilles 'SO - hör auf böse zu sein'
quelle