Следуя инструкциям по созданию резервных копий 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 или slogin
ssh -2 -i ~/.ssh/my_private_key remotemachine"
Неясно, что это решило проблему, поскольку я думаю, что внес это изменение ПОСЛЕ того, как ошибка изменилась, но факт в том, что ошибка превратилась во что-то другое. Я обновлю это, когда узнаю больше. И я обязательно попробую выполнить предложение запустить это в оболочке emacs - спасибо.
Один из ваших сценариев входа в систему (.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
Чтобы диагностировать это, убедитесь, что при подключении по ssh к хосту вы получаете следующие выходные данные:
USER@HOSTNAME's password:
Last login: Mon Nov 7 22:54:30 2011 from YOURIP
[USER@HOSTNAME ~]$
Если вы получаете какие-либо символы новой строки или другие данные, вы знаете, что отправляется дополнительный вывод. Вы можете переименовать ваш .bashrc / .cshrc / .profile / etc. файлы на что-то другое, чтобы они не выводили дополнительный вывод. Конечно, есть системные файлы, которые могут вызвать это. В этом случае посоветуйтесь со своим системным администратором, что системные файлы не выводят данные.
Есть простой способ проверить чистоту вашей оболочки для 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/
Обычно это вызвано тем, что данные для входа в вашу оболочку выводят данные в неинтерактивной оболочке. Вы можете проверить, так ли это, выполнив:
ssh username@host "/bin/true" > testfile
ls -l testfile
Если 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 есть опции для указания пути удаленного конца, прочтите справочные страницы.
я получил protocol version mismatch -- is your shell clean?
просто потому, что я не установил rsync на Другой конец еще нет. sudo yum install rsync
решил проблему.
Это особый случай по сравнению с другими ответами, но не сильно отличается от них.
Чтобы выполнить rsync через ssh, вам потребуется доступ к оболочке в ssh для выполнения удаленной команды rsync. Если ваша учетная запись ssh разрешает только scp / sftp, вы не сможете запустить удаление rsync и не выдаст эту ошибку.
Это можно проверить с помощью той же команды, что и выше
ssh remotehost false
Это должно потерпеть неудачу, и это должно быть успешным
sftp remotehost
Это доказывает, что у вас есть доступ только к sftp.
Если вы хотите и имеете на это разрешение, вы можете отключить доступ только по sftp для этого пользователя, отредактировав /etc/ssh/sshd_config
и проверьте match
и forcecommand
записи.
Вы также можете проверить это Почта
Подсказка не будет отображаться вообще при прямом выполнении команды и не интерактивно. Простой Google показывает первый результат: http://marc.info/?l=rsync&m=100263876212594&w=2 И поскольку оболочка потенциально может быть вызвана, она не должна отображать ничего в неинтерактивном режиме - например, при вводе просто «bash» в существующее приглашение не должно появляться ничего, кроме нового приглашения.
Это может быть вызвано сообщением для входа на удаленный хост, например «Срок действия вашего пароля истечет через 6 дней», чего RSYNC не ожидает.
Я также наблюдаю эту ошибку при извлечении файлов из экземпляра с rsync version 2.5.7 protocol version 26
к version 3.1.1
:
protocol version mismatch - is your shell clean?
(see the rsync man page for an explanation)
rsync error: protocol incompatibility (code 2) at compat.c(62)
rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(226) [Receiver=3.1.1]
Но удаленная оболочка не имела баннера входа в систему. Вместо этого было решено указать более старый протокол (ссылка):
rsync --protocol=29 ...