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

Lar*_*ang 22 permissions chmod files

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

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

Gil*_*il' 16

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

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

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

至于可执行性,一个好的经验法则是让所有看起来不能执行的东西都不可执行。内核可以执行前两个字节是 的脚本,前#!四个字节是\x7fELF其中\x7f值为 12 的字节的ELF 二进制文件,以及一些罕见的文件类型(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
Run Code Online (Sandbox Code Playgroud)

请注意,在 Linux 和其他支持 ACL 的 unice 上,有一种简单的方法可以备份和恢复目录树的权限:

getfacl -R >saved-permissions
setfacl --restore=saved-permissions
Run Code Online (Sandbox Code Playgroud)


xen*_*ide 8

我相信你会想要类似的东西

find dir -type f -exec chmod ugo-x '{}' +

这会在目录中递归查找所有常规文件(不包括目录和设备)并删除可执行位。

我将从这里开始,然后努力制作应该是可执行的、可执行的文件。

以下应该完全按照您的要求工作(它将找到所有常规文件,将它们搜索为 #! 然后删除 x 位(如果未找到)

find . -type f | xargs grep -L #! | xargs chmod ugo-x
Run Code Online (Sandbox Code Playgroud)

可能是上述版本的更好版本(更少的管道)

find . -type f -exec grep -L #! '{}' + | xargs chmod ugo-x 
Run Code Online (Sandbox Code Playgroud)

  • 至少使 `grep -L '^#!'`(引号是必需的,并且 `^` 限制在行首匹配),但它仍然过于宽松,因为它匹配任何行的 `#!` . 使用 `xargs` 将失败,文件名包含空格或引用字符;使用 `xargs -d '\n'`(需要 GNU `xargs`)。 (3认同)