比方说,有人提供了一个tarball,说这是源代码,没有别的。 你要确保这是真的,没有病毒的可执行文件或库被藏在一个目录中。 如何使用find命令来做到这一点?
谢谢。
你可以在一个安全的地方解压文件(比如挂载noexec的文件系统 )并检查生成的目录中的二进制文件。 file命令可以告诉你一个文件是文本,源代码,二进制文件等
[root@xt ~]# file ./packages/Digest-MD5-2.33/t/badfile.t ./packages/Digest-MD5-2.33/t/badfile.t: ASCII text [root@xt ~]# file ./packages/Digest-MD5-2.33/MD5.pm ./packages/Digest-MD5-2.33/MD5.pm: Perl5 module source text [root@xt ~]# file ./packages/rrdtool-1.0.50/src/gdpng.o ./packages/rrdtool-1.0.50/src/gdpng.o: ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped
类似于以下内容,您可以在其中筛选ELF可执行文件:
find . -type f -exec file {} + | grep ELF
输出将是:
[root@xt ~]# find . -type f -exec file {} + | grep ELF ./packages/rrdtool-1.0.50/gd1.3/gdfontl.o: ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped ./packages/rrdtool-1.0.50/gd1.3/gdfontmb.o: ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped ./packages/rrdtool-1.0.50/gd1.3/gdlucidan10l2.o: ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped ./packages/rrdtool-1.0.50/gd1.3/gdlucidab14.o: ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped ./packages/rrdtool-1.0.50/gd1.3/gdlucidan10.o: ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped
标记为可执行文件的文件不一定是可执行文件或可加载文件或对象。
这是我使用的:
find ./ -type f -name "*" -not -name "*.o" -exec sh -c ' case "$(head -n 1 "$1")" in ?ELF*) exit 0;; MZ*) exit 0;; #!*/ocamlrun*)exit0;; esac exit 1 ' sh {} \; -print