Команда rrsync в authorized_keys ссылается на несуществующий каталог

Вопрос или проблема

Я хочу ограничить 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, что и вызывает ошибку "Нет такого файла или директории".

Решение проблемы

Есть несколько способов решения данной проблемы:

  1. Использование абсолютных путей: Убедитесь, что на стороне клиента вы указываете правильный путь. Вместо

    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 скопировать содержимое директории, а не саму директорию.

  2. Изменение скрипта rrsync: Проверьте скрипт rrsync, если вы имеете доступ к его коду. Вам нужно убедиться, что путь, используемый в скрипте, правильно обрабатывает входные аргументы от клиента и не вызывает проблем с некорректным формированием путей.

  3. Использование переменных окружения: Если есть возможность, вы можете добавить логику в rrsync, которая будет учитывать текущий рабочий каталог подключенного пользователя, и на этом основании будет корректно формировать путь для rsync.

  4. Настройка authorized_keys: Если вы хотите разрешить доступ только к определенным директориям, вы можете рассмотреть возможность ограничения путей, не используя команду -r, а указав конкретные разрешенные пути.

  5. Добавление флага --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, работает так, как вы хотите. Если у вас возникнут дополнительные вопросы или сложности, не стесняйтесь обращаться за помощью!

Оцените материал
Добавить комментарий

Капча загружается...