红联Linux门户
Linux帮助

使用chattr命令更改文件属性

发布时间:2016-11-30 09:38:05来源:blog.csdn.net/laizhenghong2012作者:wallace-lai
前言
其实在好久之前我就遇到了这个问题的,只不过现在才有时间坐下来去搜索解决。问题是这样的:怎样对unbuntu下的文件或者目录写上保护,让其可以被添加内容,但不允许在没有经过允许的情况下被rm命令删除?
原因是我有洁癖,经常对home目录进行清理,很多重要文件一不小心就会被删除,很是麻烦。解决办法很简单,就是使用chattr命令。
 
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 12月  4 22:48 desktop
drwxrwxr-x 2 zhenghong zhenghong 4096  2月 16 12:13 doc
drwxr-xr-x 2 zhenghong zhenghong 4096 12月  4 15:58 document
drwxr-xr-x 2 zhenghong zhenghong 4096 12月 25 21:56 download
-rw-r--r-- 1 zhenghong zhenghong  234 12月  4 16:25 example.desktop
drwxrwxr-x 6 zhenghong zhenghong 4096 12月 26 10:17 kuaipan
drwxr-xr-x 2 zhenghong zhenghong 4096 12月  5 21:27 picture
drwxrwxr-x 3 zhenghong zhenghong 4096 12月  5 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 12月  4 22:48 desktop
drwxrwxr-x 4 zhenghong zhenghong 4096  2月 16 12:45 doc
drwxr-xr-x 2 zhenghong zhenghong 4096 12月  4 15:58 document
drwxr-xr-x 2 zhenghong zhenghong 4096 12月 25 21:56 download
drwxrwxr-x 6 zhenghong zhenghong 4096 12月 26 10:17 kuaipan
drwxr-xr-x 2 zhenghong zhenghong 4096 12月  5 21:27 picture
drwxrwxr-x 3 zhenghong zhenghong 4096 12月  5 22:39 ProgramFiles
zhenghong@zhenghong-VB:~$ ls -l ./doc
总用量 8
-rw-rw-r-- 1 zhenghong zhenghong    0  2月 16 12:45 a.txt
drwxrwxr-x 2 zhenghong zhenghong 4096  2月 16 12:45 tmp1
drwxrwxr-x 2 zhenghong zhenghong 4096  2月 16 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命令更改文件属性
然后在使用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属性一次就好了。
 
本文永久更新地址:http://www.linuxdiyf.com/linux/26436.html