Postępując zgodnie z instrukcjami dotyczącymi wykonywania kopii zapasowych rsync podanymi tutaj: http://troy.jdmz.net/rsync/index.html
Pojawia się błąd „Niezgodność wersji protokołu - czy twoja powłoka jest czysta?”
Czytałem gdzieś, że muszę wyciszyć monity (PS1 = "") i motd (.hushlogin), aby sobie z tym poradzić. Zrobiłem to, baner zachęty i login (MOTD) nie są już wyświetlane, ale błąd nadal pojawia się po uruchomieniu:
rsync -avvvz -e "ssh -i /home/thisuser/cron/thishost-rsync-key" remoteuser@remotehost:/remote/dir /this/dir/
Zarówno klient ssh, jak i serwer sshd korzystają z wersji 2 protokołu.
Co może być problemem? Dzięki.
[EDYCJA] Znalazłem http://www.eng.cam.ac.uk/help/jpmg/ssh/authorized_keys_howto.html, który sugeruje, że czasami konieczne jest „Wymuszenie v2 przy użyciu flagi -2 do ssh lub slogin
ssh -2 -i ~/.ssh/my_private_key remotemachine"
Nie jest jasne, czy to rozwiązało problem, ponieważ myślę, że wprowadzam tę zmianę PO zmianie błędu, ale faktem jest, że błąd ewoluował do czegoś innego. Zaktualizuję to, gdy dowiem się więcej. I z pewnością spróbuję zasugerować, aby uruchomić to w powłoce emacsa - dziękuję.
ESC x shell
i wykonanieexport TERM=xterm; ssh remotehost ls
. Jeśli pojawią się jakieś znaki kontrolne lub inne fałszywe dane wyjściowe, musisz to wytropić.--rsync-path
) nic dla mnie nie zmienia.Odpowiedzi:
Jeden ze skryptów logowania (.bashrc / .cshrc / itp.) Prawdopodobnie wysyła dane do terminala (kiedy nie powinno to być). Powoduje to błąd ssh podczas łączenia się i przygotowywania do kopiowania, gdy zaczyna otrzymywać dodatkowe dane, których się nie spodziewa. Usuń dane wyjściowe generowane w skryptach startowych.
Możesz sprawdzić, czy twój terminal jest interaktywny i wyświetlać tekst tylko za pomocą następującego kodu w bashrc. Istnieje coś równoważnego również dla innych powłok:
lub alternatywnie, tak jak poniżej, ponieważ parametr specjalny
-
zawierai
interaktywną powłokę:Aby uzyskać więcej informacji, zobacz: rsync przez ssh z Linuksa do niezgodności protokołu Windows SBS 2003
Aby to zdiagnozować, upewnij się, że następujące dane wyjściowe są wyświetlane po ssh na hoście:
Jeśli otrzymasz nowe wiersze lub inne dane, wiesz, że wysyłane są dodatkowe dane wyjściowe. Możesz zmienić nazwę .bashrc / .cshrc / .profile / etc. pliki do czegoś innego, aby nie wyświetlały dodatkowych danych wyjściowych. Oczywiście nadal istnieją pliki systemowe, które mogą to powodować. W takim przypadku sprawdź u administratora systemu, czy pliki systemowe nie wysyłają danych.
źródło
echo
W~/.bashrc
THX. Zrobiłeś mój dzieńIstnieje prosty sposób sprawdzenia, czy powłoka jest czysta, w przypadku połączenia ssh: uruchom polecenie z połączenia ssh, zamiast uruchamiać interaktywną powłokę.
false
Polecenie natychmiast rozwiązać bez wytwarzania wyjścia, więc jest to dobry test:Jeśli ten wiersz poleceń generuje jakieś dane wyjściowe, jeden z twoich skryptów startowych jest winny:
Inną sprawą do sprawdzenia, czy pojawia się ten błąd, jest to, czy rsync jest zainstalowany i zlokalizowany przez ssh:
Jeśli rsync nie znajduje się na ścieżce, zamiast tego zobaczysz coś takiego:
Możesz to naprawić, instalując rsync lub jeśli jest zainstalowany, ale w nietypowej lokalizacji, przekazując lokalizację do wiersza polecenia rsync:
źródło
Jest to często spowodowane tym, że dane logowania powłoki wysyłają dane do powłoki nieinteraktywnej. Możesz sprawdzić, czy tak jest, wykonując:
Jeśli plik testowy NIE ma 0 bajtów, problem polega na tym, że twoja powłoka coś wypisuje. Sprawdzić
/etc/profile
,.profile
,.bashrc
,.cshrc
, itd. Jeśli tak jest, można go zmienić, by sprawdzić, czy terminal jest interaktywny i tylko wyjście tekst za pomocą następującego kodu w bashrc. Istnieje coś równoważnego również dla innych powłok:lub alternatywnie, tak jak poniżej, ponieważ parametr specjalny
-
zawierai
interaktywną powłokę:Jeśli jednak plik testowy ma w rzeczywistości 0 bajtów, oznacza to, że powłoka zachowuje się, ale możliwe, że masz bardzo starą wersję programu rsync. Możesz powiedzieć klientowi (zakładając, że jest to nowszy koniec), aby nie reklamował tak wysokiej wersji, że stara wersja serwera rysnc go nie rozpoznaje. Możesz to zrobić za pomocą
--protocol=
opcji. W moim przypadku użycie--protocol=30
zrobiło lewę.Jeśli nadal masz problemy, spróbuj użyć ssh, ponieważ użytkownik rsysnc się łączy i spróbuj uruchomić,
rsync --version
aby sprawdzić, czy powłoka może znaleźć rsync. Jeśli pojawi się komunikat, że polecenie nie zostało znalezione, oznacza to, że rsync może nie zostać zainstalowany na komputerze, z którym się łączysz, lub może nie znajdować się na ścieżce. Rsync ma opcje określania ścieżki zdalnego końca, przeczytaj strony man (s).źródło
--protocol
która rozwiązała mój problem z serwerem 2.5.6 (wersja protokołu 26) i klientem 3.1.0 (wersja protokołu 31)Jest to szczególny przypadek z innych odpowiedzi, ale nie różni się bardzo od tego czasu.
Aby wykonać rsync przez ssh, potrzebujesz dostępu do powłoki w ssh, aby wykonać zdalne polecenie rsync. Jeśli twoje konto ssh zezwala tylko na scp / sftp, nie będziesz mógł uruchomić usuwania rsync i nie powiedzie się ten błąd.
Można to przetestować za pomocą tego samego polecenia, co powyżej
Ten powinien zawieść, a ten powinien odnieść sukces
Dowodzi to, że masz dostęp tylko do sftp.
Jeśli chcesz i masz do tego uprawnienia, możesz wyłączyć dostęp sftp tylko dla tego użytkownika, edytując
/etc/ssh/sshd_config
i sprawdzającmatch
orazforcecommand
wpisy.Możesz również sprawdzić ten post
źródło
Dostałem
protocol version mismatch -- is your shell clean?
po prostu dlatego, że nie zainstalowałem jeszcze rsync na drugim końcu.sudo yum install rsync
Rozwiązać problem.źródło
Monit nie będzie w ogóle wyświetlany podczas bezpośredniego wykonywania polecenia i nie będzie interaktywny. Prosty google pojawia się pierwszy wynik: http://marc.info/?l=rsync&m=100263876212594&w=2 A ponieważ powłoka może zostać potencjalnie wywołana, nie może wyświetlać niczego w trybie nieinteraktywnym - na przykład podczas pisania po prostu „ bash ”do istniejącego monitu, powinien pojawić się tylko nowy monit.
źródło
Może to być spowodowane komunikatem logowania na zdalnym hoście, takim jak „Twoje hasło wygaśnie za 6 dni”, którego RSYNC nie oczekuje
źródło