我有一个遍历一组目录的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,但我不确定所有位是什么意思,我希望某个特定的人会告诉我不要试着看内。有什么建议吗?
答案 0 :(得分:0)
要了解您获得的统计数字,您需要将数字转换为八进制(在python oct(...)
中)。
然后您会看到33060
解释为100444
。您只对最后三位数感兴趣(444)。第一个数字是文件所有者权限,第二个数字是组,第三个数字是其他人。
您可以按以下顺序查看每个数字(在您的情况下均为4
)为3个二进制位:
读 - 写 - 执行。
因为在你的情况下,所有者,团体&其他有4
,它被翻译(对于所有这些)到100(二进制),这意味着只有读取位为所有三个 - 这意味着所有三个只能读取文件。
就文件权限而言,您应该已成功阅读/sys/devices/virtual/net/br-ex/speed
读取失败有两个原因:
- speed
是一个目录,(目录需要执行权限才能读取内部)
- 或者它是special file - 可以使用perl或bash中的-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命令不仅检查魔术字节,还执行其他检查以验证文件类型。