Linux学习(7)--文件权限

本文详细介绍了Linux环境下文件和目录的默认权限、隐藏权限及其设置方法,包括umask、chattr、lsattr以及特殊权限SUID、SGID、SBIT的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文件与目录的默认权限和隐藏权限

在之前我们已经提到了,我们可以通过chown修改属性,chmod修改权限。在这个地方就不多说了,不了解的话可以去前面看看。下面我们主要谈一谈“新建一个文件或者目录时默认的权限是什么”

文件默认权限:umask

umask是指定“目前用户在新建文件或目录时候的权限默认值”,我们可以通过以下的方式得知或者设置umask:

[root@VM_174_157_centos ~]# umask
0022
[root@VM_174_157_centos ~]# umask -S
u=rwx,g=rx,o=rx

以上两种方式都可以,但是不是应该是3个数吗,怎么是4个?第一个0是我们之后要谈到的隐藏权限。默认的权限属性是这样的:

  • 若创建“文件”,则默认是没有执行(x)权限,只有r、w两个,最大为666,即-rw-rw-rw
  • 若创建“目录”,则默认的是777,即drwxrwxrwx

要注意的是,umask的分数值的是“该默认值需要减掉的权限”,以上面的例子来说,umask为022,所以user没被拿走任何的权限,但是group、others被拿走了2的权限(也就是w),所以当你:

  • 创建文件:-rw-r–r–
  • 创建目录:drwxr-xr-x

当然,用umask可以更改默认权限,比如:

[root@VM_174_157_centos tmp]# umask 002
[root@VM_174_157_centos tmp]# touch test1
[root@VM_174_157_centos tmp]# mkdir test2
[root@VM_174_157_centos tmp]# ll
total 2
-rw-rw-r--  1 root root    0 Feb 25 11:33 test1
drwxrwxr-x  2 root root 4096 Feb 25 11:33 test2

文件隐藏属性chattr,lsattr

文件除了基本的9个权限之外,还有隐藏权限,他们对系统安全有很大的帮助。不过要注意的是,chattr命令只能在Ext2/Ext3的文件系统上面生效。下面我们就来看看这些隐藏属性。

- chattr(设置文件隐藏属性)

[root@VM_174_157_centos ~]# chattr [+-=][ASacdistu] 文件或目录名称
选项与参数:
+:增加某一个特殊参数,其他的保存不变
-:移除某一个特殊参数,其他的保存不变
=:仅有后面接的参数

A:当设定后,若有访问此文件(或目录)时,他的访问时间atime将不会被修改,可避免I/O较慢的机器过度访问硬盘
S:一般文件是异步写入磁盘的(参见Linux的sync命令),如果加上S这个属性,将同步地写入硬盘
a:当设置a之后,这个文件只能增加数据,而不能删除和修改数据,只有root才能删除
c:这个属性设置之后,将会自动将此文件压缩,在读取的时候自动解压缩,存的时候自动压缩,对大文件还蛮有用
d:当dump程序被执行,设置d将可以使得该文件或(目录)不会被dump备份
i:这个i很厉害!它可以让一个文件“不能被删除、改名,设置连接也无法写入和添加数据。对系统安全有很大的帮助,也只有root能设置
s:如果文件被删除,它将会被完全从这个硬盘空间中删除
u:与s相反,如果被删除了,其实数据还在磁盘内,可以使用来找回该文件

注意:属性设置唱见的是a和i,而且很多设置值必须要身为root才能设置

范例1:给一个文件增加 i 的参数
[root@VM_174_157_centos tmp]# chattr +i test.txt 
[root@VM_174_157_centos tmp]# rm -f test.txt 
rm: cannot remove 'test.txt': Operation not permitted
#看到了吗?连root都不能删除这个文件,赶紧解除吧

[root@VM_174_157_centos tmp]# chattr -i test.txt 

- lsattr(显示文件隐藏属性)

[root@VM_174_157_centos ~]# lsattr [-adR] 文件或目录
选项或参数:
-a:将隐藏文件的属性也显示出来
-d:如果接的是目录,进列出目录本身的属性而非目录内的文件名
-R:连同子目录的数据也一并列出来

[root@VM_174_157_centos tmp]# chattr +aij test.txt 
[root@VM_174_157_centos tmp]# lsattr test.txt 
----ia---j------ test.txt

文件特殊权限:SUID,SGID,SBIT

我们一直提到文件的权限就是r、w、x三个读、写、执行的权限,但是其实我们还可以发现另外一些奇怪的现象:

[root@VM_174_157_centos ~]# ls -ld /tmp; ls -l /usr/bin/passwd 
drwxrwxrwt. 10 root root 4096 Feb 25 14:33 /tmp
-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /usr/bin/passwd

这个s和t的权限又是哪里来的呢?这就是我们接下来要提到的部分:

- SetUID

  • 当s这个标志出现在文件所有者的x权限上时,比如/usr/bin/passwd这个文件的权限状态为“-rwsr-xr-x”,此时就被称为Set UID,简称SUID的特殊权限
  • SUID权限仅对二进制程序(binary program)有效
  • 执行者对于该程序需要具有 x 的可执行权限
  • 本权限仅在执行该程序的过程中(run-time)有效
  • 执行者将具有该程序所有者(owner)的权限

举个例子:在Linux中,所有账号密码都记录在/etc/shadow 这个文件里面,这个文件的权限是“-r——– 1 root root”,意思是这个档案仅有root可读且强制写入。那么如果我使用一个普通账户执行 passwd 修改密码却也是可以成功的!

可是明明,/etc/shadow就不能被普通用户存取,为什么普通用户还能修改呢?这就是SUID功能了,我们可以知道:

  • 1.普通用户对/usr/bin/passwd有x权限,说明可以执行passwd命令
  • 2.passwd的拥有者是root
  • 3.普通用户执行passwd的过程中,会暂时获得root的权限
  • 4./etc/shadow就可以被普通用户所执行的passwd所修改

但是当我们想用cat去查看/etc/shadow的时候就不行了,因为cat不具备SUID权限!另外SUID仅可用在二进制程序上,不能够用在shell script上。这是因为shell script只是将很多的二进制文件调进来执行而已。

- SetGID

当 s 标志在文件所有者的 x 位置时为SUID,那当 s 在用户组的 x 位置时为SetGID(SGID),我们可以看到形如这样:

[root@VM_174_157_centos ~]ls -l /usr/bin/locate 
-rwx--s--x. 1 root slocate 40496 Jun 10  2014 /usr/bin/locate

与SUID不同的是,SGID可以针对文件或目录来设置,当对文件来说:

  • SGID对二进制程序有用
  • 程序执行者对该程序来说,需要具备 x 的权限
  • 执行者在执行的过程中将会获得该程序用户组的支持

当对目录来说:

  • 用户若对此目录有r、x权限,可进入该目录
  • 用户在此目录下的有效用户组(effective group)将会变成该目录的用户组
  • 若用户在此目录下具有 w 的权限,则创建的新文件的用户组与次目录的用户组相同

总的来说,SGID就是用来管理用户组内的权限的。

- Sticky Bit

这个Sticky Bit(SBIT)只对目录有用,对于文件无效。它的作用是:

  • 当用户对于此目录具有w,x权限时,即具有写入的权限时
  • 当用户在该目录下创建文件或目录时,仅有自己与root才有权利删除该文件

比如,当甲这个用户于A目录是具有group或others的身份,并且拥有w权限,这表示“可以对该目录内任何人建立的目录或文件均可进行删除/更名/移动等操作”。但是,如果A目录加上了SBIT的权限时,则他只能对自己建立的文件或目录进行那些操作,而不能动别人的东西。

- SUID/SGID/SBIT权限设置

权限设置和前面的类似,SUID为4,SGID为2,SBIT为1,具体的情况参照下面范例:

#注意:这个范例只是练习所以对同一个文件操作,但是一定要记住SUID是对文件使用,SBIT是对目录使用
[root@VM_174_157_centos tmp]# cd /tmp
[root@VM_174_157_centos tmp]# touch test                 <==创建测试用的空文件
[root@VM_174_157_centos tmp]# chmod 4755 test; ls -l test    <==加入具有SUID的权限
-rwsr-xr-x 1 root root 0 Feb 25 16:59 test

[root@VM_174_157_centos tmp]# chmod 6755 test; ls -l test    <==加入具有SUID/SGID的权限
-rwsr-sr-x 1 root root 0 Feb 25 16:59 test

[root@VM_174_157_centos tmp]# chmod 1755 test; ls -l test    <==加入SBIT的功能
-rwxr-xr-t 1 root root 0 Feb 25 16:59 test

[root@VM_174_157_centos tmp]# chmod 7666 test; ls -l test    <==具有空的SUID/SGID权限
-rwSrwSrwT 1 root root 0 Feb 25 16:59 test

#在最后一个例子中,出现了大写的S和T,因为s和t都是代替x的,但是我们执行的是7666
#也就是说user,group,others都没有x这个可执行的权限,所以S,T代表空的。

#符号也可以进行操作,如下,设置权限为-rws--x--x
[root@VM_174_157_centos tmp]# chmod u=rwxs,go=x test;ls -l test
-rws--x--x 1 root root 0 Feb 25 16:59 test

#在上述文件中加上SGID与SBIT
[root@VM_174_157_centos tmp]# chmod g+s,o+t test; ls -l test
-rws--s--t 1 root root 0 Feb 25 16:59 test

查看文件类型:file

如果你想知道某个文件的基本数据,是ASCII或data,或者binary,有没有用到动态函数库(share library)等等,就可以用file这个命令:

[root@VM_174_157_centos tmp]# file ~/.bashrc 
/root/.bashrc: ASCII text          <==这是ASCII纯文本

[root@VM_174_157_centos tmp]# file /usr/bin/passwd 
/usr/bin/passwd: setuid ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=1e5735bf7b317e60bcb907f1989951f6abd50e8d, stripped
#执行文件包括suid权限,兼容的硬件平台,使用的是Linux核心2.6.32的动态链接库等

[root@VM_174_157_centos tmp]# file /var/lib/mlocate/mlocate.db 
/var/lib/mlocate/mlocate.db: data         <==这是data文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值