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.
ssh myserver cat remote-file
alleine rennst? Was sehen Sie, wenn Sie das danach ausführenset -x
?test
wenn Sieecho test > /dev/tty
?ssh myserver cat remote-file
alleine laufe , funktioniert es wie erwartet,echo test > /dev/tty
funktioniert auch. Allerdings läuft mitset -x
Spucken 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.Antworten:
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 diescreen
Registerkarte einfügt. Es funktioniert mittrap
:und davor:
bash_set_title
ist 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
tty
Eingaben? Oder ist es nur ein Problem in einer Debug-Falle? Ich erinnere mich nicht an Probleme mit der regulärenstdin
Eingabe / 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.
sudo
Dies schlägt jedoch fehl, wenn sudo mit Schaltern wie aufgerufen wirdsudo -H -u user command
. Daher betrachte ich dies als Gelegenheit, diesen Code zu reparieren ...)quelle
bash
. Mit 3.0.16 reproduziere ich Ihren nicht, aber ich sehebash: child setpgid (24993 to 24990): Operation not permitted
beim Ausführen des Basisnamens. Mein Verdacht ist, dassssh
er 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 astrace -f
würde uns mehr sagen.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
Sie müssen sich nur authentifizieren, wenn Sie den
sshfs
Befehl ausführen . Danach sind die Remote-Dateien unter verfügbar~/myserver
, sodass Sie sich keinediff ~/myserver/path/to/remote-file local-file
Sorgen mehr machen müssen, dass eine der Dateien remote ist. Ausführen,fusermount -u ~/myserver
um 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
quelle