Допустим, кто-то предоставляет вам архив, говоря, что это исходный код и ничего больше. Вы хотите убедиться, что это правда, и что никакие загруженные вирусом исполняемые файлы или библиотеки не спрятаны в каталог. Как использовать для этого команду 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