我想建立一个目录,其中所有新文件和目录都具有特定的访问掩码,并且目录还设置了粘性位(t
限制删除这些目录内的文件的粘性位)。
对于第一部分,我的理解是我需要为父目录设置默认ACL。但是,新目录不会t
从父目录继承该位。因此,非所有者可以删除子目录中的文件。我可以解决这个问题吗?
答案1
这是一个允许组成员的配置,测试,创建和修改组文件,同时不允许删除和重命名文件,除非其所有者和“其他人”除外。使用用户名,列弗并假设 umask 为 022:
groupadd acltest
usermod -a -G acltest lev
注销 root 帐户并列弗帐户。登录并成为 root 或使用须藤:
mkdir /tmp/acltest
chown root:acltest /tmp/acltest
chmod 0770 /tmp/acltest
chmod g+s /tmp/acltest
chmod +t /tmp/acltest
setfacl -d -m g:acltest:rwx /tmp/acltest
setfacl -m g:acltest:rwx /tmp/acltest
ACL 无法设置粘滞位,并且粘滞位不会复制到子目录。但是,你可能会使用inotify或类似的软件来检测文件系统中的更改(例如新目录),然后做出相应的反应。
例如,在 Debian 中:
apt-get install inotify-tools
然后制作一个脚本inotify, 喜欢/usr/local/sbin/set_sticky.sh
。
#!/usr/bin/env bash
inotifywait -m -r -e create /tmp/acltest |
while read path event file; do
case "$event" in
*ISDIR*)
chmod +t $path$file
;;
esac
done
授予其执行权限根: chmod 0700 /usr/local/sbin/set_sticky.sh
。然后在启动时从(例如)/etc/rc.local
或任何合适的 RC 文件运行它:
/usr/local/sbin/set_sticky.sh &
当然,在这个例子中,/tmp/acltest
应该在重新启动时消失。否则,这应该像魅力一样发挥作用。
答案2
根据父级递归设置粘滞位
可以通过以下语句找到没有粘性位的目录,其中-
值前面的连字符1000
应被视为与此权限值和更高权限值匹配的前缀。
$ find . -type d \! -perm -1000
因此,这是一种设置粘滞位以及setgid
父目录设置了粘滞位的目录的方法。
find
如果不是这样的话,那就需要一个嵌套语句find
语句不能嵌套。
这就是为什么相反管道带有递归条件的将用于在没有粘性位的情况下找到的目录。
考试-k
如果设置了粘性位(在本例中为父目录的粘性位),则返回 true。
$ find . -type d \! -perm -1000 |while read d; do if [[ -k "$d/.." ]]; then chmod +t,g+s "$d"; fi; done
看这里为了更多的find
乐趣和关于的解释setgid
。
答案3
您可以创建一个函数 mkdir 并将其附加到文件末尾,vi ~/.bashrc
如下所示:
mkdir(){
/bin/mkdir "$@"
find . -type d \! -perm -1000 |while read d; do if [[ -k "$d/.." ]]; then chmod +t,g+s "$d"; fi; done
}
-k
选项检查粘滞位是否已设置,而不是 GUID,这也在此处设置g+s
,检查man test
这些选项
另外,你可以这样做:
unalias mkdir;
source ~/.bashrc
这应该为新子目录设置粘滞位,但前提是父目录设置了粘滞位。
此方法似乎有效,但不确定是否适合所有用户!