用一个方案可以很好地说明这一点。当我写“测试:OK”或“测试:失败”时,我正在重新启动 apache 服务器(httpd 服务)。基本上,在 target_host 中以 root 身份执行所有操作:
scp user@source_host:/etc/httpd/conf.d/custom.conf /home
mv /home/custom.conf /etc/httpd/conf.d/
测试失败
scp user@source_host:/etc/httpd/conf.d/custom.conf /etc/httpd/conf.d/
测试:好的
scp user@source_host:/etc/httpd/conf.d/custom.conf /
mv /custom.conf /etc/httpd/conf.d/
测试:好的
使用时的行为相同:
scp root@source_host...
当测试:失败时:
Iniciando httpd: httpd: Syntax error on line 221 of /etc/httpd/conf/httpd.conf: Could not open configuration file /etc/httpd/conf.d/custom.conf: Permission denied
“Iniciando”是西班牙语,意思是“开始”
conf.d 内的权限始终为 (ls -ln):
-r--r--r--. 1 0 0 311 Jun 18 14:19 custom.conf
scp 是否更改了这些文件中的某些内容,以便 apache 可以或不读取它们?
答案1
是的,scp
更改权限。它在复制时会创建一个新文件,并且该新文件将使用您创建它的目录的默认权限创建:
terdon@local$ ls -l aa
-rwx------ 1 root root 0 Jun 19 15:37 aa
terdon@local$ scp aa terdon@remote:/home/terdon/aa
terdon@remote$ ls -l aa
-rw-r--r-- 1 terdon terdon 587 2013-06-19 15:38 aa
如果您不想这样做,请使用该-p
标志:
-p Preserves modification times, access times, and modes from the original file.
terdon@local$ scp -p aa terdon@remote:/home/terdon/aa
terdon@remote$ ls -l aa
-rwx------ 1 terdon terdon 587 2013-06-19 15:38 aa
另一个可能的问题是文件的用户已更改。如果您想复制可能需要拥有的配置文件,请root
确保使用scp root@remote
.
答案2
SELinux 将阻止 Apache 进程读取标记为用户主目录内容 (user_home_t) 或数据库数据 (mysql_db_t) 的数据。
我还了解到,差异在于 SELinux 分配给文件的标签。您可以通过检查它们ls -Z
。就我而言:
-r--r--r--. root root unconfined_u:object_r:home_root_t:s0 custom.conf
-r--r--r--. root root unconfined_u:object_r:httpd_config_t:s0 custom_ok.conf
使用第二个文件时,Apache 将重新启动。第一个失败了。事实上,当我将 custon_ok.conf 移至 home 时,没有任何变化。但是当我对 home 进行 cp 或 cp -p 操作时,新文件具有标签
unconfined_u:object_r:home_root_t:s0
这样当移回 /etc/httpd/conf.d 时 Apache 将无法读取它