天空射击:您是否有一个脚本,可以对系统中所有实际上无法执行的可执行文件执行 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 更紧密。在本例中,我们只想用-exec
OR 将以下两个命令绑定在一起。为此,我们需要一个组。-exec sh -c 'file -b "$1" | grep -q executable' Test {} \;
这让
file
程序检查每个文件并grep
检查字符串是否executable
在命令的输出中file
。在上文中,
Test
用作脚本的程序名 ($0
) 。(有关和sh -c
的讨论,请参阅$0
sh -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