python获取linux文件不可变属性

python获取linux文件不可变属性,python,linux,immutability,Python,Linux,Immutability,我可以使用os.stat(路径名)获取路径名的个人信息、mtime、atime。。。。 但是,我有一个具有“+I”属性的文件,您可以通过以下方式查看它: lsattr/tmp/test.py 有没有办法通过使用python知道路径名是否具有“+i”属性?似乎没有os模块函数来获取这些Linux文件属性,但您可以使用该模块在python中调用lsattr命令 下面的代码应该适用于Python2或Python3,尽管在最近的Python版本中可以使其更加紧凑 FWIW,我在我的fstab文件上设置了

我可以使用
os.stat(路径名)
获取路径名的个人信息、mtime、atime。。。。 但是,我有一个具有“+I”属性的文件,您可以通过以下方式查看它:
lsattr/tmp/test.py

有没有办法通过使用python知道路径名是否具有“+i”属性?

似乎没有
os
模块函数来获取这些Linux文件属性,但您可以使用该模块在python中调用
lsattr
命令

下面的代码应该适用于Python2或Python3,尽管在最近的Python版本中可以使其更加紧凑

FWIW,我在我的fstab文件上设置了
I
位,因为我讨厌它被随机删除

import subprocess

def is_immutable(fname):
    p = subprocess.Popen(['lsattr', fname], bufsize=1, stdout=subprocess.PIPE)
    data, _ = p.communicate()
    #print(data)
    return 'i' in data.split(None, 1)[0]

print(is_immutable("/etc/fstab"))
更新 此代码的早期版本已被删除

return 'i' in data.split

但是,如果文件名中存在一个“i”,那么它也会检测到一个“i”!新版本仅在属性标志中检测到“i”。感谢您提醒我这一点。

似乎没有用于获取这些Linux文件属性的
os
模块函数,但是您可以使用该模块在Python中调用
lsattr
命令

下面的代码应该适用于Python2或Python3,尽管在最近的Python版本中可以使其更加紧凑

FWIW,我在我的fstab文件上设置了
I
位,因为我讨厌它被随机删除

import subprocess

def is_immutable(fname):
    p = subprocess.Popen(['lsattr', fname], bufsize=1, stdout=subprocess.PIPE)
    data, _ = p.communicate()
    #print(data)
    return 'i' in data.split(None, 1)[0]

print(is_immutable("/etc/fstab"))
更新 此代码的早期版本已被删除

return 'i' in data.split
但是,如果文件名中存在一个“i”,那么它也会检测到一个“i”!新版本仅在属性标志中检测到“i”。谢谢,让我注意到这一点。

关于为什么Linux上不存在
os.chflags
显示了一种使用
fcntl
解决
os
模块中缺少
lsattr
的方法。但是,它依赖于从头文件(ext2fs/ext2fs.h)复制常量定义,因此它很脆弱。一个更持久的解决方案需要编写一些C或类似Cython的东西

同时,pm2ring的答案是有效的,尽管它应该被修改以处理包含字母“i”的路径。也许有一些有声望的人可以评论或编辑这个答案(这是我的第一篇帖子)

关于为什么Linux上不存在
os.chflags
显示了一种使用
fcntl
解决
os
模块中缺少
lsattr
的方法。但是,它依赖于从头文件(ext2fs/ext2fs.h)复制常量定义,因此它很脆弱。一个更持久的解决方案需要编写一些C或类似Cython的东西

同时,pm2ring的答案是有效的,尽管它应该被修改以处理包含字母“i”的路径。也许有一些有声望的人可以评论或编辑这个答案(这是我的第一篇帖子)


statmode=os.stat(“/tmp/test.py”).st_modeF_IMMUTABLE(statmode)存在错误:AttributeError:'posix.stat_result'对象没有属性'st_modeF_IMMUTABLE',出于好奇,您使用的是哪个发行版/内核和文件系统?
/tmp
是nfs共享还是类似的东西?centos6.7 ext4,路径名是本地文件虽然这样做可能会很麻烦,但一种方法是通过在try-except块中以一些无关紧要的方式更改文件来确定它是否是不可变的,如果不是不可变的,则恢复更改。这肯定不是最好的方法,但是…statmode=os.stat(“/tmp/test.py”).st_modeF_IMMUTABLE(statmode)有一个错误:AttributeError:'posix.stat_result'对象没有属性'st_modeF_IMMUTABLE',出于好奇,您使用的是哪个发行版/内核和文件系统?
/tmp
是nfs共享还是类似的东西?centos6.7 ext4,路径名是本地文件虽然这样做可能会很麻烦,但一种方法是通过在try-except块中以一些无关紧要的方式更改文件来确定它是否是不可变的,如果不是不可变的,则恢复更改。这绝对不是最好的方法,虽然…
'i'在数据中可能不是一个好主意,但最好使用re来匹配结果
p=re.compile(r'-+i-+')
@page:为什么?在我的机器上,对
lsattr
发送到stdout的结果字符串使用
in
比对编译的模式使用
match
快10倍左右,这还不算导入
re
或编译模式的时间<代码>搜索
甚至更慢,尤其是当搜索失败时。如果我使用简化的regex
r'I'
,那么测试中的
仍然比regex
搜索快,即使我将目标字符串延长1000倍。非常感谢您提出的这些建议contrast@sverasch我匆忙拒绝了你的编辑,因为我不知道为什么需要它。。。直到5秒后。:)但是如果你给我留言的话,我会自己修复的。
数据中的“I”可能不是个好主意,最好使用re来匹配结果
p=re.compile(r'-+I-+)
@page:为什么?在我的机器上,对
lsattr
发送到stdout的结果字符串使用
in
比对编译的模式使用
match
快10倍左右,这还不算导入
re
或编译模式的时间<代码>搜索
甚至更慢,尤其是当搜索失败时。如果我使用简化的regex
r'I'
,那么
测试中的
仍然比regex
搜索快,即使我将目标字符串延长1000倍。非常感谢您提出的这些建议contrast@sverasch我匆忙拒绝了你的编辑,因为我不知道为什么需要它。。。直到5秒后。:)但是如果你给我留言的话我会自己解决的。。。