使用chattr命令更改文件属性

使用chattr命令更改文件属性

  • 使用chattr命令更改文件属性
      • 前言
      • chattr命令
      • chattr的实际用法
      • 注意

前言

其实在好久之前我就遇到了这个问题的,只不过现在才有时间坐下来去百度解决。问题是这样的:怎样对unbuntu下的文件或者目录写上保护,让其可以被添加内容,但不允许在没有经过允许的情况下被rm命令删除?

原因是我有洁癖,经常对home目录进行清理,很多重要文件一不小心就会被删除,很是麻烦。解决办法很简单,就是使用chattr命令。(2016-2-16)

chattr命令

chattr命令有很多选项,它的用法如下(摘录自man文档):

chattr [-RVf] [-v version] [mode] files…

它的简要描述如下(摘自man离线手册):

chattr 修改文件在Linux第二扩展文件系统(E2fs)上的特有属性
模式有+-=[ASacdisu]几种格式.

符’+’文件已有属性的基础上增加选定的属性; ‘-‘来去掉文件上的选定的属性;而’=’来指定该文件的唯一属性.

‘ASacdisu’用作文件新属性的选项: 不更新atime(A),同步更新(S),只能添加(a), 压缩(c),不可变(i),不可转移(d),删除保护(s)以及不可删除(u).

它的选项

OPTIONS(选项)
-R
递归地修改目录以及其下内容的属性. 如果在递归目录时遇到了符号链接,遍历将跳过.
-V
详尽地给出chattr的输出信息并打印出程序的版本.
-v version
设置文件系统的版本.

看起来好像很复杂的样子,但解决这个问题我们只需要使用a这个属性和-R这个选项(如果你想将你指定的目录下的文件也加上属性的情况)。a属性如下(其余属性我不去看了,以后遇到了再来):

设置了`a’属性的文件只能在添加模式下打开用于写入. 只有超级用户可以设置或清除该属性

这段话意味着,如果你给一个文件添加了a属性,那么在不清除该属性的情况下,该文件只能用于打开进行添加而不能被删除。

chattr的实际用法

在我的家目录下有一个名为doc的文件夹,该文件夹里有一个名为a.txt的普通文件,在没有给doc目录加上a属性的情况下,doc目录很容易就被rm命令删除了。

zhenghong@zhenghong-VB:~$ ls -l
总用量 32
drwxr-xr-x 2 zhenghong zhenghong 4096 124 22:48 desktop
drwxrwxr-x 2 zhenghong zhenghong 4096  216 12:13 doc
drwxr-xr-x 2 zhenghong zhenghong 4096 124 15:58 document
drwxr-xr-x 2 zhenghong zhenghong 4096 1225 21:56 download
-rw-r--r-- 1 zhenghong zhenghong  234 124 16:25 example.desktop
drwxrwxr-x 6 zhenghong zhenghong 4096 1226 10:17 kuaipan
drwxr-xr-x 2 zhenghong zhenghong 4096 125 21:27 picture
drwxrwxr-x 3 zhenghong zhenghong 4096 125 22:39 ProgramFiles
zhenghong@zhenghong-VB:~$ rm -rfv doc
已删除"doc/a.txt"
已删除目录:"doc"
zhenghong@zhenghong-VB:~$

重新创建doc目录并给doc目录加上a属性

zhenghong@zhenghong-VB:~$ mkdir doc
zhenghong@zhenghong-VB:~$ touch ./doc/a.txt
zhenghong@zhenghong-VB:~$ sudo chattr -R +a doc
[sudo] password for zhenghong: 
zhenghong@zhenghong-VB:~$

再来尝试删除doc文件夹,rm命令遍历到a.txt时,因为无法删除就退出了

zhenghong@zhenghong-VB:~$ rm -rfv doc
rm: 无法删除"doc/a.txt": 不允许的操作
zhenghong@zhenghong-VB:~$

尝试在已经添加a属性的a.txt文件里添加内容,结果可以实现。这样就解决了我的问题了。

注意

在刚才的尝试中,我还是发现了该命令的一点出乎意料的情况:在你对某个文件夹添加了a属性甚至还使用了-R选项时,如果你在该文件夹里的子文件夹里添加一个新的子文件夹,然后再在该文件夹里添加一个文件,那么这个文件是没有被添加a属性的。比如下面的情况。有一个doc文件夹,里面有一个普通文本文件a.txt和两个文件夹tmp1和tmp2。对doc使用-R选项加上a属性后,无法删除doc文件夹里的任何一个文件。

zhenghong@zhenghong-VB:~$ ls -l
总用量 28
drwxr-xr-x 2 zhenghong zhenghong 4096 124 22:48 desktop
drwxrwxr-x 4 zhenghong zhenghong 4096  216 12:45 doc
drwxr-xr-x 2 zhenghong zhenghong 4096 124 15:58 document
drwxr-xr-x 2 zhenghong zhenghong 4096 1225 21:56 download
drwxrwxr-x 6 zhenghong zhenghong 4096 1226 10:17 kuaipan
drwxr-xr-x 2 zhenghong zhenghong 4096 125 21:27 picture
drwxrwxr-x 3 zhenghong zhenghong 4096 125 22:39 ProgramFiles
zhenghong@zhenghong-VB:~$ ls -l ./doc
总用量 8
-rw-rw-r-- 1 zhenghong zhenghong    0  216 12:45 a.txt
drwxrwxr-x 2 zhenghong zhenghong 4096  216 12:45 tmp1
drwxrwxr-x 2 zhenghong zhenghong 4096  216 12:45 tmp2
zhenghong@zhenghong-VB:~$ sudo chattr -R +a doc
[sudo] password for zhenghong: zhenghong@zhenghong-VB:~$ rm -rvf doc rm: 无法删除"doc/a.txt": 不允许的操作 rm: 无法删除"doc/tmp1": 不允许的操作 rm: 无法删除"doc/tmp2": 不允许的操作 zhenghong@zhenghong-VB:~$

在doc文件夹的子文件夹tmp1里再添加一个文件夹tm,然后再在tm文件夹里添加一个普通文件c.txt。
文件夹之间的包含关系如下图所示:

使用chattr命令更改文件属性_第1张图片

然后在使用rm命令尝试删除整个doc文件夹。发现c.txt文件被删除了,重复一次之后,没有再删除任何东西

zhenghong@zhenghong-VB:~$ rm -rvf doc
rm: 无法删除"doc/a.txt": 不允许的操作
rm: 无法删除"doc/tmp1/b.txt": 不允许的操作
已删除"doc/tmp1/tm/c.txt"
rm: 无法删除"doc/tmp1/tm": 不允许的操作
rm: 无法删除"doc/tmp2": 不允许的操作
zhenghong@zhenghong-VB:~$ rm -rvf doc
rm: 无法删除"doc/a.txt": 不允许的操作
rm: 无法删除"doc/tmp1/b.txt": 不允许的操作
rm: 无法删除"doc/tmp1/tm": 不允许的操作
rm: 无法删除"doc/tmp2": 不允许的操作
zhenghong@zhenghong-VB:~$

如何解决这个问题呢?一个最笨最简单的方法:每次你在已经添加了a属性的目录里创建了新文件的时候你都再添加a属性一次就好了。

你可能感兴趣的:(linux,命令行,文件属性,rm,chattr)