niezgodność wersji protokołu - czy twoja powłoka jest czysta?

55

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ę.

rfreytag
źródło
1
Czy skrypty logowania generują coś, co nie jest od razu widoczne, na przykład polecenie zmiany tytułu okna? Jednym ze sposobów sprawdzenia tego jest uruchomienie Emacsa, wpisanie ESC x shelli wykonanie export TERM=xterm; ssh remotehost ls. Jeśli pojawią się jakieś znaki kontrolne lub inne fałszywe dane wyjściowe, musisz to wytropić.
Gilles „SO- przestań być zły”
1
Miałem ten sam problem. W moim przypadku serwer SSH został skonfigurowany do chrootowania użytkowników i zezwalania tylko na dostęp SFTP, więc uruchomienie komendy rsync ze zdalnej powłoki nie było możliwe. Jeśli masz dostęp do serwera, sprawdź opcję konfiguracji ForceCommand w / etc / ssh / sshd_config. Jeśli jest ustawiony na coś, to jest problem.
devius,
Dla przypomnienia, wpadłem na sytuację, w której po prostu zrezygnowałem z niedopasowania protokołu. rsync - wersja wyjściowa identyczna na obu hostach, interaktywny i nieinteraktywny ssh całkowicie cichy, nic specjalnego w uprawnionych kluczach ... Po prostu nie działa. Zostawiam ten komentarz innym, którzy robią dziury w królikach. Zrób sobie przysługę i spróbuj bez --rsync-path. Prawdopodobnie okaże się, że twój problem nie ma nic wspólnego z tym SO.
sheldonh
@sheldonh: czy ścieżka na komputerze lokalnym i zdalnym różni się w Twoim przypadku? w moim przypadku i tak są takie same, a dawanie lub nie dawanie ( --rsync-path) nic dla mnie nie zmienia.
0xC0000022L
1
@ 0xC0000022L Przepraszam, nie pamiętam.
sheldonh

Odpowiedzi:

62

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:

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

lub alternatywnie, tak jak poniżej, ponieważ parametr specjalny -zawiera iinteraktywną powłokę:

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

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:

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

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.

Andrew Case
źródło
5
echoW ~/.bashrcTHX. Zrobiłeś mój dzień
9869932
19

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ę. falsePolecenie natychmiast rozwiązać bez wytwarzania wyjścia, więc jest to dobry test:

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

Jeśli ten wiersz poleceń generuje jakieś dane wyjściowe, jeden z twoich skryptów startowych jest winny:

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$

Inną sprawą do sprawdzenia, czy pojawia się ten błąd, jest to, czy rsync jest zainstalowany i zlokalizowany przez ssh:

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$

Jeśli rsync nie znajduje się na ścieżce, zamiast tego zobaczysz coś takiego:

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

Możesz to naprawić, instalując rsync lub jeśli jest zainstalowany, ale w nietypowej lokalizacji, przekazując lokalizację do wiersza polecenia rsync:

rsync -avvvz -e "ssh -i /home/thisuser/cron/thishost-rsync-key" \
    --rsync-path="/usr/local/bin/rsync" \
    remoteuser@remotehost:/remote/dir /this/dir/
Stobor
źródło
7

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:

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

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:

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

lub alternatywnie, tak jak poniżej, ponieważ parametr specjalny -zawiera iinteraktywną powłokę:

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

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=30zrobiło lewę.

Jeśli nadal masz problemy, spróbuj użyć ssh, ponieważ użytkownik rsysnc się łączy i spróbuj uruchomić, rsync --versionaby 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).

Azendale
źródło
+1 za podpowiedź, --protocolktó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)
MattBianco
4

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

ssh remotehost false

Ten powinien zawieść, a ten powinien odnieść sukces

sftp remotehost

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_configi sprawdzając match oraz forcecommandwpisy.

Możesz również sprawdzić ten post

higuita
źródło
4

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 rsyncRozwiązać problem.

Kjetil S.
źródło
Spędziłem 30 minut na rozmawianiu z kontenerem i Ansible zastanawiając się, dlaczego rsync nie działa ... ciężko, aby działał, gdy nie jest zainstalowany! Dzięki;)
Ryan Fisher
2

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.

dgq8
źródło
Być może nie wyraziłem tego wystarczająco jasno, ale już zrobiłem to „monit (PS1 =„ ”) i motd (.hushlogin)”. Logowanie rzeczywiście nie wyświetla żadnego monitu. Mimo to nadal występuje błąd niedopasowania protokołu. Dziękuję jednak - bardzo doceniam sugestię.
rfreytag
W zasadzie już o tym wspomniałeś, ale miałem takie problemy, jeśli w .bashrc (lub innym skrypcie profilu) jest coś, co odbija się echem na ekranie. Miałem nawet taki problem podczas uruchamiania niektórych programów w powłoce, które zmieniają pewne rzeczy w określony sposób (na przykład nie byłem w stanie zmienić mojej powłoki za pomocą chsh, więc musiałem uruchomić bash, aby zmienić moją .cshrc shell i ssh nie będą już działać).
lsd
To z pewnością interesujące. Zastanawiam się, jak mógłbym to zdiagnozować, ponieważ interaktywne wykonywanie polecenia rsync nie wyświetla na ekranie nic echa, a logowanie jest całkowicie ciche? Hmmm ... Zastanawiam się, czy coś jest nie tak z powłoką, jak sugerujesz. Dzięki.
rfreytag
1

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

Dief
źródło