Nicht übereinstimmende Protokollversion - Ist Ihre Shell sauber?


55

Befolgen Sie die hier angegebenen Anweisungen zum Ausführen von rsync-Sicherungen: http://troy.jdmz.net/rsync/index.html

Ich erhalte die Fehlermeldung "Protokollversion stimmt nicht überein - ist Ihre Shell sauber?"

Ich habe irgendwo gelesen, dass ich die Eingabeaufforderung (PS1 = "") und die Motd-Anzeige (.hushlogin) zum Schweigen bringen musste, um damit fertig zu werden. Ich habe dies getan, die Eingabeaufforderung und das Anmeldebanner (MOTD) werden nicht mehr angezeigt, aber der Fehler wird weiterhin angezeigt, wenn ich Folgendes ausführe:

rsync -avvvz -e "ssh -i /home/thisuser/cron/thishost-rsync-key" remoteuser@remotehost:/remote/dir /this/dir/

Sowohl der ssh-Client als auch der sshd-Server verwenden Version 2 des Protokolls.

Woran könnte das liegen? Vielen Dank.

[BEARBEITEN] Ich habe http://www.eng.cam.ac.uk/help/jpmg/ssh/authorized_keys_howto.html gefunden, das darauf hinweist, dass es manchmal notwendig ist, "v2 zu erzwingen, indem man das Flag -2 verwendet, um ssh oder slogin auszuführen

 ssh -2 -i ~/.ssh/my_private_key remotemachine"

Es ist nicht klar, dass dies das Problem gelöst hat, da ich denke, dass ich diese Änderung NACH der Änderung des Fehlers in das System übernommen habe. Ich werde dies aktualisieren, wenn ich mehr erfahre. Und ich werde auf jeden Fall den Vorschlag versuchen, dies in einer Emacs-Shell auszuführen - danke.


1
Geben Ihre Anmeldeskripte etwas aus, das nicht sofort sichtbar ist, z. B. einen Befehl zum Ändern des Fenstertitels? Eine Möglichkeit, dies zu überprüfen, besteht darin, Emacs auszuführen, einzugeben ESC x shellund zu tun export TERM=xterm; ssh remotehost ls. Wenn Steuerzeichen oder andere falsche Ausgaben angezeigt werden, müssen Sie diese suchen.
Gilles 'SO- hör auf böse zu sein'

1
Ich hatte das gleiche Problem. In meinem Fall war der SSH-Server so konfiguriert, dass er Benutzer chroot und nur SFTP-Zugriff zulässt, sodass der Befehl rsync nicht über die Remote-Shell ausgeführt werden konnte. Wenn Sie Zugriff auf den Server haben, suchen Sie in / etc / ssh / sshd_config nach der ForceCommand-Konfigurationsoption. Wenn es auf etwas eingestellt ist, ist das das Problem.
Devius

Für den Rekord, ich bin in eine Situation geraten, in der ich gerade mit einer Protokollinkongruenz aufgegeben habe. rsync - Versionsausgabe auf beiden Hosts identisch, interaktives und nicht interaktives ssh völlig geräuschlos, nichts Besonderes an authorized_keys ... Funktioniert einfach nicht. Ich hinterlasse diesen Kommentar für andere, die Rabbibt Holing sind. Tu dir selbst einen Gefallen und versuche es ohne --rsync-Pfad. Sie werden wahrscheinlich feststellen, dass Ihr Problem nichts mit diesem SO zu tun hat.
Sheldonh

@sheldonh: Hat sich der Pfad auf der lokalen und der entfernten Maschine in Ihrem Fall unterschieden? in meinem Fall sind sie sowieso gleich und geben oder nicht geben ( --rsync-path) ändert nichts für mich.
0xC0000022L

1
@ 0xC0000022L Entschuldigung, ich kann mich nicht erinnern.
Sheldonh

Antworten:


62

Eines Ihrer Anmeldeskripte (.bashrc / .cshrc / etc.) Gibt wahrscheinlich Daten an das Terminal aus (wenn dies nicht der Fall sein sollte). Dies verursacht einen ssh-Fehler, wenn die Verbindung hergestellt und das Kopieren vorbereitet wird, da zusätzliche Daten empfangen werden, die nicht erwartet werden. Entfernen Sie die in den Startskripten generierte Ausgabe.

Sie können überprüfen, ob Ihr Terminal interaktiv ist und nur Text ausgeben, indem Sie den folgenden Code in einem bashrc verwenden. Etwas Äquivalentes gibt es auch für andere Shells:

if shopt -q login_shell; then
    [any code that outputs text here]
fi

oder alternativ wie folgt , da der spezielle Parameter -enthält, iwann die Shell interaktiv ist:

if echo "$-" | grep i > /dev/null; then
    [any code that outputs text here]
fi

Weitere Informationen finden Sie unter: Rsync über SSH von Linux zu Windows SBS 2003-Protokoll stimmt nicht überein

Um dies zu diagnostizieren, stellen Sie sicher, dass das Folgende die Ausgabe ist, die Sie erhalten, wenn Sie in den Host sshen:

USER@HOSTNAME's password: 
Last login: Mon Nov  7 22:54:30 2011 from YOURIP
[USER@HOSTNAME ~]$ 

Wenn Sie neue Zeilen oder andere Daten erhalten, wissen Sie, dass zusätzliche Ausgaben gesendet werden. Sie könnten Ihr .bashrc / .cshrc / .profile / etc umbenennen. Dateien an etwas anderes, damit sie keine zusätzliche Ausgabe ausgeben. Natürlich gibt es immer noch Systemdateien, die dies verursachen könnten. Überprüfen Sie in diesem Fall bei Ihrem Systemadministrator, ob die Systemdateien keine Daten ausgeben.


5
Ein echoin der ~/.bashrc, Thx. Du hast meinen Tag gemacht
user9869932

19

Es gibt eine einfache Möglichkeit zu testen, ob Ihre Shell für eine ssh-Verbindung sauber ist: Führen Sie einen Befehl über die ssh-Verbindung aus, anstatt eine interaktive Shell zu starten. Der falseBefehl wird sofort beendet, ohne dass eine Ausgabe erfolgt. Dies ist also ein guter Test:

bash$ ssh remotehost false
Enter passphrase for key '/home/user/.ssh/my_private_key': 
bash$

Wenn diese Befehlszeile eine Ausgabe erzeugt, ist eines Ihrer Startskripte schuld:

bash$ ssh remotehost false
Enter passphrase for key '/home/user/.ssh/my_private_key': 
Welcome to RemoteHost!

This system is company property and is provided for authorized use only, 
as set forth in applicable written policies. Unauthorized use is prohibited 
and may be subject to discipline, civil suit and criminal prosecution.

Welcome back - You last logged in 16 days ago...
bash$

Eine andere Sache, um zu überprüfen, ob Sie diesen Fehler bekommen, ist, ob rsync von ssh installiert und auffindbar ist:

bash$ ssh remotehost "rsync --version"
Enter passphrase for key '/home/user/.ssh/my_private_key': 
rsync  version 3.0.9  protocol version 30
Copyright (C) 1996-2011 by Andrew Tridgell, Wayne Davison, and others.
Web site: http://rsync.samba.org/
Capabilities:
    64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints,
    socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace,
    append, ACLs, xattrs, iconv, symtimes

rsync comes with ABSOLUTELY NO WARRANTY.  This is free software, and you
are welcome to redistribute it under certain conditions.  See the GNU
General Public Licence for details.
bash$

Wenn sich rsync nicht im Pfad befindet, wird stattdessen Folgendes angezeigt:

bash$ ssh remotehost "rsync --version"
Enter passphrase for key '/home/user/.ssh/my_private_key': 
bash: rsync: command not found
bash$

Sie können dies beheben, indem Sie entweder rsync installieren oder wenn es an einem ungewöhnlichen Ort installiert ist, den Ort an die rsync-Befehlszeile übergeben:

rsync -avvvz -e "ssh -i /home/thisuser/cron/thishost-rsync-key" \
    --rsync-path="/usr/local/bin/rsync" \
    remoteuser@remotehost:/remote/dir /this/dir/

7

Dies wird häufig dadurch verursacht, dass die Anmeldedaten Ihrer Shell Daten auf einer nicht interaktiven Shell ausgeben. Sie können testen, ob dies der Fall ist, indem Sie folgende Schritte ausführen:

ssh username@host "/bin/true" > testfile
ls -l testfile

Wenn die Testdatei NICHT 0 Byte groß ist, liegt das Problem darin, dass Ihre Shell etwas ausgibt. Überprüfen Sie /etc/profile, .profile, .bashrc, .cshrc, usw. Wenn ja, können Sie es ändern zu überprüfen , ob Ihr Terminal ist interaktiv und nur Ausgabetext , indem Sie den folgenden Code in einer bashrc verwenden. Etwas Äquivalentes gibt es auch für andere Shells:

if shopt -q login_shell; then
    [any code that outputs text here]
fi

oder alternativ wie folgt , da der spezielle Parameter -enthält, iwann die Shell interaktiv ist:

if echo "$-" | grep i > /dev/null; then
    [any code that outputs text here]
fi

Wenn die Testdatei tatsächlich 0 Byte groß ist, verhält sich Ihre Shell zwar so, aber es ist möglich, dass Sie nur eine sehr alte Version von rsync haben. Sie können das Client-Ende anweisen (vorausgesetzt, es ist das neuere Ende), keine so hohe Version zu bewerben, dass die alte Version von rysnc server sie nicht erkennt. Sie können dies mit der --protocol=Option tun . In meinem Fall hat die Verwendung --protocol=30den Trick getan.

Wenn Sie immer noch Probleme haben, versuchen Sie es mit ssh in, während der Benutzer rsysnc eine Verbindung herstellt, und versuchen Sie, ausgeführt rsync --versionzu werden, um festzustellen, ob die Shell rsync finden kann. Wenn Sie eine Meldung erhalten, dass der Befehl nicht gefunden wurde, ist rsync möglicherweise nicht auf dem Computer installiert, zu dem Sie eine Verbindung herstellen, oder befindet sich nicht im Pfad. Rsync verfügt über Optionen zum Angeben des Pfads des Remote-Endes. Lesen Sie die Manpage (s).


+1 für den Hinweis, --protocolwelcher mein Problem mit einem 2.5.6-Server (Protokollversion 26) und einem 3.1.0-Client (Protokollversion 31)
gelöst hat

4

Dies ist ein Sonderfall gegenüber den anderen Antworten, der sich jedoch nicht wesentlich von diesem unterscheidet.

Um einen rsync über ssh auszuführen, benötigen Sie Shell-Zugriff in ssh, um den Remote-Befehl rsync auszuführen. Wenn Ihr ssh-Konto nur scp / sftp zulässt, können Sie das Entfernen von rsync nicht starten, und dieser Fehler tritt nicht auf.

Dies kann mit dem gleichen Befehl wie oben getestet werden

ssh remotehost false

Dieser sollte scheitern und dieser sollte Erfolg haben

sftp remotehost

Dies zeigt, dass Sie nur über SFTP-Zugriff verfügen.

Wenn Sie möchten , und Berechtigungen , dies zu tun haben, können Sie die SFTP nur Zugang für den Benutzer deaktivieren, durch die Bearbeitung /etc/ssh/sshd_configund prüfen , ob match und forcecommandEinträge.

Sie können auch diesen Beitrag überprüfen


4

Ich habe protocol version mismatch -- is your shell clean?einfach bekommen, weil ich rsync am anderen Ende noch nicht installiert hatte . sudo yum install rsyncProblem gelöst.


Verbrachte 30 Minuten damit, mit einem Container herumzuspielen und Ansible fragte sich, warum rsync nicht funktionierte ... damit es funktioniert, wenn es nicht installiert ist! Danke;)
Ryan Fisher

2

Die Eingabeaufforderung wird überhaupt nicht angezeigt, wenn ein Befehl direkt ausgeführt wird, und zwar nicht interaktiv. Ein einfaches Google zeigt das erste Ergebnis an: http://marc.info/?l=rsync&m=100263876212594&w=2 Und da die Shell möglicherweise aufgerufen werden kann, darf sie im nicht interaktiven Modus nichts anzeigen - wie bei der Eingabe von "Nur". bash "in eine vorhandene Eingabeaufforderung ein, es sollte nur die neue Eingabeaufforderung angezeigt werden.


Vielleicht habe ich es nicht klar genug ausgedrückt, aber ich habe diese "Eingabeaufforderung (PS1 =" ") und motd (.hushlogin)" bereits ausgeführt. Das Login zeigt in der Tat keine Aufforderung. Trotzdem tritt der Protokollfehler weiterhin auf. Vielen Dank für den Vorschlag.
Freitag,

Sie haben dies im Grunde genommen bereits erwähnt, aber ich hatte Probleme wie dieses, wenn irgendetwas in der .bashrc-Datei (oder einem anderen Profilskript) den Bildschirm wiedergibt. Ich hatte sogar diese Art von Problem, als ich bestimmte Programme in der Shell ausführte, die die Dinge auf eine bestimmte Weise änderten (zum Beispiel konnte ich meine Shell nicht mit chsh ändern, also ließ ich meine .cshrc-Bash ausführen, um meine zu ändern Shell, und ssh würde nicht mehr funktionieren).
6.

Na das ist sicher interessant. Ich frage mich, wie ich dies diagnostizieren könnte, da die interaktive Ausführung des Befehls rsync nichts auf dem Bildschirm wiedergibt und die Anmeldung vollständig stumm ist. Hmmm ... ich frage mich, ob etwas mit der Shell nicht stimmt, wie Sie vorschlagen. Vielen Dank.
Freitag,

1

Dies kann durch eine Anmeldemeldung auf dem Remote-Host verursacht werden, z. B. "Ihr Kennwort läuft in 6 Tagen ab", die RSYNC nicht erwartet

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.