linux文件特殊权限

最近准备找工作复习一下基础知识,写了一个很简单的open函数

#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdio.h>
int main(void)
{
        int fd;
        fd = open("./test", O_RDONLY|O_CREAT);
        if (fd == -1)
                printf("文件打开错误");
        printf (" %d \n", fd);
        return 0;
}

创建了一个test文件

使用ls 发现了一个奇怪的问题:

-rwxrwxr-x 1 shane shane 7196  1月 26 21:35 open
-rw-rw-r-- 1 shane shane  230  1月 26 21:35 open.c
-rwsrwSr-T 1 shane shane    0  1月 26 21:35 test

那是啥玩意???

原来

除了读、写和执行权限之外,在Red Hat Enterprise Linux 文件系统中还有特殊权限,包括set-UID、set-GID及黏滞位(sticky)。

1. set-UID set-GID

先看个实例,查看你的/usr/bin/passwd 与/etc/passwd文件的权限

shane@shane-ubuntu:~/workspace/linux_program/file_io$ ls -l /usr/bin/passwd /etc/passwd
-rw-r--r-- 1 root root  1701  1月 17 10:11 /etc/passwd
-rwsr-xr-x 1 root root 41284  9月 13  2012 /usr/bin/passwd
众所周知,/etc/passwd文件存放的各个用户的账号与密码信息,/usr/bin/passwd是执行修改和查看此文件的程序,但从权限上看,/etc/passwd仅有root权限的写(w)权,可实际上每个用户都可以通过/usr/bin/passwd命令去修改这个文件,于是这里就涉及了linux里的特殊权限setuid,正如-rwsr-xr-x中的s
setuid就是:让普通用户拥有可以执行“只有root权限才能执行”的特殊权限,setgid同理指”组“ 作为普通用户是没有权限修改/etc/passwd文件的,但给/usr/bin/passwd以setuid权限后,普通用户就可以通过执行passwd命令,临时的拥有root权限,去修改/etc/passwd文件了

2.sticky

shane@shane-ubuntu:~/workspace/linux_program/file_io$ ls -dl /tmp/
drwxrwxrwt 8 root root 4096  1月 26 21:52 /tmp/
 tmp目录是所有用户共有的临时文件夹,所有用户都拥有读写权限,这就必然出现一个问题,A用户在/tmp里创建了文件a.file,此时B用户看了不爽,在/tmp里把它给删了(因为拥有读写权限),那肯定是不行的。实际上是不会发生这种情况,因为有特殊权限stick bit(粘贴位)权限,正如drwxrwxrwt中的最后一个t stick bit (粘贴位)就是:除非目录的属主和root用户有权限删除它,除此之外其它用户不能删除和修改这个目录。
也就是说,在/tmp目录中,只有文件的拥有者和root才能对其进行修改和删除,其他用户则不行,避免了上面所说的问题产生。用途一般是把一个文件夹的的权限都打开,然后来共享文件,象/tmp目录一样。

设置特殊权限

setuid:chmod u+s xxx
setgid: chmod g+s xxx
stick bit : chmod o+t xxx


或者使用八进制方式,在原先的数字前加一个数字,三个权限所代表的进制数与一般权限的方式类似,如下:
suid   guid    stick bit
  1        1          1


所以:suid的二进制串为:100,换算十进制为:4
guid的二进制串为:010,换算:2
stick bit 二进制串:001,换算:1
于是也可以这样设:

setuid:chmod 4755 xxx
setgid:chmod 2755 xxx
stick bit:chmod 1755 xxx

最后,在一些文件设置了特殊权限后,字母不是小写的s或者t,而是大写的S和T,那代表此文件的特殊权限没有生效,是因为你尚未给它对应用户的x权限 





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值