我不小心在目录上使用chmod -R + x。如何还原正确的权限?


20

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

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


您是在/另一个目录中执行此操作吗?
gvkv

1
@gvkv:不是/,这是我完全拥有的目录。
拉里·王

1
@Larry将来,您可能应该使用+ x的某种变体而不是强奸所有权限,并可能导致对所有文件的写入。
xenoterracide

@xenoterracide:同意。我真正想要的是授予组与我相同的权限(这确实发生了!),我只是在打字之前没有做足够的思考。
拉里·王

我们正在谈论多少个文件?有多少可执行文件?有什么办法可以从文件名中分辨出来吗?
David Thornley,2010年

Answers:


15

这里没有魔术子弹。权限携带的信息并不总是多余的。

如果在系统目录中执行此操作,则系统将处于非常糟糕的状态,因为您将不得不担心setuid和setgid位,不应该被世界范围了解的文件以及文件应该是团体或世界可写的。

在每个用户的目录中,您必须担心不应被全世界读取的文件。没有人可以帮助您。

至于可执行性,一个好的经验法则是使所有看起来无法执行的事物都是不可执行的。内核可以执行脚本,其前两个字节为#!,ELF二进制文件的前四个字节为\x7fELFwhere \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命令查看其内容并从那里分支。
Shadur 2011年

@Shadur find的可靠性不如globstarglobstar几乎在每种情况下都可取。
克里斯·

1
@Gilles在“如果拥有它,它会更优越”中更可取,它不仅速度更快,而且更可靠(并且没有意外的SNAFU)。
克里斯·

6

我相信你会想要像

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 

3
grep -L '^#!'至少要做到这一点(引号是必需的,并且^限制在行的开头进行匹配),但是由于它#!在任何行上都匹配,因此仍然过于宽松。如果xargs文件名包含空格或引号,则使用将失败;使用xargs -d '\n'(需要GNU xargs)。
吉尔斯(Gillles)“所以-别再邪恶了”,2010年

0

好吧,没有shebang行,该文件将作为shell脚本执行,名义上使用/bin/sh。您的想法是一个好的开始,并且假设所讨论的目录不包含关键任务文件,则执行某些目录grepchmod组合可能不会有太大的风险。您可能会遇到误报,即,带有shebang行的文件本来不是要设置其可执行位的,但是在不了解有关目录内容的目的的更多信息的情况下,只有您才能确定这是否对您的目录构成了重大的生存威胁系统和/或数据。


我并不担心假阳性和假阴性。有些二进制文件我不以开头#!
拉里·王
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.