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

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 протокола.

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

[РЕДАКТИРОВАТЬ] Я нашел http://www.eng.cam.ac.uk/help/jpmg/ssh/authorized_keys_howto.html, который указывает, что иногда необходимо выполнить «Force v2» с помощью флага -2 для ssh или slogin

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

Не ясно, что это решило проблему, так как я думаю, что я поместил это изменение в ПОСЛЕ изменения ошибки, но факт в том, что ошибка превратилась в нечто другое. Я обновлю это, когда узнаю больше. И я обязательно попробую предложить запустить это в оболочке emacs - спасибо.

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

Ответы:

62

Один из ваших сценариев входа в систему (.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 несоответствие протокола

Чтобы диагностировать это, убедитесь, что ниже приведены выходные данные, которые вы получаете, когда входите в ssh на хосте:

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

Если вы получаете новые строки или другие данные, вы знаете, что отправляется дополнительный вывод. Вы можете переименовать ваш .bashrc / .cshrc / .profile / и т.д. файлы к чему-то еще, чтобы они не выводили дополнительный вывод. Конечно, есть еще системные файлы, которые могут вызвать это. В этом случае проверьте у своего системного администратора, что системные файлы не выводят данные.

Эндрю Кейс
источник
5
echoВ ~/.bashrc, Thx. Вы сделали мой день
user9869932
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/
Stobor
источник
7

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

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

Azendale
источник
+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 минут на то, чтобы возиться с контейнером, и Ансибл задалась вопросом, почему rsync не работает ... трудно работать, когда он не установлен! Спасибо;)
Райан Фишер
2

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

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

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

Dief
источник