Назад | Перейти на главную страницу

sshd_config ForceCommand / usr / bin / rsync error «соединение неожиданно закрыто»

Как следует настроить ForceCommand, чтобы пользователь резервного копирования мог выполнять любую команду rsync? Когда ForceCommand установлен в / usr / bin / rsync, я получаю следующую ошибку: соединение неожиданно закрыто ...

/ etc / ssh / sshd_config на удаленном сервере, на котором размещены файлы для копирования:

Match User backup
    PasswordAuthentication no  
    PubkeyAuthentication yes  
    AllowTCPForwarding no  
    X11Forwarding no  
    ForceCommand /usr/bin/rsync  

Команда rsync, запущенная на локальном сервере, выполняет копирование с удаленного сервера:

rsync -avzh --progress backup@hostname.domain:/opt/backups/automatic/cron/mysql/ /tmp/.  

rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(601) [Receiver=3.0.7]

Если я настрою ForceCommand на точную команду rsync, такую ​​как приведенная ниже, я смогу успешно удаленно выполнить rsync в качестве пользователя резервного копирования, но для этого проекта я не хочу использовать полную точную команду, как показано ниже:

ForceCommand /usr/bin/rsync --server --sender -vlwkDonecf.iLew . /opt/backups/automatic/cron/mysql/

Если я настрою ForceCommand для использования сценария, такого как приведенный ниже, я смогу успешно удаленно выполнить rsync. Мне любопытно, почему это работает, а / usr / bin / rsync - нет?

Match User backup
    PasswordAuthentication no  
    PubkeyAuthentication yes  
    AllowTCPForwarding no  
    X11Forwarding no  
    ForceCommand /home/backup/cron/validate-rsync  

Скрипт validate-rsync:

#!/bin/sh   
#script to validate rsync  
#script source: http://troy.jdmz.net/rsync/#validate-rsync  

case "$SSH_ORIGINAL_COMMAND" in   
*\&*)   
echo "Rejected"   
;;   
*\(*)   
echo "Rejected"   
;;   
*\{*)   
echo "Rejected"   
;;   
*\;*)   
echo "Rejected"   
;;   
*\<*)   
echo "Rejected"   
;;   
*\`*)   
echo "Rejected"   
;;   
*\|*)   
echo "Rejected"   
;;   
rsync\ --server*)   
$SSH_ORIGINAL_COMMAND   
;;   
*)   
echo "Rejected"   
;;   
esac   

Мой главный вопрос: почему не работает ForceCommand / usr / bin / rsync?

Мне также интересно узнать, как лучше всего это сделать. Я не могу удалить пользователя резервной копии, потому что копирую из нескольких разных папок. Я действительно не хочу использовать полную команду rsync --server --client и т.д., потому что я копирую несколько разных папок, и это кажется чрезмерным. Мне любопытно найти самый простой / лучший способ (-а) ограничить пользователя резервного копирования rsync.

В ForceCommand опция предназначена для использования с командой, которая специально понимает, что действует как Привратник SSH. Исходная команда помещается в SSH_ORIGINAL_COMMAND переменная окружения.

В Зачем это легко... ForceCommand делает именно то, что он говорит: вы подключаетесь, он заставляет вас запускать эту команду независимо от того, что вы на самом деле хотели сделать. В этом случае эта команда /usr/bin/rsync без флагов.

rsync работает, запустив другую копию rsync на другой стороне соединения и разговаривает с ним по ssh. В этом случае, однако, он не может запустить другую сторону с необходимыми флагами, потому что команда заменена на /usr/bin/rsync

Ваш сценарий rsync-validate, вероятно, лучший способ решить эту проблему. Он проверяет запрос, чтобы убедиться, что это допустимая команда сервера rsync, и только после этого выполняет ее. rsync наверное мог можно изменить, чтобы проверять $ SSH_ORIGINAL_COMMAND напрямую, когда он запускается без аргументов, но, вероятно, есть веская причина безопасности не делать этого.