在linux下解决rm: cannot remove : Operation not permitted 无法删除文件

今天在操作一个文件的时候,遇到一个问题。使用rm命令无法删除一个文件目录

报错rm: cannot remove : Operation not permitted

经过我的一番查询,原来是lsattr chattr方面的知识。  通过chattr命令可以修改属性能够提高系统的安全 性,但是它并不适合所有的目录。

chattr命令不能保护/、/dev、/tmp、/var目录。lsattr命令是显示chattr命令设置的文件属性。

以下是对于两个指令的详细解析

  • chattr
  • 语法: [root @test /root ]# chattr [+-=][ASacdistu] [档案或目录名称]
    参数说明:
  • +-= :分别为 [+ 增加] [- 减少] [= 设定] 属性的意思
  • A  :当设定了 A 这个属性时,这个档案(或目录)的存取时间 atime (access) 将不可被修改,
    可避免例如手提式计算机容易有磁盘 I/O 错误的情况发生!
  • S  :这个功能有点类似 sync 的功能!就是会将数据同步写入磁盘当中!可以有效的避免数据流失!
  • a  :当设定 a 之后,这个档案将只能增加数据,而不能删除,只有 root 才能设定这个属性。
  • c  :这个属性设定之后,将会自动的将此档案『压缩』,在读取的时候将会自动解压缩出来!
    但是在储存的时候,将会先进行压缩之后再储存(看来对于大档案似乎蛮有用的!)
  • d  :当 dump (备份)程序被执行的时候,设定 d 属性将可使该档案(或目录)具有 dump 功效!
  • i  :这个 i 可就很厉害了!他可以让一个档案『不能被删除、改名、设定连结也无法写入或新增数据!
    对于系统安全性有相当大的帮助!
  • j  :当使用 ext3 这个档案系统格式时,设定 j 属性将会使档案在写入时先记录在 journal 中!
    但是当 filesystem 设定参数为 data=journalled时,由于已经设定了日志了,所以这个属性无效!
  • s  :当档案设定了 s 参数时,他将会被完全的移除出这个硬盘空间。
  • u  :与 s 相反的,当使用 u 来设定档案时,则数据内容其实还存在磁盘中,可以使用来 undeletion.

 

示例:

[root @test /root]# chattr +i/etc/shadow<==呵呵!如此则无法更动这个档案啰!
[root @test /root]# chattr -i /etc/shadow <==解除该属性!

说明:

这这个指令是重要的,尤其是在系统的安全性上面!由于这些属性是隐藏的性质,所以需要以 lsattr才能看到该属性呦!其中,最重要的当属 +i这个属性,因为他可以让一个档案无法被更动,对于需要强烈的系统安全的人来说,真是相当的重要的!里头还有相当多的属性是需要 root才能设定的呢!此外,如果是 log file 这种的登录档,就更需要 +a这个可以增加,但不会被杀掉的参数了!


  • lsattr
  • 语法: [root @test /root ]# lsattr [-aR]
  • 参数说明:
  • -a :将隐藏文件的属性也秀出来;
  • -R :连同子目录的数据也一并列出来!

示例:

[root @test /root]# chattr +i .bash_logout
[root @test /root]# lsattr -a
-------------- ./.
-------------- ./..
---i---------- ./.bash_logout
-------------- ./.bash_profile
-------------- ./.bashrc
-------------- ./.emacs
-------------- ./.screenrc

说明:
这两个指令在使用上必须要特别小心,例如:将 /etc/shadow 这个重要的密码记录档案给他设定成为具有 i的属性,那么过了若干天之后,你突然要新增使用者,却一直无法新增!别怀疑,赶快去将 i 的属性拿掉吧!


举例,比如我下面这个1.txt没法删除

root@:~/test# ls
1.txt
root@:~/test# rm -rf 1.txt
rm: cannot remove '1.txt': Operation not permitted

我先查看以下他的属性

root@:~/test# lsattr 1.txt
----ia--------e---- 1.txt

用chattr去掉文件属性

root@:~/test# chattr -i 1.txt
root@:~/test# chattr -a 1.txt

再次删除该文件,即可正常删除了

THE END