有时我们为了安全需要,尤其是在生产环境中,为了保证运行的项目或日志不被随意修改、移动或删除,通常会进行相关文件或文件夹的安全设置。
换句话说,如果我们使用 root
账户对文件执行修改(vi
)、移动(mv
)或删除(rm
)操作时,还出现 Operation not permitted
或 Permission denied
,则很有可能是对该文件或上级目录进行过文件属性设置(通常是 chattr
设置为 i
或 a
)。
当我们使用 root
账户对文件或文件夹进行相关操作时,如果还提示因权限不足,而无法进行操作时,那么我们应该使用 lsattr
命令来查看当前文件或文件夹的文件属性。
有关
lsattr
命令的详细说明,请见 lsattr(1) - Linux manual page。
lsattr [ -RVadv ] [ files... ]
[ -RVadv ]
代表可指定 0 个、1 个或多个选项:
-R
:递归地列出目录及其内容的属性-a
:列出目录中的所有文件,包括以 .
开头的文件(隐藏文件)[ files... ]
代表可指定 0 个、1 个或多个文件名:
1、查看当前目录下非隐藏文件的文件属性:
$ lsattr
输出示例:
----i----------- ./webapps
-----a---------- ./logs
---------------- ./README
从上面的输出示例中可知:
webapps
目录设置了不可变的文件属性,即 webapps
目录不能删除或重命名,不能创建到该目录的链接,也不能将数据写入该目录logs
目录设置了仅追加的文件属性,即 logs
目录只能追加新文件,但不能删除已追加的文件,且如果修改文件内容而且直接追加内容,则还会生成额外的备份文件README
文件没有设置文件属性2、查看 logs
目录及其子目录中的内容:
$ lsattr -R logs/
输出示例:
---------------- logs/log_file1
---------------- logs/log_file2
---------------- logs/log_dir1
logs/log_dir1:
---------------- logs/log_dir1/log_file3
如果仅从上面的输出示例来看,logs
目录中的文件都没有设置文件属性,貌似是可以随意操作的,但实际上真是这样吗?
我们来对 log_file1
文件执行删除操作:
$ sudo rm -rf logs/log_file1
输出示例:
rm: cannot remove ‘logs/log_file1’: Operation not permitted
上面的删除命令,我们特意使用了 root 权限,但输出结果却还是操作不允许。这是因为 log_file1
文件的上级目录 logs
设置了仅追加的文件属性,这会导致虽然其子文件没有设置文件属性,但也会受到父级目录的文件属性所影响。
但是,如果我们删除的是 logs/log_dir1/log_file3
文件,则可以正常删除。
注意:虽然父目录的文件属性会影响子文件,但子文件所受的影响和父目录所设置的文件属性效果并非完全一致的。
chattr
命令可以用来更改 Linux 文件系统上的文件属性。
有关
chattr
命令的详细说明,请见 chattr(1) - Linux manual page。
chattr [ -RVf ] [ -v version ] [ mode ] files...
[ -RVadv ]
代表可指定 0 个、1 个或多个选项:
-R
:递归地列出目录及其内容的属性[ mode ]
代表模式,格式是 +-=[aAcCdDeijsStTu]
:
+
:将选择的属性添加到文件的现有属性中-
:将选择的属性从文件的现有属性中删除=
:将选择的属性设置为文件的唯一属性a
:仅追加(append only)。文件只能以追加模式写入。只有超级用户或具有 CAP_LINUX_IMMUTABLE 功能的进程才能设置或清除此属性i
:不可变(immutable)。文件不能修改,即不能删除或重命名该文件,不能创建到该文件的链接,也不能将数据写入该文件。只有超级用户或具有 CAP_LINUX_IMMUTABLE 功能的进程才能设置或清除此属性注意:并非所有文件系统都支持或使用所有标志,具体可通过文件系统的手册进行查阅。
files...
代表可指定1 个或多个文件名:
1、将 logs
目录及其子目录中所有文件添加仅追加的文件属性:
$ sudo chattr -R +a logs/
2、将 logs
目录及其子目录中所有文件的文件属性更改为不可变,并删除其它的文件属性:
$ sudo chattr -R =i logs/
3、将 logs
目录及其子目录中所有文件删除不可变的文件属性:
$ sudo chattr -R -i logs/