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

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

问题描述

我在 Debian GNU/Linux 8 (jessie) 64 位下使用 Python 2.7.9.我只是尝试通过调用 os.chflags(path, mode) 来更改文件属性.在 Python 文档中有一篇关于 os 的 文章 interface 表示此方法在 Unix 中可用,但不适用于 Linux.Python 总是抛出:

I'm using Python 2.7.9 under Debian GNU/Linux 8 (jessie) 64-bit. I just tried to change file attributes by calling os.chflags(path, mode). In the Python docs there is an article about the 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'

有一个 问题很久以前提出的,但我仍然不明白为什么 os.chflags() 不做 chattr 命令的工作.谁能详细说明一下?

There is an issue which was already raised for that a long time ago, but I still can't understand why os.chflags() doesn't do the chattr command's job. Could anybody elaborate it?

推荐答案

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

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

chattr 命令使用代码(e2fsprogs-1.42.13lib/e2p/fsetflags.c):

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);

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

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)

等等:

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

但出于所有实际目的,将 chattr(1) 作为子进程执行可能比将上述概念验证转换为无需维护即可可靠运行的东西要谨慎得多.

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天全站免登陆