以编程方式在 Linux 中查找文件类型
Posted
技术标签:
【中文标题】以编程方式在 Linux 中查找文件类型【英文标题】:Finding file type in Linux programmatically 【发布时间】:2013-01-20 09:28:31 【问题描述】:我正在尝试查找 .pdf、.doc、.docx 等文件的文件类型,但以编程方式不使用 shell 命令。实际上我必须制作一个应用程序来阻止访问特定扩展名的文件。我已经在 LKM 中连接了 sys_call_table,现在我希望在触发打开/读取系统调用时,我的 LKM 会检查文件类型。
我知道我们有一个当前指针,它可以访问当前进程结构,我们可以使用它来查找存储在 dentry 结构中的文件名,并且在 Linux 中,文件类型由存储在起始字节中的幻数标识文件。但我不知道如何找到文件类型以及它的确切存储位置?
【问题讨论】:
为什么要重新发明***?只需致电file(或查看其源代码)。 有简单的方法和困难的方法。最简单的方法是使用system()
调用file
,或者只是根据文件扩展名进行猜测。困难的方法是重新发明file
:解析文件并根据内容确定其类型。
但是我在 c/c++ 中找到了文件类型。你能给出一个使用 system() 调用的代码示例吗?
不,我不是假设每个文件都有扩展名,因为在 Linux 中扩展名没有意义。因此文件类型由存储在文件内容开头的幻数标识
@RamizRaja “幻数”不是一个准确的描述,它是简写。这意味着来自文件本身的数据。例如,PNG 图像文件以an 8-byte header 开头,您当然可以很容易地找到它。
【参考方案1】:
Linux 不会“存储”其文件的文件类型(与 Mac OS 的 resource fork 不同,我认为这是最知名的执行此操作的平台)。文件只是命名的字节流,它们没有操作系统暗示的结构。
您要么只是告诉程序要使用哪个文件(然后它按照你说的做),要么程序使用更高级别的功能来解决它。
有些程序可以重新发明这个特定的***(我负责 one of those),但您也可以使用例如file(1)
。当然,这需要您的程序解析和“理解”您将获得的文本输出,这在某种意义上只会解决问题。
但是,我不认为从内核空间调用file
是非常明智的,因此最好为您需要的任何类型集重新创建测试,以保持较小。
换句话说,我的意思是你应该简单地重新实现所需的测试。这通常是相当复杂的,所以如果你真的需要为尽可能多的类型做这件事,这可能不是一个好主意。 :/
【讨论】:
我需要支持任意五种文件类型。 重新创建测试的真正含义是什么? @Ramiz Raja 没有幻数,所以你(和文件工具)需要做的是识别文件类型,是读取文件中的第一条数据,然后猜猜是什么它是一种文件。这就是你必须在内核中创建的测试——读取一段文件,并尝试猜测它是哪种文件类型。 OK...那么如果我限制扩展/类型的数量,那么它将起作用。您能否给出任何代码示例来说明如何读取文件中的第一条数据。据我所知,每个文件系统都向 VFS 注册其函数,而 VFS 实际上调用这些函数进行读/写。那我怎样才能读取第一条文件数据?如果可以或建议一些链接,请提供代码示例。【参考方案2】:实际上我必须制作一个应用程序来阻止访问特定扩展名的文件。
这是一个有缺陷的要求。如果您按文件扩展名检查,那么您将错过不使用扩展名的文件,这在 Linux 中很常见,因为它不使用文件扩展名。
官方认可的在 Linux 中检测文件类型的方法是使用幻数。 shell 命令file
基本上只是 libmagic 的一个包装器,因此您可以选择链接到该库
【讨论】:
这只是问题措辞方式的一个缺陷。我也看到了,所以我在 cmets 中专门询问了 OP,OP 承认:No i am not assuming that every file will have an extension
以上是关于以编程方式在 Linux 中查找文件类型的主要内容,如果未能解决你的问题,请参考以下文章