Существует много полезной информации об этой проблеме, включая ответ выше. Но в моем случае я являюсь администратором как на исходной, так и на целевой машине, и я хотел понять, что происходит и какие «правильные» параметры конфигурации могут решить эту проблему. Я не был полностью успешным, но кажется вероятным, что другие могут найти эту информацию полезной.
Как указано в ответе выше, 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", то я, вероятно, не смогу провести аудит безопасности на своих серверах. Я могу вернуться к этому после того, как у меня будет больше опыта в проверках безопасности нашей организации.