![我不小心在目录上 chmod -R +x 。如何恢复正确的权限?](https://linux22.com/image/326/%E6%88%91%E4%B8%8D%E5%B0%8F%E5%BF%83%E5%9C%A8%E7%9B%AE%E5%BD%95%E4%B8%8A%20chmod%20-R%20%2Bx%20%E3%80%82%E5%A6%82%E4%BD%95%E6%81%A2%E5%A4%8D%E6%AD%A3%E7%A1%AE%E7%9A%84%E6%9D%83%E9%99%90%EF%BC%9F.png)
嗯,具体来说,是chmod -R 755
。现在每个文件都是可执行的,这是我不想要的。我想我应该查看每个文件的前两个字节#!
,但这会涵盖所有内容吗?我应该file
看看一切并以此为基础做出决定吗?或者,更有可能的是,是否有更好的方法来做到这一点?
递归地遍历目录并对不“应该”可执行的文件设置 -x 的首选方法是什么?
答案1
这里没有灵丹妙药。权限携带的信息并不总是多余的。
如果您在系统目录中执行此操作,您的系统将处于非常糟糕的状态,因为您必须担心 setuid 和 setgid 位,以及不应该是世界可读的文件,以及文件应该是组或世界可写的。
在每个用户的目录中,您必须担心那些不应该是所有人可读的文件。那里没有人可以帮助你。
至于可执行性,一个好的经验法则是让所有看起来不能执行的东西成为不可执行的。内核可以执行前两个字节为 的脚本、前四个字节为值为 12 的字节#!
的 ELF 二进制文件,以及一些较罕见的文件类型(a.out,任何用 注册的文件类型)。因此,以下命令应该将您的权限恢复到合理的状态(假设使用 bash 4 或 zsh,否则用于遍历目录树;警告,直接在浏览器中输入):\x7fELF
\x7f
binfmt_misc
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
答案2
我相信你会想要类似的东西
find dir -type f -exec chmod ugo-x '{}' +
这会在 dir 中递归地查找所有常规文件(不包括目录和设备)并删除可执行位。
我将从这里开始,然后努力制作应该可执行的文件。
以下内容应完全按照您的要求工作(它将找到所有常规文件,在其中查找 #!,然后如果未找到则删除 x 位)
find . -type f | xargs grep -L #! | xargs chmod ugo-x
可能是上述版本的更好版本(更少的管道)
find . -type f -exec grep -L #! '{}' + | xargs chmod ugo-x
答案3
好吧,如果没有 shebang 行,该文件将作为 shell 脚本执行,名义上带有/bin/sh
.您的想法是一个好的开始,并且假设相关目录不包含关键任务文件,那么执行某些文件grep
和chmod
组合可能不会有太大风险。您可能会遇到误报,即带有 shebang 行的文件并不意味着设置了可执行位,但不知道有关目录中内容的用途的更多信息,只有您可以决定这是否对您的存在构成重大威胁系统和/或数据。