![覆盖 700 权限,使其成为组可读或至少可供给定用户(但所有者除外)访问?](https://linux22.com/image/221761/%E8%A6%86%E7%9B%96%20700%20%E6%9D%83%E9%99%90%EF%BC%8C%E4%BD%BF%E5%85%B6%E6%88%90%E4%B8%BA%E7%BB%84%E5%8F%AF%E8%AF%BB%E6%88%96%E8%87%B3%E5%B0%91%E5%8F%AF%E4%BE%9B%E7%BB%99%E5%AE%9A%E7%94%A8%E6%88%B7%EF%BC%88%E4%BD%86%E6%89%80%E6%9C%89%E8%80%85%E9%99%A4%E5%A4%96%EF%BC%89%E8%AE%BF%E9%97%AE%EF%BC%9F.png)
鉴于应用程序正在写入具有700
权限的文件,这意味着该组无法读取这些文件,因此我需要特殊的备份用户帐户可以读取这些文件。
ACL
似乎完全没用,因为chmod
修改了掩码并且除所有者或其他组之外的用户仍然没有权限。
- 定期进行递归
chmod
? Hakish 和资源浪费,尤其是在非常大的文件集上。 - 为此使用root(通过sudo)?不安全。没有细粒度的控制。不适合在远程计算机(例如 NAS)上启动的 rsync。
- 使用与制作这些文件的应用程序相同的用户,即使用所有者用户进行备份。仍然是哈克式的,不受欢迎,因为备份用户应该有仅限读取访问权限且仅限给定目录。。对于从外部发起的 rsync 尤为重要。
- 使用类似
bindfs
?的方法将给定目录安装到另一个目录性能受到很大影响,对于这种简单的与权限相关的任务来说是不合理的。
我想知道为什么linux不允许管理员指定应用程序对文件的最小允许权限(可以使用掩码限制最大权限,但不能强制执行或透明添加,这看起来很奇怪)
有什么解决办法吗?
答案1
在类似的情况下,我采取了这种chmod
方法,但通过在启动时启动并由inotifywait
。这是我实际使用的代码的精简版本,它还处理所有权/分组关系,并记录所有更改或错误:
#!/bin/bash
inotifywait --monitor --recursive --event create,attrib --format '%w%f' "$@" |
while IFS= read -r item
do
# Avoid looping when we apply the fix-up chmod
perm=$(stat -c %A "$item")
if [[ -d "$item" ]] && [[ ! "$perm" =~ dr.xr.xr-x ]]
then
# Directory with wrong permissions
printf 'dir\t%s\n' "$item"
chmod ug+rx,o=rx "$item"
fi
if [[ ! -d "$item" ]] && [[ ! "$perm" =~ -r..r..r.. ]]
then
# Item (not a directory) with wrong permissions
printf 'other\t%s\n' "$item"
chmod ug+rw,o-w,o+r "$item"
fi
done
尽管您会发现chmod
代码无法处理包含换行符的文件名,但这是由一个仅在创建文件或修改其属性时触发的工具来调节的。对于大型理智数据集是可接受的。
您可能希望通过一个偶尔的过程来补充这一点,无条件地修复所有权限。此示例确保用户/组权限至少具有读取(如果是目录则为执行),其他人的权限相同但没有写入:
find /path/to/base -type d -exec chmod ug+rx,o=rx {} \; -o -exec chmod ug+rw,o-w,o+r {} \;
如果我今天编写解决方案,我可能会考虑incron
而不是循环