为什么os.chflags()在Linux下不起作用

时间:2015-12-09 10:28:51

标签: python-2.7 debian posix

我在Debian GNU / Linux 8(jessie)64位下使用Python 2.7.9。我只是尝试使用 os.chflags(路径,模式)更改文件属性。在Python文档中有一个article about os interface,它表示此方法在 Unix 中可用,但它不适用于Linux。 Python总是抛出:

Traceback (most recent call last):
File "/home/lexer/py/epam/tests/main.py", line 43, in <module>
os.chflags(path_to_file(file_name), stat.SF_NOUNLINK)
AttributeError: 'module' object has no attribute 'chflags'

很久以前已经提出了issue,但我仍然无法理解为什么os.chflags()不执行'chattr'命令工作。有人可以详细说明吗?

1 个答案:

答案 0 :(得分:3)

Linux不提供chflags系统调用,因此Python不提供包装器os.chflags()

chattr命令使用代码(e2fsprogs-1.42.13的{​​{1}}):

lib/e2p/fsetflags.c

设置文件的扩展属性,因此如果将其移植到Python(并使用一些C从 fd = open (name, OPEN_FLAGS); if (fd == -1) return -1; f = (int) flags; r = ioctl (fd, EXT2_IOC_SETFLAGS, &f); if (r == -1) save_errno = errno; close (fd); 中提取EXT2_IOC_SETFLAGS的值),则可以执行以下操作:

ext2fs/ext2_fs.h

Etvoilà:

#!/usr/bin/python2

import fcntl
import os
import struct

# Taken from ext2fs/ext2_fs.h.
EXT2_IMMUTABLE_FL = 0x00000010
EXT2_IOC_SETFLAGS = 0x40086602

fd = os.open('/var/tmp/testfile', os.O_RDWR)
f = struct.pack('i', EXT2_IMMUTABLE_FL)
fcntl.ioctl(fd, EXT2_IOC_SETFLAGS, f);
os.close(fd)

但是出于所有实际目的,将[tim@passepartout ~]$ lsattr /var/tmp/testfile ----i----------- /var/tmp/testfile [tim@passepartout ~]$ 作为子进程执行比将上面的概念验证转化为可靠运行而无需维护的内容可能要谨慎得多。