Вопрос: несоответствие версии протокола - ваша оболочка чиста?


Следуя инструкциям для создания резервных копий 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 протокола.

В чем может быть проблема? Благодарю.

[РЕДАКТИРОВАТЬ] я нашел 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 - спасибо.


47
2018-05-06 21:15


Источник


Создают ли ваши скрипты входа что-то, что не видно сразу, например, команда изменения названия окна? Один из способов проверить это - запустить Emacs, введите ESC x shell, и делай export TERM=xterm; ssh remotehost ls, Если появятся какие-либо управляющие символы или другой побочный выход, это то, что вам нужно выследить. - Gilles
У меня была такая же проблема. В моем случае сервер SSH был настроен на chroot пользователей и разрешить доступ только SFTP, поэтому было невозможно запустить команду rsync из удаленной оболочки. Если у вас есть доступ к серверу, проверьте параметр конфигурации ForceCommand в файле / etc / ssh / sshd_config. Если он настроен на что-то, что является проблемой. - devius
Для записи я столкнулся с ситуацией, когда я просто отказался от несоответствия протокола. rsync --version вывод идентичен на обоих хостах, интерактивный и неинтерактивный ssh ​​полностью бесшумный, ничего особенного в authorized_keys ... Просто не работает. Я оставляю этот комментарий для других, которые являются кролибами. Сделайте себе одолжение и попробуйте без --rsync-path. Вероятно, вы обнаружите, что ваша проблема не имеет ничего общего с этим. - sheldonh
@sheldonh: путь на локальном и удаленном компьютере отличается в вашем случае? в моем случае они все равно одинаковы и дают или не дают (--rsync-path) ничего не меняет. - 0xC0000022L
@ 0xC0000022L Извините, я не помню. - sheldonh


Ответы:


Один из ваших сценариев входа (.bashrc / .cshrc / etc.), Вероятно, выводит данные на терминал (когда этого не должно быть). Это вызывает ошибку 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 / etc. файлы на что-то другое, чтобы они не выдавали дополнительный вывод. Конечно, все еще есть системные файлы, которые могут вызвать это. В этом случае проверьте с помощью sysadmin, что системные файлы не выводят данные.


54
2017-11-07 08:31



echo в ~/.bashrc, Спасибо. Вы сделали мой день - xyz


Существует простой способ проверить, является ли ваша оболочка чистой, для подключения 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/

15
2018-01-19 11:39





Это обычно вызвано тем, что ваш материал для входа в оболочку выводит материал на неинтерактивную оболочку. Вы можете проверить, если это так:

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 есть опции для указания пути удаленного конца, прочитайте страницу (-ы) man.


6
2017-07-16 20:28



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


Это особый случай из других ответов, но с тех пор он не сильно отличается.

Чтобы выполнить rsync через ssh, вам нужен доступ к оболочке в ssh для выполнения команды удаленного rsync. Если ваша учетная запись ssh разрешает только scp / sftp, вы не сможете запустить удаление rsync и не дать этой ошибке.

Это можно протестировать с помощью той же команды, что и выше

ssh remotehost false

Это должно потерпеть неудачу, и этот успех должен быть успешным

sftp remotehost

Это доказывает, что у вас есть только доступ sftp.

Если вы хотите и имеете разрешения для этого, вы можете отключить доступ только для sftp для этого пользователя, отредактировав /etc/ssh/sshd_config и проверьте match  а также forcecommand записей.

Вы также можете проверить это после


4
2018-06-11 16:11





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


3
2017-09-16 10:33



Провел 30 минут, возившись с контейнером, и Ansible задавался вопросом, почему rsync не работал ... трудно работать, когда он не установлен! Благодаря ;) - Ryan Fisher


Запрос не будет отображаться вообще при непосредственном выполнении команды и неинтерактивно. Простой Google отображает первый результат: http://marc.info/?l=rsync&m=100263876212594&w=2 И поскольку оболочка потенциально может быть вызвана, она не должна отображать ничего в неинтерактивном режиме - например, при вводе только «bash» в существующее приглашение должно появляться только новое приглашение.


2
2018-05-06 21:29



Возможно, я не сделал этого достаточно ясным, но я уже сделал это «подсказка (PS1 =« ») и motd (.hushlogin)». Логин действительно не показывает никаких подсказок. Несмотря на это, ошибка согласования протокола все еще появляется. Спасибо, хотя - очень ценю предложение. - rfreytag
Вы уже упоминали об этом уже, но у меня были проблемы, подобные этому, если в файле .bashrc (или другом скрипте профиля) есть что-то вроде эхо-файла. У меня даже была такая проблема при запуске определенных программ в оболочке, которые меняют вещи определенным образом (например, я не смог изменить свою оболочку с помощью chsh, поэтому у меня был мой .cshrc run bash, чтобы изменить мой shell и ssh больше не будут работать). - lsd
Ну, это, безусловно, интересно. Интересно, как я могу диагностировать это, так как выполнение команды rsync в интерактивном режиме ничего не отображает на экране, и логин полностью отключается? Хммм ... Интересно, есть ли что-то с оболочкой, как вы предлагаете. Благодарю. - rfreytag


Это может быть вызвано сообщением входа на удаленном хосте, таким как «Ваш пароль истекает через 6 дней», который RSYNC не ожидает


1
2018-04-30 23:28