我不小心在目录上 chmod -R +x 。如何恢复正确的权限?

我不小心在目录上 chmod -R +x 。如何恢复正确的权限?

嗯,具体来说,是chmod -R 755。现在每个文件都是可执行的,这是我不想要的。我想我应该查看每个文件的前两个字节#!,但这会涵盖所有内容吗?我应该file看看一切并以此为基础做出决定吗?或者,更有可能的是,是否有更好的方法来做到这一点?

递归地遍历目录并对不“应该”可执行的文件设置 -x 的首选方法是什么?

答案1

这里没有灵丹妙药。权限携带的信息并不总是多余的。

如果您在系统目录中执行此操作,您的系统将处于非常糟糕的状态,因为您必须担心 setuid 和 setgid 位,以及不应该是世界可读的文件,以及文件应该是组或世界可写的。

在每个用户的目录中,您必须担心那些不应该是所有人可读的文件。那里没有人可以帮助你。

至于可执行性,一个好的经验法则是让所有看起来不能执行的东西成为不可执行的。内核可以执行前两个字节为 的脚本、前四个字节为值为 12 的字节#!的 ELF 二进制文件,以及一些较罕见的文件类型(a.out,任何用 注册的文件类型)。因此,以下命令应该将您的权限恢复到合理的状态(假设使用 bash 4 或 zsh,否则用于遍历目录树;警告,直接在浏览器中输入):\x7fELF\x7fbinfmt_miscfind

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.您的想法是一个好的开始,并且假设相关目录不包含关键任务文件,那么执行某些文件grepchmod组合可能不会有太大风险。您可能会遇到误报,即带有 shebang 行的文件并不意味着设置了可执行位,但不知道有关目录中内容的用途的更多信息,只有您可以决定这是否对您的存在构成重大威胁系统和/或数据。

相关内容