Вопрос или проблема
Я хочу ограничить rsync
с помощью опции command
в скрипте “rrsync в
authorized_keys`:
command="rrsync -ro /home/server_backup",restrict ssh-ed25519 AAA...
Но при вызове rsync
с клиента программа пытается перейти в несуществующую директорию /home/server_backup/home/server_backup
:
rsync -e ssh -aivvv --human-readable server1:/home/server_backup/ /var/backup/server1
открытие соединения с использованием: ssh server1 rsync --server --sender -vvvlogDtpre.iLsfxCIvu . /home/server_backup/
получение инкрементального списка файлов
rsync: [sender] change_dir "/home/server_backup/home/server_backup" не удалось: Нет такого файла или директории (2)
Я предполагаю, что аргумент rrsync
на сервере каким-то образом комбинируется с аргументом источника для rsync
на клиенте – но как и почему?
Ответ или решение
Проблема, с которой вы столкнулись, связана с тем, как rsync
интерпретирует аргументы пути при работе в сочетании с командой, заданной в authorized_keys
. Давайте разберемся с причиной ошибки и возможными решениями.
Объяснение проблемы
Когда вы используете опцию command
в файле authorized_keys
, например:
command="rrsync -ro /home/server_backup",restrict ssh-ed25519 AAA...
это означает, что когда клиент инициирует SSH-соединение, будет выполнена команда rrsync -ro /home/server_backup
. При этом, если в качестве источника для rsync
указывается путь /home/server_backup/
, то rsync
будет пытаться сформировать полный путь, комбинируя путь из command
и путь, указанный на клиенте. Таким образом, в вашем случае происходит попытка перейти в директорию /home/server_backup/home/server_backup
, что и вызывает ошибку "Нет такого файла или директории".
Решение проблемы
Есть несколько способов решения данной проблемы:
-
Использование абсолютных путей: Убедитесь, что на стороне клиента вы указываете правильный путь. Вместо
rsync -e ssh -aivvv --human-readable server1:/home/server_backup/ /var/backup/server1
используйте что-то вроде:
rsync -e "ssh -i /path/to/your/private/key" -aivvv --human-readable server1:/home/server_backup/. /var/backup/server1
Обратите внимание на
/.
в конце пути, это указываетrsync
скопировать содержимое директории, а не саму директорию. -
Изменение скрипта
rrsync
: Проверьте скриптrrsync
, если вы имеете доступ к его коду. Вам нужно убедиться, что путь, используемый в скрипте, правильно обрабатывает входные аргументы от клиента и не вызывает проблем с некорректным формированием путей. -
Использование переменных окружения: Если есть возможность, вы можете добавить логику в
rrsync
, которая будет учитывать текущий рабочий каталог подключенного пользователя, и на этом основании будет корректно формировать путь дляrsync
. -
Настройка
authorized_keys
: Если вы хотите разрешить доступ только к определенным директориям, вы можете рассмотреть возможность ограничения путей, не используя команду-r
, а указав конкретные разрешенные пути. -
Добавление флага
--rsync-path
: Если вы управляетеrsync
сервером, вы можете добавить параметр--rsync-path
в клиентский вызов, чтобы явным образом указать путь к используемой версииrsync
на сервере. Например:rsync -e "ssh -i /path/to/your/private/key" --rsync-path="rrsync" -aivvv --human-readable server1:/home/server_backup/. /var/backup/server1
Заключение
Эти решения должны помочь вам устранить ошибку и корректно настроить rsync
с использованием скрипта rrsync
. Главное — удостовериться, что пути, которые вы используете, не конфликтуют, и что команда, указанная в authorized_keys
, работает так, как вы хотите. Если у вас возникнут дополнительные вопросы или сложности, не стесняйтесь обращаться за помощью!