该脚本没有按照我想象的方式工作。
我虽然它会发现所有将每个 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 {} +
(并添加-vv
GNU 或 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
具有x
、w
、xw
、r
、rx
、rw
或rwx
权限的文件。将过滤器的前导字符从 更改为/
,使过滤器具有排他性,并且仅与字段中的-
文件匹配。rwx
other
答案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