Я пытаюсь загрузить файлы с помощью 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 по мере необходимости. Поскольку удаленный путь является последним аргументом, вы можете просто проверить, начинается ли он с правильного префикса и не содержит ли «/ ..», который перешел бы в родительский каталог.