невідповідність версії протоколу - чи ваша оболонка чиста?


55

Дотримуючись інструкцій робити резервні копії rsync, наведених тут: http://troy.jdmz.net/rsync/index.html

Я отримую помилку "Невідповідність версії протоколу - чи ваша оболонка чиста?"

Десь я прочитав, що мені потрібно замовкнути підказку (PS1 = "") і дисплеї motd (.hushlogin) для вирішення цього питання. Я зробив це, банер підказки та входу (MOTD) більше не з’являється, але помилка все ж з’являється при запуску:

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

І ssh-клієнт, і sshd-сервер використовують версію 2 протоколу.

У чому може бути проблема? Дякую.

[EDIT] Я знайшов http://www.eng.cam.ac.uk/help/jpmg/ssh/authorized_keys_howto.html, який вказує на те, що іноді потрібно "змусити v2, використовуючи прапор -2 для ssh або логінгу

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

Не ясно, що це вирішило проблему, тому що я думаю, що я помітив цю зміну ПІСЛЯ помилка змінилася, але факт полягає в тому, що помилка переросла в щось інше. Я оновлю це, коли дізнаюся більше. І я обов'язково спробую запропонувати запустити це в оболонці emacs - дякую.


1
Чи видають ваші скрипти входу щось таке, що не видно відразу, наприклад команду зміни заголовка вікна? Один із способів перевірити це - запустити Emacs, набрати ESC x shellта зробити export TERM=xterm; ssh remotehost ls. Якщо з’являються якісь контрольні символи або інший хибний вихід, це те, що ви повинні шукати.
Жил "ТАК - перестань бути злим"

1
У мене була така ж проблема. У моєму випадку сервер SSH був налаштований на chroot користувачів та дозвол лише доступу до SFTP, тому не вдалося запустити команду rsync з віддаленої оболонки. Якщо у вас є доступ до сервера, перевірте параметр конфігурації ForceCommand в / etc / ssh / sshd_config. Якщо в ньому встановлено щось, в чому проблема.
відхилення

Для запису я зіткнувся з ситуацією, коли я просто відмовився від невідповідності протоколу. rsync - вихід конверсії однаковий на обох хостах, інтерактивний та неінтерактивний ssh ​​повністю безшумний, нічого не вигадливо в авторизованих_кеях ... Просто не працює. Залишаю цей коментар для інших, хто бовтається на раби. Зробіть собі прихильність і спробуйте без --rsync-path. Ви, ймовірно, виявите, що ваша проблема не має нічого спільного з цим ПЗ.
sheldonh

@sheldonh: чи відрізнявся шлях на локальній та віддаленій машині у вашому випадку? у моєму випадку вони все одно однакові, і давати чи не давати ( --rsync-path) це для мене нічого не змінює.
0xC0000022L

1
@ 0xC0000022L Вибачте, не можу згадати.
sheldonh

Відповіді:


62

Один із ваших скриптів для входу (.bashrc / .cshrc / тощо), ймовірно, виводить дані в термінал (коли цього не повинно бути). Це спричиняє помилку ssh під час підключення та готується до копіювання, оскільки він починає отримувати додаткові дані, яких він не очікує. Видаліть вихід, який генерується в сценаріях запуску.

Ви можете перевірити, чи є ваш термінал інтерактивним і лише виводить текст, скориставшись наступним кодом у bashrc. Щось еквівалентне існує і для інших снарядів:

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

або, як-от так, оскільки спеціальний параметр -містить, iколи оболонка інтерактивна:

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

Для отримання додаткової інформації дивіться: rsync через ssh з Linux до невідповідності протоколу Windows sbs 2003

Щоб діагностувати це, переконайтесь, що наступним є результат, який ви отримуєте, коли ви впадаєте в хест:

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

Якщо ви отримуєте нові рядки або інші дані, ви знаєте, що надсилається додатковий вихід. Ви можете перейменувати .bashrc / .cshrc / .profile / тощо. файли на щось інше, щоб вони не видавали зайвий вихід. Звичайно, все ж є системні файли, які можуть спричинити це. У цьому випадку переконайтеся у своєму sysadmin, що системні файли не виводять даних.


5
А echoв ~/.bashrc, Thx. Ти зробив мій день
користувач9869932

19

Існує простий спосіб перевірити, чи оболонка чиста, для ssh-з'єднання: запустіть команду із ssh-з'єднання, а не запускайте інтерактивну оболонку. falseКоманда буде негайно припинити , не роблячи ніякого висновку, так що це хороший тест:

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

Якщо цей командний рядок дає будь-який вихід, винен один із ваших сценаріїв запуску:

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$

Інша річ, щоб перевірити, чи отримуєте ви цю помилку, це встановлення та розміщення rsync за допомогою 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$

Якщо rsync не на шляху, ви побачите щось на зразок:

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

Виправити це можна, встановивши rsync, або якщо він встановлений, але в незвичному місці, передавши розташування в командний рядок rsync:

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

7

Зазвичай це спричинено виведенням даних про вхід вашої оболонки на неінтерактивну оболонку. Ви можете перевірити, чи це так, зробивши:

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

Якщо тестовий файл НЕ 0 байт, проблема полягає в тому, що ваша оболонка щось виводить. Перевірте /etc/profile, .profile, .bashrc, .cshrcі т.д. Якщо це так, ви можете змінити його , щоб перевірити , якщо ваш термінал в інтерактивному режимі і тільки текст, що виводиться, використовуючи наступний код в Bashrc. Щось еквівалентне існує і для інших снарядів:

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

або, як-от так, оскільки спеціальний параметр -містить, iколи оболонка інтерактивна:

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

Однак, якщо тестовий файл насправді становить 0 байт, то ваша оболонка веде себе, але можливо, у вас просто дуже стара версія rsync. Ви можете сказати клієнтові (припускаючи, що це новіший кінець), щоб не розміщувати таку високу версію, що стара версія сервера rysnc не розпізнає її. Це можна зробити за допомогою --protocol=опції. У моєму випадку, використовуючи --protocol=30зробив трюк.

Якщо у вас все ще виникають проблеми, спробуйте ввімкнути ssh, коли користувач rsysnc підключається, і спробуйте запустити, rsync --versionщоб побачити, чи може оболонка знайти rsync. Якщо ви отримаєте щось, що говорить, що команда не знайдена, то rsync може бути не встановлено на машині, до якої ви підключаєтесь, або вона може не бути на шляху. У Rsync є параметри для вказівки шляху віддаленого кінця, читайте довідкові сторінки.


+1 для підказки про те, --protocolщо вирішили мою проблему із сервером 2.5.6 (протокол версія 26) та клієнтом 3.1.0 (версія 31 протоколу)
MattBianco

4

Це особливий випадок з інших відповідей, але не сильно відрізняється від того.

Щоб виконати rsync через ssh, вам потрібен доступ до оболонки в ssh, щоб виконати віддалену команду rsync. Якщо ваш ssh-акаунт дозволяє лише scp / sftp, ви не зможете запустити видалення rsync і не зможете подати цю помилку.

Це можна перевірити за допомогою тієї самої команди, що і вище

ssh remotehost false

Це має бути невдалим, і це має бути успіхом

sftp remotehost

Це доводить, що у вас є доступ лише sftp.

Якщо ви хочете , і мати дозвіл зробити це, ви можете відключити SFTP доступ тільки для цього користувача, шляхом редагування /etc/ssh/sshd_configі перевірте match і forcecommandзапис.

Ви також можете перевірити цю публікацію


4

Я отримав protocol version mismatch -- is your shell clean?просто тому, що ще не встановив rsync на іншому кінці. sudo yum install rsyncвирішив проблему.


Витратили 30 хвилин возитися з контейнером, і Ansible цікавився, чому rsync не працює ... важко працювати, коли він не встановлений! Спасибі;)
Райан Фішер

2

Підказка не відображатиметься взагалі при безпосередньому виконанні команди, і це неінтерактивно. Простий google виявляє перший результат: http://marc.info/?l=rsync&m=100263876212594&w=2 А оскільки оболонку потенційно можна викликати, вона не повинна відображати нічого в неінтерактивному режимі - наприклад, під час введення просто " bash "в існуючий запит, нічого, крім нового запиту, не повинно з'являтися.


Можливо, я не зробив це достатньо зрозумілим, але я вже зробив це "підказка (PS1 =" ") і motd (.hushlogin)". Увійти в систему, дійсно, не відображається жодного запиту. Незважаючи на це, помилка невідповідності протоколу все ще з'являється. Спасибі, хоча - дуже ціную пропозицію.
rfreytag

Ви в основному це вже згадували, але у мене виникли подібні проблеми, якщо в .bashrc (або іншому сценарії профілю) є щось, що повторюється на екрані. У мене навіть виникли подібні проблеми під час запуску певних програм у оболонці, які певним чином змінюють речі (наприклад, я не зміг змінити свою оболонку на chsh, тому у мене був .cshrc run bash, щоб змінити мій shell і ssh більше не працюватимуть).
lsd

Ну, це, звичайно, цікаво. Цікаво, як я можу діагностувати це, оскільки виконання команди rsync інтерактивно показує, що нічого не лунає на екрані, і логін повністю беззвучний? Хммм ... Цікаво, чи є щось із смішної оболонки, як ви пропонуєте. Дякую.
rfreytag

1

Це може бути викликано повідомленням для входу на віддаленому хості, наприклад, "Ваш пароль закінчується через 6 днів", якого RSYNC не очікує

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.