为什么os.chflags()在Linux下不起作用 [英] Why os.chflags() doesn't work under Linux

查看:372
本文介绍了为什么os.chflags()在Linux下不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Debian GNU / Linux 8(jessie)64位下使用Python 2.7.9。我只是尝试改变应用 os.chflags(路径,模式)的文件属性。在Python文档中,有一个关于os界面的文章说这种方法在Unix 中可用,但它对于Linux不起作用。 Python总是抛出:

 追溯(最近的最后一次呼叫):
文件/ home / lexer / py / /tests/main.py,第43行,< module>
os.chflags(path_to_file(file_name),stat.SF_NOUNLINK)
AttributeError:'module'对象没有属性'chflags'

有一个问题已经很久以前已经提出了,但是我仍然不明白为什么os.chflags()不会做chattr命令的工作。任何人可以详细说明一下?

Linux不提供 chflags syscall ,所以Python不提供包装器 os.chflags()



chattr 命令使用代码( e2fsprogs-1.42.13 lib / e2p / fsetflags.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);

设置文件的扩展属性,所以如果你把它移植到Python(并使用一些C从 ext2fs / ext2_fs.h )中提取 EXT2_IOC_SETFLAGS 的值,您可以执行以下操作:

 #!/ usr / bin / python2 

import fcntl
import os
import struct

#取自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)

Etvoilà:

  [tim @ passepartout〜] $ lsattr / var / tmp / testfile 
---- i ----------- / var / tmp / testfile
[tim @ passepartout〜] $

执行 chattr(1)作为子进程可能要比将上述概念验证成可靠运行而不进行维护的情况更为谨慎。 p>

I'm using Python 2.7.9 under Debian GNU/Linux 8 (jessie) 64-bit. I just try to change file attributes applying os.chflags(path, mode). In Python docs there is an article about os interface which says that this method is available in Unix, but it doesn't work for Linux. Python always throws:

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'

There is an issue has been already raised for that a long time ago, but still I can't understand why os.chflags() doesn't do 'chattr' command job. Anybody could elaborate it?

解决方案

Linux does not provide the chflags syscall, so Python does not provide the wrapper os.chflags().

The chattr command uses the code (e2fsprogs-1.42.13's lib/e2p/fsetflags.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);

to set the extended attributes for a file, so if you port that to Python (and use some C to extract the value for EXT2_IOC_SETFLAGS from ext2fs/ext2_fs.h), you can do something like:

#!/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)

Et voilà:

[tim@passepartout ~]$ lsattr /var/tmp/testfile
----i----------- /var/tmp/testfile
[tim@passepartout ~]$

But for all practical purposes it is probably much more prudent to execute chattr(1) as a child process than to turn the proof-of-concept above into something that runs reliably without maintenance.

这篇关于为什么os.chflags()在Linux下不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆