2013-11-28 3 views
2

Привет, я новичок в Linux, и я пытался синхронизировать две папки с командой rsync. Я использую CentOS, и когда я выполняю команду (#rsync -zvr /tmp/f1/ /tmp/f2/) через командную строку работает нормально, но через rc.local при перезагрузке не работает. Отображается следующее сообщение:rsync не работает при запуске?

sending incremental file list 

rsync: change_dir "/tmp/f1" failed: Permission denied (13) 

rsync: ERROR: cannot stat destination "/tmp/f2/": Permission denied (13) 

rsync error: errors selecting input/output files, dirs (code 3) at main.c(554) [receiver=3.0.6] 

rsync: connection unexpectedly closed (9 bytes received so far) [sender] 

rsync error: error in rsync protocol data stream (code 12) at io.c(600) [sender=3.0.6] 

Пожалуйста, помогите?

+0

Каков результат '' getenforce'' как root? –

+0

SELinux статус: включен SELinuxfs установки:/SELinux Текущей режим: соблюдение режима из конфигурационного файла: соблюдение версии политики: 24 политики из конфигурационного файла: целевой – nix

ответ

0

Если вы только перезагружается/TMP будет очищен и поэтому/TMP/f1 и/TMP/f2 не существует

rc.local обычно проходит довольно поздно в последовательности загрузки, так что я думаю, что/tmp монтируется rw, но возможно, что он все еще только установлен ro

+0

Если '/ tmp' был установлен R/O, сообщение об ошибке будет «файловая система только для чтения», а не «разрешено», хотя (и «stat()» будет успешным в первую очередь). –

+0

@ Фредерик Хамиди, согласен. Но должна быть некоторая причина, что/tmp/f2 не может быть сделано – Vorsprung

+0

Но проблема в любой папке в любом другом месте. Команда работает через командную строку, но не через выполнение rc.local. Я пытаюсь изменить разрешение команды в rc.local с добавлением su-root -c "..command ..", но все та же проблема. – nix

1

У вас возникли проблемы с SELinux. SELinux - это модуль, который обеспечивает гораздо более мелкозернистый контроль доступа, чем разрешения файловой системы и ACL. Среди прочего, он будет запрещать доступ к файлам для rsync по умолчанию, если он не запускается пользователем с терминала. Теперь, как вы можете позволить ему получить доступ к файлам, которые вы хотите?

Существует два варианта. Если дело только с каталогами никакая другая служба (включая HTTPD или такие) не нужен доступ, вы можете сделать следующее:

semanage fcontext -a -t public_content_t "/tmp/f1(/.*)?" 
semanage fcontext -a -t public_content_t "/tmp/f2(/.*)?" 

Это должно постоянно менять правила SELinux, чтобы директории/TMP/f1 и/tmp/f2, доступный rsync. Фактически, он установит тип public_content_t в каталогах и файлах. Узлы с этим типом доступны rsync. Однако есть уловка, как упоминалось: узел (каталог или файл) может содержать только один тип. У многих служб есть другие требования к файлам, к которым они обращаются (например, sshd требует ssh_t), поэтому вы не можете это сделать в/etc, например.

Другим решением является постоянное разрешение доступа rsync к всем файлам. Это нормально, если вы не запустите Rsync демона:

setsebool -P rsync_full_access 1 

После этого Rsync будет в состоянии получить доступ ко всем файлам, даже если бежать от инициализации, а не с терминала пользователя.


Почему разница, если Rsync запускается демон или пользователем?

(это верно только для наиболее распространенных, targeted политики)

SELinux знает пользователей, и обычные пользователи используют SELinux-пользователя unconfined_u. unconfined_u разрешено делать почти все, что позволяют ACL файловой системы. Однако init и такие работают как system_u, а system_u гораздо более ограничены. Это помогает предотвратить атаки на httpd и других демонстрантов.

+0

Со второй команды я получил это: libsemanage.dbase_llist_set: запись не найдена в базе данных libsemanage.dbase_llist_set: не удалось установить рекорд стоимости Невозможно изменить логическое rsync_full_access Не удалось изменить политику булевы – nix

+0

я пытался по первому пути и это то, что я получил на экране после того, как я вызвал rc.local через командную строку: отправка инкрементного списка файлов rsync: change_dir «/ tmp/f1» не удалось: разрешение отклонено (13) rsync: ОШИБКА: destination "/ tmp/f2 /": Разрешение отклонено (13) Ошибка rsync: ошибки выбора файлов ввода/вывода, dirs (код 3) в main.c (554) [receiver = 3.0.6] rsync: соединение неожиданно закрыто (получено 9 байтов) [отправитель] Ошибка rsync: ошибка в потоке данных протокола rsync (код 12) в io.c (600) [sender = 3.0.6] – nix

+0

Можете ли вы сделать ' 'mkdir/tmp/f1'' и' 'ls -dZ/tmp/f1''. Что такое контекст SELinux в каталоге? (строка, которая похожа на '' foo_u: bar_r: baz_t'') –

Смежные вопросы