对所有实际上无法执行的可执行文件进行智能 chmod -x

对所有实际上无法执行的可执行文件进行智能 chmod -x

天空射击:您是否有一个脚本,可以对系统中所有实际上无法执行的可执行文件执行 chmod -x(即,它们错误地具有x标志)?

(上下文:
将备份文件从 NTFS 复制到 ext4 后,这些文件变为可执行文件(html、md、txt 等)。我想让这些文件不可执行,但只让那些真正不可执行的文件不可执行。我可能必须编写遍历系统中的所有文件的脚本(例如for f in ``find /path``; do intelligent_chmod -x $f; done;intelligent_chmod必须查看文件并确定它是 ELF 还是具有第一行!#...,等等)

答案1

它使用find命令来查找设置了可执行位的常规文件。然后使用命令测试它们,file看看它们是否真的是可执行文件。如果不是,我们运行chmod a-x它们:

find . -type f -executable \( -exec sh -c 'file -b "$1" | grep -q executable' Test {} \; -o -exec chmod a-x {} \; \)

如您所见,此find命令有两个-exec表达式,它们通过逻辑或运算符连接起来。

怎么运行的

  • -type f -executable

    这告诉 find 仅查找设置了可执行位的常规文件。

  • \(

    这就开始了一组。

    默认情况下,find条件是用 AND 连接在一起的,AND 比 OR 更紧密。在本例中,我们只想用-execOR 将以下两个命令绑定在一起。为此,我们需要一个组。

  • -exec sh -c 'file -b "$1" | grep -q executable' Test {} \;

    这让file程序检查每个文件并grep检查字符串是否executable在命令的输出中file

    在上文中,Test用作脚本的程序名 ( $0) 。(有关和sh -c的讨论,请参阅$0sh -c这个问题

    以下是该file命令的一些示例输出:

    $ file -b bash
    ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=0e188133c8cc5187e22eabd27cbcf46f32060fe3, stripped        
    $ file -b which
    POSIX shell script, ASCII text executable
    

    正如您所见,file它足够智能,不仅可以识别为可执行文件,还可以识别各种各样的脚本文件。

  • -o

    file这是逻辑或。这意味着,只有当未将文件标识为可执行文件时,才会执行后面的命令。

  • -exec chmod a-x {} \;

    这将删除可执行位。

  • \)

    这表明find我们已经到达分组命令的末尾。

限制

如 中所述man magic,该程序file通过检查文件中的字符串来工作。许多文件都有非常独特的字符串。例如,ELF 可执行文件以十六进制字符 开头7f 45 4c 46。JPEG 和 PNG 图形具有类似的独特标记。 file不会完全解析或分析文件,因此,对于某些文件,魔术会失败。正如 Ayrat 在评论中指出的那样,file误解了以下内容:

$ cat tmp.py
Now is the time for all good men
to come to the aid of the party.
from xxx import yyy
$ file tmp.py
tmp.py: Python script, ASCII text executable

相关内容