仅列出未加密的文件

时间:2012-03-02 13:18:40

标签: shell unix solaris sh

首先,我不是任何一个Unix专家,所以请原谅我的问题。

我要求列出给定目录中可能包含加密和未加密文件的未加密文件。

我无法通过文件扩展名可靠地识别这些文件,并希望SO社区中的某些人能够帮助我。

我可以跑:

file * | egrep -w 'text|XML'

但这只会识别文本或XML文件。如果我不能做得更好,我可以使用它,因为目前directry中唯一的其他文件是文本或XML文件,但我真的想要识别所有未加密的文件,无论它们是什么类型。

这可以在单行命令中使用吗?

编辑:加密文件通过openSSL加密

我用来取消加密文件的命令是:

openssl -d -aes128 -in <encrypted_filename> -out <unencrypted_filename>

2 个答案:

答案 0 :(得分:1)

你的问题不是一件轻而易举的事。 solaris文件命令使用“magic” - / etc / magic。这是一组试图尝试确定文件的风格的规则。它并不完美。

如果您阅读了/ etc / magic文件,请注意最后一列是文件命令输出中的文件,当它识别文件中的某些结构时。

基本上,file命令查看文件的前几个字节,就像系统调用的exec()系列一样。因此,在文件的第一行中的#/ bin / sh,在行的第一个字符中,标识exec()exec()需要调用以“运行”文件的“命令解释器”。文件有相同的想法,并说“命令文本”“awk文本”等。

您的问题是您必须确定您将从文件输出的文件类型。您需要花时间深入研究未加密的文件,以查看您可以从文件中获得的“答案”。否则,您可以在整个目录树上运行文件,并整理出您认为正确答案的所有内容。

find /path/to/files -type f -exec file {} \; | nawk -F':' '!arr[$2]++'  > outputfile

这会为您提供有关您认为的文件的明确答案列表。把你喜欢的那些放在一个文件中,称之为good.txt

find /path/to/files -type f -exec file {} \; > bigfile
nawk -F':' 'FILENAME=="good.txt" {arr$1]++}
          FILENAME=="bigfile" {if($2 in arr) {print $1}} ' good.txt bigfile > nonencryptedfiles.txt

这不是100%保证。文件可以被欺骗。

答案 1 :(得分:1)

识别加密文件的方法取决于它们包含的随机性或entropy。加密的文件(或至少加密的文件)在统计意义上应该是随机的。包含未加密信息的文件(文本,图形,二进制数据或机器代码)在统计上不是随机的。

计算随机性的标准方法是使用autocorrelation函数。您可能只需要对每个文件的前几百个字节进行自相关,因此该过程可以非常快。

这是一个黑客,但你可能能够利用压缩算法的一个属性:它们通过从数据中删除随机性来工作。加密文件无法压缩(或者再次压缩,至少不会压缩),因此您可能会尝试压缩每个文件的某些部分并比较压缩率。

SO还有其他几个关于寻找随机性或熵的问题,其中很多都有很好的建议,比如这个: How can I determine the statistical randomness of a binary string?

祝你好运!