Chinaunix首页 | 论坛 | 博客
  • 博客访问: 170343
  • 博文数量: 48
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 262
  • 用 户 组: 普通用户
  • 注册时间: 2013-06-30 15:16
个人简介

本人无才,非专业出生,笔记仅记录学习,其中很多基于网络或他人原创,如有侵权和冒犯,或者错误,请谅解指正……谢谢!

文章存档

2016年(1)

2015年(3)

2013年(44)

我的朋友

分类: LINUX

2013-07-01 18:04:33


说明:本人是一名初学者,在网络上或者相关书籍中关于Linux文件权限的特殊权限内容很少(可能是我没有找到),因此这篇文章是我原创编写,代码及验证一一测试,但并不保证是完全正确的,若有疑问或者见解,敬请指正,谢谢……


1.问题的引出:

我们知道linux系统中的用户登陆密码实际上是存储在 /etc/shadaw 文件中,但是一般的用户对该文件没有任何在操作权限,我们却可以通过shell中的passwd等方式访问该文件,如下:

              

      那么这种修改操作是怎么完成的?


2.问题背景:

          文件的权限描述有两种:绝对模式(八进制数字表示)和字符模式(使用w r x )。 其中我们一般用得是三个八进制位来表示拥有者、组用户、其他用户的权限

但是,实际上Linux系统中是可以用四个八进制位来表示。依次可以划分为:特殊权限、拥有者权限、组用户权限、其他用户的权限。

可以参看 man 2 chmod帮助页:

                 

  其中从S_IWUSR后面,我们都很熟悉,那么S_ISUID04000) S_ISGID02000) S_ISVTW(01000) 是表示的什么含义?


3.问题解决:

抛开这个问题,我们来做下面的小实验 ,首先创建一个文件(这里以一个可执行文件为例),取消它的全部权限,实验步骤如下:

    

注意观察发现:这里出现了等标识,这些是什么意思?

现在先暂时 回到我们提出的问题,这个问题可以归纳成为下面的简单模型:

     a, b非同组用户

很明显,A用户执行main程序对a.txt文件进行写操作是没有任何问题的,那么B用户执行main程序是否可以对a.txt文件进行写操作呢?实际上是不可以的,如果不信你可以写程序进行验证(验证在后面)。

那现在要求这这种情况下,B用户也可以执行main程序是否可以对a.txt文件进行写操作,如何解决?

这就涉及到Linux文件权限的特殊位了。


         特殊权限一般是粘附位权限(
1)和设置位权限两种,其中设置位权限又有用户设置位权限(4)和组用户设置位权限(2)之分。

特殊权限一般作用于其他用户,因此下面的用户均指其他用户。

那么这些特殊的权限有什么作用?


粘附位的作用——防止有读写权限的用户删除文件

我们知道,一般某一用户对某一用户有读写权限,那么该用户是可以删除这个文件的(形象的说就是可以CTRL+X)。如果对该文件设置了粘附位,该用户则只能对这个文件进行读写操作,不能删除文件。

粘附位只对文件的写操作有意义:

如果该文件设置了粘附位,且用户对该文件有写的权限——t表示

如果该文件设置了粘附位,且用户对该文件没有写的权限——T表示,这种情况下粘附位不起作用,形同虚设。


设置位的作用——向其他用户开放拥有者
/组用户的权限

      向其他用户开放拥有者的权限——用户设置位

      向其他用户开放组用户的权限——组设置位

因此解决上面B用户也可以执行main程序是否可以对a.txt文件进行写操作只需要设置a.txt文件的设置位权限即可

设置位可以简单的认为实际上就是文件权限中的是否允许以程序执行文件的选项。


同样的设置位对执行文件或者执行权限意义:

         如果该文件设置了设置位,且用户对该文件有执行的权限——s表示

         如果该文件设置了设置位,且用户对该文件没有执行的权限——T表示,这种情况下设置位不起作用,形同虚设


4.问题验证:

验证大致过程如下:

1、可执行文件Demo会打开stu.dat文件进行读写操作,

2、改变stu.dat文件设置位和粘附位,用其他用户删除该文件或者执行Demo程序

测试代码:(Demo.c

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <fcntl.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. struct stu {
  7.     int no;
  8.     char name[20];
  9.     float score;
  10. };
  11. /*
  12.  1.判定文件是否存在,存在打开,不存在创建
  13.  2.输入记录
  14.  3.保存记录
  15.  4.提示继续输入
  16.  5.继续/不继续
  17.  6.关闭文件
  18.  */
  19. int openfile(const char *filename) {
  20.     int fd;
  21.     fd = open(filename, O_RDWR | O_CREAT | O_EXCL, 0666);
  22.     if (fd == -1) { //表示文件存在,则打开
  23.         fd = open(filename, O_RDWR | O_APPEND);
  24.         return fd;
  25.     }
  26.     return fd;
  27. }
  28. void input(struct stu *record) {
  29.     bzero(record, sizeof(struct stu));
  30.     printf("输入学号:");
  31.     scanf("%d", &(record->no));
  32.     printf("输入姓名:");
  33.     scanf("%s", record->name);
  34.     printf("输入成绩:");
  35.     scanf("%f", &(record->score));
  36. }
  37. void save(int fd, struct stu *record) {
  38.     write(fd, record, sizeof(struct stu));
  39. }
  40. int iscontinue() {
  41.     char c;
  42.     printf("是否继续输入:\n");
  43.     scanf("\n%c", &c);
  44.     if (c == 'Y' || c == 'y') {
  45.         return 1;
  46.     }
  47.     return 0;
  48. }
  49. int main() {
  50.     int fd;
  51.     int r;
  52.     struct stu s = { 0 };
  53.     fd = openfile("stu.dat");
  54.     if (fd == -1)
  55.         printf("openfile:%m\n"), exit(-1);
  56.     while (1) {
  57.         input(&s);
  58.         save(fd, &s);
  59.         r = iscontinue();
  60.         if (r == 0)
  61.             break;
  62.         system("clear");
  63.     }
  64.     close(fd);
  65.     printf("输入完毕!\n");
  66.     return 0;
  67. }


说明:该程序的编译运行都在JACK用户下,另外创建一个和JACK非同组的用户ZHANG


1. 
验证文章开始提出的问题

   下图是在JACK用户下编译运行


接着创建一个ZHANG用户执行Demo程序,



2
、验证粘附位有效的时候,其他用户能否删除。



3. 设置有效的设置位,看其他用户是否可以打开
stu.dat文件

做这两个对比实际上是为了说明设置位是对执行程序或者执行权限有意义

下面是设置stu.dat文件的设置位,可以看出此次无任何变化,


下面是设置Demo可执行文件的设置位


可以看出,程序可以执行了。

阅读(3398) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~