原帖由 WHITLACK 于 2009-9-28 08:48 发表
针对某个文件,如何设置权限,可以禁止删除?
文件权限的r-w-x好像不能禁止删除的啊,
谢谢指教!
1:使用粘滞位可以做到,下面是介绍.
强制位与冒险位、粘滞位
针对u,g,o,分别可设 set uid,set gid,及sticky bit(粘滞位)。
强制位与冒险位、粘滞位添加在执行权限的位置上。如果该位置上原已有执行权限,则强制位与冒险位以小写字母s或t的方式表示;否则,以大写字母表示,大写字母S、T表示为空。(因为文件本身就不具备执行权限,那就没有权限给其他人使用了,所以为空。)
set uid与set gid在u和g的x位置上各采用一个s,sticky使用一个t。
suid: 意味着如果某个用户对属于自己的程序(只适用于二进制程序且对目录无效)设置了这种权限,那么其他用户在执行这程序时,就会暂时具有该文件拥有者的权限,完成之后恢复对应的权限。 对于shell脚本无效,因为shell脚本是将很多二进制执行文件调用而已,所以suid的权限部分还是要看shell脚本调用进来的程序设置,而不是shell脚本本身。
例如password命令
[root@node1 ~]# ll /usr/bin/passwd
-rwsr-xr-x 1 root root 22960 Jul 17 2006 /usr/bin/passwd
[root@node1 ~]#
sgid: 可以用在两个方面:
文件:如果sgid设置在二进制文件上,则不论用户是谁,执行该程序的时候,它的有效用户组将会变成该程序的用户组所有者。
目录:如果sgid是设置在A目录上,那么则该A目录内所建立的文件或目录的用户组将会是A目录的用户组。如tmp目录。
sticky Bit: 当前只针对目录有效,对文件无效。默认情况下,如果一个目录上有w和x权限,则任何人可以在此目录中建立与删除文件。但是如果在该目录上设置了sticky Bit,、那么在该目录中创建的文件或目录,只有文件的拥有者与系统管理员(root)才有权限删除该文件。
强制位与冒险位、粘滞位对应的权限数字为:
suid:4
sgid:2
sticky Bit: 1
2:使用chattr命令
功能介绍
设置文件隐藏属性,使用权限超级用户(chattr changes the file attributes on a Linux second extended file system.)。
语法格式
chattr [-RV] [-+=AacDdijsSu] [-v version] 文件或目录
参数
-R:递归处理所有的文件及子目录。
-V:详细显示修改内容,并打印输出。
-:取消某个特殊参数。
+:增加某个特殊参数。
= :指定特定的参数。
A:Atime,告诉系统不要修改对这个文件的最后访问时间。
S:Sync,当应用程序对这个文件执行了写操作,使系统立刻把修改的结果写到磁盘。
s:当文件设置了s参数时,它将会彻底从这个硬盘空间中删除掉,它的数据块会用0填写。
a:Append Only,系统只允许在这个文件之后增加数据,而不能删除这个文件。如果目录具有这个属性,系统将只允许在这个目录下建立文件,而不允许删除任何文件,也不允许修改目录下原有的文件。只有root用户可以设置这个属性。
i:Immutable,系统不允许对这个文件进行任何的修改,包括删除、修改、设置连接(可以设置软链接),也无法增加数据。如果目录具有这个属性,那么任何的进程都不能修改目录之下的文件,不允许建立和删除文件。
-j:当ext3格式文件系统挂载的时候使用了参数"data=ordered" or "data=writeback" options时,设置j属性将会使文件在写入时先记录在journal中;但是,当文件系统设置参数为data=journalled时,由于已经设置了日志,那么设置无效。
D:当应用程序对某个目录执行了写操作,使系统立刻把修改的结果写到磁盘。
d:如果一个文件设置了d参数,那么当dump程序运行的时候将忽略归该文件的dump。
c:Compress,系统以透明的方式压缩这个文件。从这个文件读取时,返回的是解压之后的数据;而向这个文件中写入数据时,数据首先被压缩之后才写入磁盘。
u:Undelete,当一个应用程序请求删除这个文件时,系统会保留其数据块以便以后能够恢复删除这个文件。
说明
chattr 命令的作用很大,其中一些功能是由Linux内核版本来支持的,如果Linux内核版本低于2.2,那么许多功能不能实现。另外,通过chattr命令修改属性能够提高系统的安全性,但是它并不适合所有的目录。chattr命令不能保护/、/dev、/tmp、/var目录。
例如1:
[root@node1 mnt]# chattr +a test
[root@node1 mnt]# cat /etc/init.d/httpd > test
-bash: test: Operation not permitted
[root@node1 mnt]# rm -rf test
rm: cannot remove `test': Operation not permitted
[root@node1 mnt]# mv test test.bak
mv: cannot move `test' to `test.bak': Operation not permitted
[root@node1 mnt]#
例如2:
[root@node1 mnt]# chattr +i redhat
[root@node1 mnt]# cat /etc/init.d/httpd > redhat
-bash: redhat: Permission denied
[root@node1 mnt]# rm -rf redhat
rm: cannot remove `redhat': Operation not permitted
[root@node1 mnt]# mv redhat hh
mv: cannot move `redhat' to `hh': Operation not permitted
[root@node1 mnt]# ln redhat nn
ln: creating hard link `nn' to `redhat': Operation not permitted
[root@node1 mnt]# ln -s redhat jack
[root@node1 mnt]# ls -l jack
lrwxrwxrwx 1 root root 6 May 13 08:01 jack -> redhat
[root@node1 mnt]#
例如3:
[root@node1 mnt]# chattr +a duck
[root@node1 mnt]# cd duck/
[root@node1 duck]# touch girl
[root@node1 duck]# ls
girl
[root@node1 duck]# rm -rf girl
rm: cannot remove `girl': Operation not permitted
[root@node1 duck]# cat /etc/init.d/httpd > girl
-bash: girl: Operation not permitted
[root@node1 duck]# mv girl dd
mv: cannot move `girl' to `dd': Operation not permitted
[root@node1 duck]#
例如4:
[root@node1 mnt]# chattr +i duck
[root@node1 mnt]# cd duck
[root@node1 duck]# ls
girl
[root@node1 duck]# touch mm
touch: cannot touch `mm': Permission denied
[root@node1 duck]# rm -rf girl
rm: cannot remove `girl': Permission denied
[root@node1 duck]# mv girl mm
mv: cannot move `girl' to `mm': Permission denied
[root@node1 duck]# cat /etc/init.d/httpd > girl
-bash: girl: Operation not permitted
##################################################
希望可以满足你的要求!