好吧,具体来说就是chmod -R 755
。现在每个文件都是可执行文件,我不需要。我认为我应该查看的每个文件的前两个字节#!
,但这会覆盖所有内容吗?我是否应该使用它file
来查看所有内容并基于此做出决定?还是更有可能做到这一点的更好方法?
递归遍历目录并在不是“应该是”可执行文件的文件上设置-x的首选方法是什么?
/
,这是我完全拥有的目录。
好吧,具体来说就是chmod -R 755
。现在每个文件都是可执行文件,我不需要。我认为我应该查看的每个文件的前两个字节#!
,但这会覆盖所有内容吗?我是否应该使用它file
来查看所有内容并基于此做出决定?还是更有可能做到这一点的更好方法?
递归遍历目录并在不是“应该是”可执行文件的文件上设置-x的首选方法是什么?
/
,这是我完全拥有的目录。
Answers:
这里没有魔术子弹。权限携带的信息并不总是多余的。
如果在系统目录中执行此操作,则系统将处于非常糟糕的状态,因为您将不得不担心setuid和setgid位,不应该被世界范围了解的文件以及文件应该是团体或世界可写的。
在每个用户的目录中,您必须担心不应被全世界读取的文件。没有人可以帮助您。
至于可执行性,一个好的经验法则是使所有看起来无法执行的事物都是不可执行的。内核可以执行脚本,其前两个字节为#!
,ELF二进制文件的前四个字节为\x7fELF
where \x7f
是值为12的字节,以及一些较稀有的文件类型(a.out,向其注册的任何文件binfmt_misc
)。因此,以下命令应将您的权限恢复到合理的状态(假设bash 4或zsh,否则用于find
遍历目录树;警告,直接在浏览器中键入):
for x in **/*; do
if ! [ -f "$x" ]; then continue; fi # skip all but regular files
case $(head -c 4 "$x") in
"#!"??) :;; # skip script
"\x7fELF") :;; # skip ELF executable
*) chmod a-x "$x";;
esac
done
请注意,在Linux以及可能具有ACL支持的其他unice上,有一种简单的方法来备份和还原目录树的权限:
getfacl -R >saved-permissions
setfacl --restore=saved-permissions
**/*
必需的globstar
。
find
而不是globstar;二,而不是看着头部,使用file
命令查看其内容并从那里分支。
find
的可靠性不如globstar
,globstar
几乎在每种情况下都可取。
我相信你会想要像
find dir -type f -exec chmod ugo-x '{}' +
这将在dir中递归地查找所有常规文件(不包括目录和设备),并删除可执行文件。
我将从这里开始,然后按照我的方式制作应该是可执行的文件。
以下代码应完全按照您的要求运行(它将找到所有常规文件,对它们进行grep表示为#!,然后如果找不到x位,则将其删除)
find . -type f | xargs grep -L #! | xargs chmod ugo-x
可能是上面的更好的版本(更少的管道)
find . -type f -exec grep -L #! '{}' + | xargs chmod ugo-x
grep -L '^#!'
至少要做到这一点(引号是必需的,并且^
限制在行的开头进行匹配),但是由于它#!
在任何行上都匹配,因此仍然过于宽松。如果xargs
文件名包含空格或引号,则使用将失败;使用xargs -d '\n'
(需要GNU xargs
)。
/
另一个目录中执行此操作吗?