rsync'ing файлы между двумя удаленными серверами, получить ошибки о том, что команда rsync не найдена на удаленном сервере - PullRequest
9 голосов
/ 09 апреля 2009

Я пытаюсь rsync файлы между двумя серверами с

rsync -avlzp /source user@server:/destination

но вместо этого я получаю сообщение об ошибке

bash: rsync: command not found
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(635) [sender=3.0.2]

но rsync - это , установленный на обоих серверах. Что я делаю неправильно? Я также попробовал

rsync -av -e "ssh -l ssh-user" /source server:/destination

с тем же результатом.

Я в основном пытаюсь использовать rsync, чтобы он копировал только различия, если они существуют ...

Спасибо

Ответы [ 2 ]

15 голосов
/ 09 апреля 2009

rsync может находиться в пути на удаленной машине при запуске интерактивной оболочки, но не при запуске rsync по ssh (с неинтерактивной оболочкой). Например, .bashrc обычно запускается только для интерактивных оболочек, поэтому, если ваш путь там определен, он не будет анализироваться при запуске rsync --server на удаленном конце. Попробуйте / etc / profile. Подробнее см. bash (1) .

Вы можете использовать --rsync-path, чтобы указать путь к двоичному файлу rsync на удаленном компьютере.

7 голосов
/ 31 декабря 2011

Существует много полезной информации об этой проблеме, включая ответ выше. Но в моем случае я являюсь администратором как на исходной, так и на целевой машине, и я хотел понять, что происходит и какие «правильные» параметры конфигурации могут решить эту проблему. Я не был полностью успешным, но кажется вероятным, что другие могут найти эту информацию полезной.

Как указано в ответе выше, rsync может находиться в пути на удаленной машине при запуске интерактивной оболочки, но не при запуске rsync с помощью ssh. Как отмечает Siddesh на http://siddesh -bg.blogspot.com / 2009/02 / rsync-command-not-found-error-even.html , это можно решить, явно указав путь к удаленному rsync. из вашей локальной оболочки:

rsync -av --rsync-path=/usr/local/bin/rsync -e "ssh -l ssh-user" /source server:/destination

Но как администратор я хотел решить проблему, а не просто обойти ее. OldSchool опубликовал полезный метод устранения неполадок на https://groups.google.com/group/comp.unix.solaris/browse_thread/thread/0a06a4d382d752d8?pli=1

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

ssh user@host 'echo $SHELL' 
ssh user@host 'echo $PATH' 

У Тома Фейнера есть хороший пост на Почему удаленная команда SSH получает меньше переменных среды, чем при запуске вручную? , в которой обсуждается создание среды оболочки выполнения команды SSH.

OldSchool также отметил, что «man sshd_config» предоставляет некоторую информацию о том, как сеанс ssh получает среду. Параметр sshd_config «PermitUserEnvironment» можно настроить так, чтобы sshd мог обрабатывать пользовательскую ~ / .ssh / среду на стороне сервера и параметры среды в файле AuthorizedKeysFile. По умолчанию нет.

Таким образом, с настройками sshd_config по умолчанию путь будет создаваться вашей оболочкой по умолчанию. Если ваша команда ssh запрашивает интерактивный сеанс (ssh user @ host), то на удаленном сервере оболочка по умолчанию сделает интерактивный вход в систему, что, вероятно, приведет к ожидаемой переменной PATH. Но если вы инициируете ssh-сессию для rsync (rsync -av --rsync-path = / usr / local / bin / rsync -e "ssh -l ssh-user" / source server: / destination), тогда удаленный сервер выдаст вы оболочка выполнения команды SSH, которая является неинтерактивной оболочкой. В моем случае удаленная неинтерактивная оболочка (bash) не выполняет / etc / profile, потому что она делает это только для интерактивных оболочек или неинтерактивных оболочек с параметром --login. Я мог бы заставить это так:

ssh user@host 'echo $PATH;source /etc/profile;echo $PATH' 

Я также изучил «SSH The Secure Shell» Даниэля Барретта и Ричарда Сильвермана (O'Reilly 2001) и установил PATH в / etc / ssh / sshrc, который, как я надеялся, сделает rsync доступным для оболочек выполнения команд SSH, но, / etc / ssh / sshrc выполняется перед вызовом пользовательской оболочки или команды, и, очевидно, ее среда не передается этой оболочке или команде.

На данный момент я буду удовлетворен параметром командной строки rsync, т. Е .:

rsync -av --rsync-path=/usr/local/bin/rsync -e "ssh -l ssh-user" /source server:/destination

потому что я обеспокоен тем, что если я изменю параметр sshd_config "PermitUserEnvironment", то я, вероятно, не смогу провести аудит безопасности на своих серверах. Я могу вернуться к этому после того, как у меня будет больше опыта в проверках безопасности нашей организации.

...