Rsync здається несумісним з .bashrc (викликає "чи ваша оболонка чиста?")


16

Виявляється, 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 файл (тимчасово)?


1
Перевірте, чи ввімкнено ssh для цього облікового запису.
Ламі

Нижче наведені відповіді, ймовірно, неправильні. Нещодавно я почав отримувати цю помилку після звичайного оновлення Ubuntu, хоча нічого не змінилось у моїх файлах .bashrc.
Серін

Ні - якщо видалення файлу .bashrc виправляє його (як це було зазначено в цьому запитанні), тоді проблема виводиться з .bashrc. Оновлення, безумовно, може ввести фактичну несумісність протоколу, що зовсім інша проблема.
Рандалл

Відповіді:


21

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

Ви можете виправити це, видаливши будь-які команди у .bashrcцьому вихідному тексті, або проклавши будь-який вихід до / dev / null.


3
Тож як передавати будь-який вихід у / dev / null, якщо я можу змінювати лише файли на клієнті?
Обчислювач

1
Я припускаю, що ви могли б як ваш системний адміністратор отримати допомогу. Ви також можете змінити файли на сервері іншим способом, наприклад, FTP або scp.
Грег Хьюгілл

Так, мій .bashrc файл містив відлуння "*** Запуск оболонки ROOT ***" та ехо "(Будь ласка, використовуйте sudo замість кореневої оболонки, коли це можливо!)". Видалення цих відлунь вирішило проблему.
Кентграв

1
З сторінки man rsync: "Невідповідність версії протоколу - чи ваша оболонка чиста?" Це повідомлення зазвичай спричинене вашими сценаріями запуску або віддаленим пристроєм оболонки, що виробляє небажане сміття в потоці, який rsync використовує для свого транспортування. Спосіб діагностування цієї проблеми полягає у запуску віддаленої оболонки так: ssh remotehost / bin / true> out.dat, потім подивіться файл out.dat. Якщо все працює правильно, тоді out.dat повинен бути файлом нульової довжини.
Кентграв

8

.Bashrc насправді не є правильним місцем для отримання результатів, оскільки це спричиняє подібні проблеми. Дуже багато людей з цим ухиляються, поки не намагаються запустити rsync :-)

Будь-який потрібний вихід (а також пов'язані з ним логіку та команди) слід перемістити у ваш .bash_profile (див., Наприклад, питання про помилку сервера ".profile vs. .bash_profile vs. .bashrc" для подальшого обговорення різниць між файлами).

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


6

У мене завжди були .bashrc файли в моїх облікових записах користувачів і ніколи не виникало цієї проблеми, поки я сьогодні не спробував rsync щось на своєму сервері за допомогою кореневого облікового запису. Ваше повідомлення допомогло мені знайти рішення:

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

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

HTH, карстен


Зазвичай це не спрацьовує rsync, оскільки це з будь-якої причини класифікується як "інтерактивна оболонка". Але це все-таки добре додати, тому що в іншому випадку це може викрутити неінтерактивні оболонки, якщо є вихід.
Майкл Шуберт

Я думаю, що це найкраще рішення питання. Відповідь прийняти "видалення будь-яких команд у .bashrc, що виводить текст" не є практичним.
Ціньсі

4

Зі складних причин 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, але я сумніваюся, чи завжди це добре (з пояснених тут причин )

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.