文件命令生成'无效参数'

时间:2014-09-16 15:10:17

标签: linux bash

我有一个遍历一组目录的perl脚本,当它遇到其中一个目录时,会出现一个无效的参数,我希望能够以编程方式跳过它。我想我可以从使用file命令查找文件类型开始,但它也像这样爆炸:

$ file /sys/devices/virtual/net/br-ex/speed
/sys/devices/virtual/net/br-ex/speed: ERROR: cannot read `/sys/devices/virtual/net/br-ex/speed' (Invalid argument)

如果我使用perl或python stat函数打印出文件的模式,它会告诉我33060,但我不确定所有位是​​什么意思,我希望某个特定的人会告诉我不要试着看内。有什么建议吗?

2 个答案:

答案 0 :(得分:0)

要了解您获得的统计数字,您需要将数字转换为八进制(在python oct(...)中)。

然后您会看到33060解释为100444。您只对最后三位数感兴趣(444)。第一个数字是文件所有者权限,第二个数字是组,第三个数字是其他人。

您可以按以下顺序查看每个数字(在您的情况下均为4)为3个二进制位: 读 - 写 - 执行。

因为在你的情况下,所有者,团体&其他有4,它被翻译(对于所有这些)到100(二进制),这意味着只有读取位为所有三个 - 这意味着所有三个只能读取文件。

就文件权限而言,您应该已成功阅读/sys/devices/virtual/net/br-ex/speed 读取失败有两个原因:
- speed是一个目录,(目录需要执行权限才能读取内部) - 或者它是special file - 可以使用perlbash中的-f标记或使用python中的os.path.isfile(...)进行测试。


无论如何,你可以使用以下链接过滤文件&目录根据你提到的3种语言的权限:

答案 1 :(得分:0)

与这种特殊情况无关,但是在恶意ELF(Linux可执行文件)文件上运行该错误时,我遇到了相同的错误。在这种情况下,这是因为ELF的程序头被故意破坏了。查看文件命令的源代码,可以很清楚地看到它检查ELF头文件并在头文件损坏的情况下以相同的错误退出:

    /*
     * Loop through all the program headers.
     */
    for ( ; num; num--) {
        if (pread(fd, xph_addr, xph_sizeof, off) <
            CAST(ssize_t, xph_sizeof)) {
            file_badread(ms);
            return -1;
        }

TLDR; file命令不仅检查魔术字节,还执行其他检查以验证文件类型。