在 bash 脚本中设置文件权限

在 bash 脚本中设置文件权限

该脚本没有按照我想象的方式工作。
我虽然它会发现所有将每个 rwx 权限更改为 xx5 权限的脚本

#!/bin/bash
# the / makes find inclusive


for file in `find . -perm /007 `
do
permissions=`stat -c %a $file`
permissions=${permissions:0:2}5
echo $permissions $file
chmod $permissions $file
done



#find . -perm /007

我的目的是至少保护一些文件

答案1

chmod -R o-w .

将删除写入权限其他的以安全的方式处理每个文件。然而,它会更新每个文件的 ctime,包括那些其他的已经没有写权限了。

使用 GNU chmod,您可以使用 -c 选项使其显示需要更新的文件:

$ chmod -cR o-w .
mode of `./a' changed from 0777 (rwxrwxrwx) to 0775 (rwxrwxr-x)

如果您只想w从中删除其他的在他们有的地方rwx,你可以这样做:

find . ! -type l -perm -7 -exec chmod o-w {} +

(并添加-vvGNU 或 FreeBSDchmod以查看详细信息)。但是(特别是因为您正在处理世界上可写的文件)请注意那里存在竞争条件,其中有不良意图的人可以对那里的任何目录进行写访问,可以在这段时间之间用指向其他文件的符号链接替换文件find检查它并执行,并让您删除对该文件的写入权限并造成严重破坏(例如,chmod考虑符号链接)。/tmp

由于您使用的是 GNUstat语法,因此您很可能find是 GNU find。请注意,find早在 GNU 推出之前,GNU就可以显示文件属性stat,因此您不需要两者兼而有之。

find . ! -type l -perm -7 -printf '%m %p\n' -exec chmod o-w {} +

答案2

/007将显示您唯一没有owner和权限的文件group,以及other.

你可能会有更多的运气/o=rwx。这将仅匹配other文件的权限。

编辑正确性:

显然,您需要使用-perm -o=rwx,因为它/o是一个包容性过滤器,并且会匹配other具有xwxwrrxrwrwx权限的文件。将过滤器的前导字符从 更改为/,使过滤器具有排他性,并且仅与字段中的-文件匹配。rwxother

答案3

您的方法是性能噩梦:您为每个文件创建两个进程!一个完全无用,因为find已经有了这些信息并且可以轻松打印它。这是一个更好的解决方案:

find . -perm -o=rwx -printf "%m %p_\0" 2>/dev/null | 
  while read -r -d '' perms path; do
    path="${path%_}"
    echo "${perms} '${path}'" >&2
    printf "%s\0" "$path"
  done | xargs -0 chmod o=rx

相关内容