使用python获取fat32属性
如何在linux中获取fat32属性(如存档、隐藏…),而不使用fatattr实用程序调用生成新进程?它或linux/fs函数(fat\u ioctl\u get\u属性,)可能有python绑定。或者可以使用python xattr?正如您在函数名中看到的那样,内核函数使用python获取fat32属性,python,linux,fat32,Python,Linux,Fat32,如何在linux中获取fat32属性(如存档、隐藏…),而不使用fatattr实用程序调用生成新进程?它或linux/fs函数(fat\u ioctl\u get\u属性,)可能有python绑定。或者可以使用python xattr?正如您在函数名中看到的那样,内核函数fat\u ioctl\u get\u attributes是通过一个从用户空间调用的,我不知道有任何其他绑定。因此,您只需调用自己即可读取属性,如下所示: import array import fcntl import os
fat\u ioctl\u get\u attributes
是通过一个从用户空间调用的,我不知道有任何其他绑定。因此,您只需调用自己即可读取属性,如下所示:
import array
import fcntl
import os
FAT_IOCTL_GET_ATTRIBUTES = 0x80047210
FATATTR_BITS = 'rhsvda67'
def get_fat_attrs(fn):
fd = os.open(fn, os.O_RDONLY)
try:
buf = array.array('L', [0])
try:
fcntl.ioctl(fd, FAT_IOCTL_GET_ATTRIBUTES, buf, True)
except IOError as ioe:
if ioe.errno == 25: # Not a FAT volume
return None
else:
raise
return buf[0]
finally:
os.close(fd)
if __name__ == '__main__':
import sys
for fn in sys.argv[1:]:
attrv = get_fat_attrs(fn)
if attrv is None:
print(fn + ': Not on a FAT volume')
continue
s = ''.join((fb if (1 << idx) & attrv else ' ')
for idx,fb in enumerate(FATATTR_BITS))
print(fn + ': ' + s)
导入数组
进口fcntl
导入操作系统
FAT\u IOCTL\u GET\u属性=0x80047210
FATATTR_位='rhsvda67'
def获取脂肪属性(fn):
fd=os.open(仅限fn、os.O)
尝试:
buf=array.array('L',[0])
尝试:
fcntl.ioctl(fd,FAT\u ioctl\u GET\u属性,buf,True)
除了作为ioe的IOError:
如果ioe.errno==25:#不是一个大容量
一无所获
其他:
提升
返回buf[0]
最后:
操作系统关闭(fd)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
导入系统
对于sys.argv[1:]中的fn:
attrv=get\u fat\u attrs(fn)
如果attrv为None:
打印(fn+':不在胖卷上')
持续
s=''.join((fb if(1)正如您在函数名中所看到的,内核函数fat\u ioctl\u get\u attributes
通过从用户空间调用,我不知道任何其他绑定。因此,您可以通过调用自己来读取属性,如下所示:
import array
import fcntl
import os
FAT_IOCTL_GET_ATTRIBUTES = 0x80047210
FATATTR_BITS = 'rhsvda67'
def get_fat_attrs(fn):
fd = os.open(fn, os.O_RDONLY)
try:
buf = array.array('L', [0])
try:
fcntl.ioctl(fd, FAT_IOCTL_GET_ATTRIBUTES, buf, True)
except IOError as ioe:
if ioe.errno == 25: # Not a FAT volume
return None
else:
raise
return buf[0]
finally:
os.close(fd)
if __name__ == '__main__':
import sys
for fn in sys.argv[1:]:
attrv = get_fat_attrs(fn)
if attrv is None:
print(fn + ': Not on a FAT volume')
continue
s = ''.join((fb if (1 << idx) & attrv else ' ')
for idx,fb in enumerate(FATATTR_BITS))
print(fn + ': ' + s)
导入数组
进口fcntl
导入操作系统
FAT\u IOCTL\u GET\u属性=0x80047210
FATATTR_位='rhsvda67'
def获取脂肪属性(fn):
fd=os.open(仅限fn、os.O)
尝试:
buf=array.array('L',[0])
尝试:
fcntl.ioctl(fd,FAT\u ioctl\u GET\u属性,buf,True)
除了作为ioe的IOError:
如果ioe.errno==25:#不是一个大容量
一无所获
其他:
提升
返回buf[0]
最后:
操作系统关闭(fd)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
导入系统
对于sys.argv[1:]中的fn:
attrv=get\u fat\u attrs(fn)
如果attrv为None:
打印(fn+':不在胖卷上')
持续
s=''.join((fb if(1)知道它是main之后为什么要导入sys?@Serdalis,因为在下一行中,这个演示程序会迭代整个程序,如果这个演示程序用作库,那么就不需要sys
。我在考虑这个解决方案,但是你是如何得到函数地址的(FAT\u IOCTL\u GET\u ATTRIBUTES=0x80047210)?在我的发行版上,我收到错误“函数未实现”@user2260486这是一个奇怪的错误,因为ioctl编号是内核接口的一部分,因此不应该更改。在安装strace和fattr之后,您从strace-e ioctl-e raw=ioctl fattr/
中得到了什么输出?$uname--a
Linux deb7 3.2.0-4-amd64\1 SMP Debian 3.2.35-2 x86\u 64 GNU/Linux
$strace-e ioctl-e raw=ioctl fattr/
ioctl(0x3、0x80047210、0x7fff9d8d1edc)=-1(错误号25)
/:设备的ioctl不合适
为什么在您知道它是主要的之后导入sys?@Serdalis,因为在下一行中,这个演示程序会迭代所有的程序,如果这个演示程序用作库,那么就不需要sys
。我在考虑这个解决方案,但是您是如何获得函数地址的(FAT\u IOCTL\u GET\u ATTRIBUTES=0x80047210)?在我的发行版上,我收到错误“函数未实现”@user2260486这是一个奇怪的错误,因为ioctl编号是内核接口的一部分,因此不应该更改。在安装strace和fattr之后,您从strace-e ioctl-e raw=ioctl fattr/
中得到了什么输出?$uname--a
Linux deb7 3.2.0-4-amd64\1 SMP Debian 3.2.35-2 x86\u 64 GNU/Linux$strace-e ioctl-e raw=ioctl fattr/ioctl(0x3、0x80047210、0x7fff9d8d1edc)=-1(errno 25)
/:设备的ioctl不合适