Rsync scheint mit .bashrc nicht kompatibel zu sein (Ursachen: "Ist Ihre Shell sauber?")

16

Es stellt sich heraus, dass rsync nicht mit einem Remote-Server mit einer .bashrc-Datei funktioniert.

Beim lokalen Client bekam ich beim Ausführen von rsync:

protocol version mismatch -- is your shell clean?
(see the rsync man page for an explanation)
rsync error: protocol incompatibility (code 2) at compat.c(180) [sender=3.0.7]

Wie hier vorgeschlagen , wurde das Problem durch Entfernen der .bashrc auf dem Server behoben. Wie kann man es lösen, ohne die .bashrc-Datei (vorübergehend) zu entfernen?

Computist
quelle
1
Überprüfen Sie, ob ssh für dieses Konto aktiviert ist.
Lamy
Die folgenden Antworten sind wahrscheinlich falsch. Ich habe vor kurzem angefangen, diesen Fehler nach einem routinemäßigen Ubuntu-Upgrade zu bekommen, obwohl sich an meinen .bashrc-Dateien nichts geändert hat.
Cerin,
Nein - Wenn das Entfernen der .bashrc-Datei das Problem behebt (wie in dieser Frage angegeben), wird das Problem von der .bashrc-Datei ausgegeben. Ein Upgrade kann mit Sicherheit zu einer tatsächlichen Protokollinkompatibilität führen, bei der es sich um ein völlig anderes Problem handelt.
Randall

Antworten:

21

Sie können auf Probleme stoßen, wenn der .bashrcauf dem Remote-Server etwas an das Terminal ausgibt. Rsync erwartet dies möglicherweise nicht und kann daher Probleme verursachen.

Sie können dies beheben, indem Sie alle Befehle im .bashrcAusgabetext entfernen oder die Ausgabe an / dev / null weiterleiten.

Greg Hewgill
quelle
3
Wie kann ich also eine Ausgabe nach / dev / null leiten, wenn ich nur Dateien auf dem Client ändern kann?
Computist
1
Ich nehme an, Sie könnten als Ihr Systemadministrator um Unterstützung bitten. Möglicherweise können Sie Dateien auf dem Server auch auf andere Weise ändern, z. B. FTP oder scp.
Greg Hewgill
Ja, meine .bashrc-Datei enthielt ein Echo "*** Starting ROOT Shell ***" und ein Echo "(Verwenden Sie nach Möglichkeit sudo anstelle einer Root-Shell!)". Das Entfernen dieser Echos behebt das Problem.
Kentgrav
1
Auf der rsync-Manpage: "Protokollversion stimmt nicht überein - ist Ihre Shell sauber?" Diese Meldung wird normalerweise von Ihren Startskripten oder der Remote-Shell-Funktion verursacht, die unerwünschten Datenmüll auf dem Stream erzeugt, den rsync für den Transport verwendet. Um dieses Problem zu diagnostizieren, führen Sie Ihre Remote-Shell folgendermaßen aus: ssh remotehost / bin / true> out.dat. Schauen Sie sich dann die Datei out.dat an. Wenn alles richtig funktioniert, sollte out.dat eine Null-Länge-Datei sein.
Kentgrav
8

Die .bashrc-Datei ist wirklich nicht der richtige Ort, um eine Ausgabe zu generieren, da dies ein solches Problem verursacht. Viele Leute kommen damit durch, bis sie versuchen, rsync auszuführen :-)

Jede gewünschte Ausgabe (und die zugehörige Logik und Befehle) sollte in Ihr .bash_profile verschoben werden (siehe z. B. Serverfehlerfrage ".profile vs. .bash_profile vs. .bashrc" für weitere Erläuterungen zu den Unterschieden zwischen den Dateien).

Auf diese Weise müssen Sie weder die Ausgabe opfern, wenn Sie sich anmelden, noch temporäre Änderungen an Ihrer .bashrc vornehmen, wenn Sie rsync verwenden möchten.

Randall
quelle
6

Ich hatte schon immer .bashrc-Dateien in meinen Benutzerkonten und hatte dieses Problem nie, bis ich heute versuchte, mit dem Root-Konto etwas mit meinem Server zu synchronisieren. Ihr Beitrag hat mir geholfen, die Lösung zu finden:

Meine $ user / .bashrc-Dateien beginnen immer mit dem folgenden Abschnitt, um solche Probleme zu vermeiden. Ich habe es auf root's .bashrc repliziert und rsync'ing funktioniert jetzt wie ein Zauber!

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

HTH, Karsten

karsten
quelle
Dies funktioniert normalerweise nicht rsync, da es aus irgendeinem Grund als "interaktive Shell" eingestuft wird. Aber es ist trotzdem eine gute Zeile, die hinzugefügt werden kann, da sie andernfalls nicht interaktive Shells beschädigen könnte, wenn eine Ausgabe vorhanden ist.
Michael Schubert
Ich denke, das ist die beste Lösung für die Frage. Die Antwort "Entfernen von Befehlen in der .bashrc, die Text ausgeben" ist nicht praktikabel.
Qinsi
4

Aus komplexen Gründen führt rsync / scp / sftp .bashrc aus, wenn eine Verbindung zu einem anderen Host hergestellt wird. Sie müssen einen dieser Befehle oben in Ihrer .bashrc-Datei haben :

entweder

[[ $- != *i* ]] && return

oder

[ -z "$PS1" ] && return

Mit den oben genannten Befehlen können nur die restlichen .bashrc-Befehle für interaktive Sitzungen ausgeführt werden . Soweit ich weiß, brauchen Sie sie für keine andere Art von Sitzung (und tatsächlich habe ich Standard-BashRC von Arch und Debian gesehen, die diese Technik in ihrem BashRC verwenden).

Wenn Sie jedoch besonders paranoid sein möchten, wenn Sie Ihre bashrc-Befehle auch für nicht interaktive Sitzungen ausführen lassen möchten, sollten Sie die Befehle Ihres bashrc, die eine Ausgabe wie diese ( Referenz ) erzeugen, mindestens so umbrechen, dass sie nur in interaktiven Sitzungen ausgeführt werden:

if shopt -q login_shell; then
    # this is an interactive session, we _can_ display output
    ...code that produces output goes here...
fi

Beachten Sie, dass andere das Verschieben von Befehlen vorschlagen, die Text in Ihr bash_profile ausgeben, aber ich habe meine Zweifel, ob dies immer gut ist ( aus den hier erläuterten Gründen ).

ndemou
quelle