您好我是Linux的新手,我一直在尝试使用rsync命令同步两个文件夹。我正在使用CentOS,当我通过命令行执行命令(#rsync -zvr /tmp/f1/ /tmp/f2/
)工作正常,但通过重启时rc.local无效。显示以下消息:
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 :(得分:1)
您遇到SELinux时遇到问题。 SELinux是一个模块,它允许比文件系统权限和ACL更精细的访问控制。其中,如果用户没有从终端运行rsync,它将默认禁止访问rsync文件。现在,您如何让它访问您想要的文件?
有两种选择。如果您只处理目录没有其他服务(包括httpd等)需要访问,您可以执行以下操作:
semanage fcontext -a -t public_content_t "/tmp/f1(/.*)?"
semanage fcontext -a -t public_content_t "/tmp/f2(/.*)?"
这应该持久地更改SELinux规则,以使rsync可以访问目录/ tmp / f1和/ tmp / f2。实际上,它会在目录和文件上设置public_content_t
类型。 rsync可以访问具有该类型的节点。但是,如上所述,有一个问题:节点(目录或文件)只能有一个类型。许多服务对他们访问的文件有其他要求(例如sshd需要ssh_t
),因此您不能在/ etc中执行此操作。
另一种解决方案是持久允许rsync访问所有文件。如果您不运行rsync守护程序,这很好:
setsebool -P rsync_full_access 1
之后,rsync将能够访问所有文件,即使从init而不是从用户终端运行。
如果守护程序或用户启动rsync,为什么会有所不同?
(仅适用于最常见的targeted
政策)
SELinux了解用户,普通用户使用SELinux-user unconfined_u。 unconfined_u允许执行文件系统ACL允许它执行的几乎所有操作。但是,init等运行为system_u,而system_u则受到更多约束。这有助于防止对httpd和其他暴露的守护进程的攻击。</ p>
答案 1 :(得分:0)
如果刚重新启动/ tmp将被清除,因此/ tmp / f1和/ tmp / f2将不存在
rc.local通常在启动序列中运行得很晚,所以我猜想/ tmp是挂载的,但它可能仍然只是挂载了