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

Rsync кажется несовместимым с .bashrc (вызывает «чиста ли ваша оболочка?»)

Оказывается, rsync не может работать с удаленным сервером, на котором есть файл .bashrc?

На локальном клиенте я получил при запуске rsync:

protocol version mismatch -- is your shell clean?
(see the rsync man page for an explanation)
rsync error: protocol incompatibility (code 2) at compat.c(180) [sender=3.0.7]

Как было предложено Вот удаление .bashrc на сервере решило проблему. Как решить эту проблему без удаления файла .bashrc (временно)?

Вы можете столкнуться с проблемами, если .bashrc на удаленном сервере что-либо выводит на терминал. Rsync может не ожидать этого и в результате могут возникнуть проблемы.

Вы можете исправить это, удалив все команды в .bashrc этот выводимый текст, или передав любой вывод в / dev / null.

.Bashrc на самом деле не подходящее место для генерации вывода, поскольку он вызывает такого рода проблемы. Однако многим это сходит с рук, пока они не попытаются запустить rsync :-)

Любой желаемый результат (и связанная с ним логика и команды) следует переместить в ваш .bash_profile (см., Например, Вопрос об ошибке сервера ".profile vs. .bash_profile vs. .bashrc" для дальнейшего обсуждения различий между файлами).

Таким образом, вам не нужно будет жертвовать получением вывода при входе в систему или вносить временные изменения в ваш .bashrc, когда вы хотите использовать rsync.

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

Мои файлы $ user / .bashrc всегда начинаются со следующего раздела, чтобы предотвратить подобные проблемы. Я скопировал его в .bashrc root, и теперь rsync'ing работает как шарм!

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

HTH, karsten

Для сложные причины rsync / scp / sftp запускает .bashrc при подключении к другому хосту. Вы должны иметь любую из этих команд на наверху вашего .bashrc:

либо

[[ $- != *i* ]] && return

или

[ -z "$PS1" ] && return

Любая из вышеперечисленных команд разрешит выполнение остальных команд .bashrc только для интерактивные сессии. Насколько я знаю, они вам не нужны для любого другого типа сеанса (и действительно, я видел по умолчанию bashrc от Arch и Debian, использующий эту технику в их bashrc).

Однако, если вы хотите быть лишним параноиком, позволяя своим командам bashrc запускаться даже для неинтерактивных сеансов, вы должны, по крайней мере, обернуть команды вашего bashrc, которые производят такой выводссылка), чтобы они работали только в интерактивных сеансах:

if shopt -q login_shell; then
    # this is an interactive session, we _can_ display output
    ...code that produces output goes here...
fi

Обратите внимание, что другие предлагают переместить команды, которые выводят текст в ваш bash_profile, но я сомневаюсь, всегда ли это хорошо (для причины объяснены здесь)

Это бремя вызвано тем, что вы запускаете rsync через SSH.

SSH запускает ваши сценарии оболочки, например .bashrc Вывод скриптов нарушает рукопожатие RSYNC, это известная проблема, вы получаете подсказку: «Несоответствие версии протокола - чиста ли ваша оболочка?»

Если вам не нужны функции SSH (например, аутентификация и туннелирование), вы можете запустить чистый rsync без SSH. Просто добавьте к каждому хосту rsync: //

rsync через rsync:

  1. Вы можете определить его права доступа. Посмотреть этот файл

    • /etc/rsyncd.secrets
    • /etc/rsyncd.conf

Примечание: расположение файлов может быть разным.

  1. Производительность

    Иногда rsync / rsync намного быстрее, чем rsync / ssh. Протестируйте свои серверы и сеть.

Все вышеперечисленное перепробовала! сравнивал версии и неровный .basrc. Единственное, что у меня сработало, - это простое «прикосновение .hushlogin» к ~ remote_home_dir.

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

В моем случае я пытался использовать файлы rsync из CentOS 7, в котором была старая версия rsync 2.5.6, до Ubuntu 20.04 (в которой была версия 3.1.2).

rsync --version
rsync  version 2.5.6  protocol version 26
Copyright (C) 1996-2002 by Andrew Tridgell and others

После того, как я добавил --protocol=26 к моему rsync вызов на Ubuntu, все прошло нормально.