Назад | Перейти на главную страницу

«Несоответствие версии протокола - чиста ли ваша оболочка?» ошибка rsync, когда оболочка чистая

Я пытаюсь загрузить файлы с помощью rsync с rsync, запущенным в режиме демона через SSH на сервере, и получаю следующую ошибку на клиенте:

rsync -a myserver:/remote/path/ localdestdir/
protocol version mismatch -- is your shell clean?
(see the rsync man page for an explanation)
rsync error: protocol incompatibility (code 2) at compat.c(176) [Receiver=3.1.1]

Сервер имеет это в .ssh / authorized_keys для пользователя:

command="rsync --config=/path/to/engine-rsyncd.conf --server --daemon ." ssh-rsa ...

Я прочитал все, что смог найти об этой проблеме, и, как все предлагают, проверил, что оболочка чистая и ЧИСТО:

ssh myserver false >out.tmp

создает файл out.tmp нулевой длины (если я удалю "command = ..." из authorized_keys на сервере).

Я также попытался установить оболочку пользователя на rssh вместо bash на сервере - то же самое.

И клиент, и сервер работают под управлением Ubuntu 16.04, поэтому у них одна и та же версия rsync (3.3.1, протокол 31).

Что еще это может быть? Я попытался включить подробное ведение журнала в rsync и SSH, и журналы не дают мне никаких подсказок. Демон rsync не регистрирует ничего, кроме

2018/02/12 15:14:24 [6215] connect from clienthostname

Проблема в этом случае не в том, что оболочка не чистая, а в том, что клиентский rsync может выполнить команду, которую он должен выполнить на сервере. Если вы используете command="rsync..." в authorized_keys, то это команда, которую будет выполнять sshd, независимо от команды, переданной клиентом.

Клиентский rsync вызовет ssh со следующими аргументами:

ssh myserver rsync --server --sender -de.LsfxC . /remote/path/`.

Обратите внимание, что --sender является частью этих опций, потому что вы хотите, чтобы сервер отправлял вам файлы. Нет, если сервер должен получать файлы. Отметим также, что --daemon отсутствует в параметрах rsync. Как вариант --config актуально только вместе с --daemon, его также можно удалить из ввода вашей команды.

Как я уже упоминал, команда будет выполнена точно так же, как в файле authorized_keys. Это означает, что все аргументы, переданные от клиента, будут проигнорированы. Поэтому, если вы действительно хотите использовать команду в authorized_keys, вы должны указать точные параметры, которые rsync предоставит клиенту ssh, а это означает, что вы можете использовать rsync только для получения файлов точно по пути, указанному в authorized_keys. Если вы предоставите различные параметры для rsync на клиенте, они не будут действовать на сервере и, следовательно, могут работать или не работать в зависимости от того, реализован эффект этих параметров на клиенте или на стороне сервера rsync. Так что вам следует подумать, действительно ли вы этого хотите.

редактировать Вы можете использовать сценарий в качестве команды и проверить переменную среды SSH_ORIGINAL_COMMAND, чтобы вызвать rsync по мере необходимости. Поскольку удаленный путь является последним аргументом, вы можете просто проверить, начинается ли он с правильного префикса и не содержит ли «/ ..», который перешел бы в родительский каталог.