我正在学习 CentOS/Red Hat 6 的 ACL;当我getfacl
使用绝对路径运行时,我得到输出:
getfacl:从绝对路径名中删除前导“/”
为什么需要这样做?在什么情况下需要使用-p
or--absolute-names
开关?
我的 Wale Soyinka 和 Michael Jang 的书甚至没有提及这一点,我在手册页中没有看到任何线索,而且我似乎找不到任何直接解决此警告的网站。
答案1
从手册页getfacl
:
-p, --absolute-names
Do not strip leading slash characters (`/'). The default behavior
is to strip leading slash characters.
当您在不使用开关的情况下提供绝对路径时,会发出警告消息-p
。
当为命令提供绝对路径时,输出会有所不同getfacl
。
不-p
带开关:
$ getfacl /path/foo/bar
getfacl: Removing leading '/' from absolute path names
# file: path/foo/bar
[Output truncated...]
请注意,文件路径中的前导斜杠仅在-p
使用开关时显示。
$ getfacl -p /path/foo/bar
# file: /path/foo/bar
[Output truncated...]
-p
当您通过管道传输输出以进行进一步处理时,保留前导斜杠非常有用。
当为命令提供相对路径时,输出是相同的getfacl
。
$ getfacl bar
# file: bar
[Output truncated...]
没有变化:
$ getfacl -p bar
# file: bar
[Output truncated...]
答案2
我不认为“因为你没有使用'-p'标志“真正解释了目的的这个警告。
这些命令旨在实施细粒度的安全措施,显然考虑到传统 POSIX 权限允许的更强安全性。
因此,我会转而寻求安全理论:考虑每种情况下可能出现的问题,并选择“最安全”的默认值。
- 按预期使用相对或绝对路径:没问题。
- 应使用绝对路径时使用相对路径:不起作用,但不太可能导致安全漏洞。 (此外,可以简单地预先修复
cd /
。) - 当应该使用相对路径时使用绝对路径。这就是此限制旨在强调的目的。
考虑一个项目安装脚本
setfacl -m u:1234:rw $project_dir/etc/passwd
现在想想如果有错误并且$project_dir
是空的会发生什么。 (也许它应该被拼写为$projectdir
,或者配置文件丢失,因此它从未被设置,或者存在其他类型的错误。)
同样的原理也适用于getfacl
,因为它的用例之一是:
getfacl some/file | { make some changes } | setfacl -b -M- some/file
或同等地
getfacl some/file > aclfile
edit aclfile
setfacl -b -M aclfile some/file
也许更重要的是
getfacl some/file > aclfile
edit aclfile
setfacl --restore=aclfile
(请注意,在最后一种情况下,目标文件名是不是包含在setfacl
命令行中;它是从 aclfile 中读取的。)
您可能会认为“它应该以与 、chmod
、和相同的方式工作”,从某种意义上说您是对的:如果这些命令对未通知的绝对路径具有相同的限制,它们会更安全。chown
chgrp
install
但这些命令有着悠久的历史先例(主要是它们背后的 POSIX 标准),因此它们并不真正适合谈判,即使安全专家认为这是一个好主意。
这在其他地方并非没有先例。
rsync -R
在接收端将路径视为相对路径,忽略前导/
.
诸如cpio
和 之类的归档器tar
(以前用于包裹递送deb
并rpm
变得流行)可以选择修剪前导/
,出于同样的原因,但具有相反的默认设置(关闭)。