Linux 程序设计学习笔记----Linux下文件类型和属性管理
Posted slgkaifa
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 程序设计学习笔记----Linux下文件类型和属性管理相关的知识,希望对你有一定的参考价值。
转载请注明出处:http://blog.csdn.net/suool/article/details/38318225
部分内容整理自网络,在此感谢各位大神。
Linux文件类型和权限
数据表示
文件属性存储结构体Inode的成员变量i_mode存储着该文件的文件类型和权限信息。
该变量为short int类型。
这个16位变量的各个位功能划分为:
- 第0-8位为权限位,为别相应拥有者(user)。同组其它用户(group)和其它用户(other)的读R写W和运行X权限。
- 第9-11位是权限修饰位。包含设置有效ID(setuid)位。设置有效用户组ID(setgid)。和粘贴位(sticky)。
- 第12-15位是文件类型位。
例如以下一个样例:
drwxr-xr-x 5 root root 1024 Sep 13 03:27 Desktop
与文件权限相关联的是第一、第三、第四个域。
第三个域是文件的全部者,第四个域是文件的所属组,而第一个域则限制了文件的訪问权限。在这个样例中。文件的 全部者是 root,所属的组是 root,文件的訪问权限是 drwxr-xr-x。对于文件和文件夹讲,每一个文件和文件夹都有一组权限标志和它们结合在一起,在上例中就是第一个域中的内容。以下来细致分析这个域中各个 符号的意义:
该域由 10 个字符组成。能够把它们分为四组,详细含义各自是:
d rwx r-x r-x
文件类型 全部者权限标志 组权限标志 其它用户权限标志
当中:
文件类型:第一个字符。
因为 Linux 系统对与设备、文件夹、文件都当作是文件来处理,因此该字符表明此文件的类型,字符与相应的意义例如以下表:
文件标志 文件类型 样例
- - 普通文件 数据文件、ASCII 纯文本 文件、程序
- d 文件夹 /bin
- b 块设备 /dev/hda(第一个 IDE 硬盘)
- c 字符设备 /dev/ttyS1(与 DOS 种的串口 2 等同)
- s 套接字 /dev/log
- p 命名管道 /dev/initctl(与“|”等同)
- l 符号链接 /dev/modem->/dev/ttyS1
权限标志
对每一个文件或文件夹都有 4 类不同的用户。每类用户各有一组读、写和运行(搜索)文件的訪问权限。这 4 类用户是:
- root:系统特权用户类,既 UID = 0 的用户。
- owner:拥有文件的用户。
- group:共享文件的组訪问权限的用户类的用户组名称。
- world:不属于上面 3 类的全部其它用户。
作为 root,他们自己主动拥有了全部文件和文件夹的全面的读、写和搜索的权限。所以没有必要明白指定他们的权限。
其它三类用户则能够在耽搁文件或者文件夹的基础上别 授权或撤消权限。因此对另外三类用户,一共 9 个权限位与之相应,分为 3 组,每组 3 个,分别用 r、w、x 来表示,分别相应 owner、group、world。
权限位对于文件和文件夹的含义有些许不同。
每组 3 个字符相应的含义从左至右的顺序,对于文件来说是:读文件的内容(r)、写数据到文件(w)、做为命令运行该文件(x)。
对于文件夹来说是:读包括在文件夹中 的文件名(r)、写信息到文件夹中去(添加和删除索引点的连接)、搜索文件夹(能用该文件夹名称作为路径名去訪问它所包括的文件或子文件夹)。
详细来说就是:
1. 有仅仅读权限的用户不能用 cd 进入该文件夹。还必须有运行权限才干进入。
2. 有运行权限的用户仅仅有在知道文件名称并拥有该文件的读权限的情况下才干够訪问文件夹下的文件。
3. 必须有读和运行权限才干够使用 ls 列出文件夹清单,或使用 cd 进入文件夹。
4. 如用户有文件夹的写权限,则能够创建、删除或改动文件夹下的不论什么文件或子文件夹,既是该文件或子文件夹属于其它用户。
========================================================================================================
改动文件权限
首先讲改动文件的全部权。使用 chown 和 chgrp 命令:
chown new_user file or directory:改动文件或文件夹的全部者。
chgrp new_group file or directory:改动文件或文件夹的所属组。
这里须要注意的是:普通用户不能将文件或文件夹的全部权交与他人,仅仅有 root 有这一权限。可是普通用户有权改变文件或文件夹的所属组。
因为每类用户的权限都是由 rwx 三位组成。因此能够用三个八进制数字表示文件的訪问权。一个八进制数字能够用三个二进制数字表示,那么与其相应,权值为 4 的位相应 r,权值为 2 的位相应 w。权值为 1 的位相应 x。对于一类用户,将这三位与其相应的权值相乘求和,就能够得出对该类用户的訪问权限。
改变文件訪问权限的命令是 chmod。格式是:
chmod permission file_name
比方 chmod 764 a.txt,它表示对于文件的全部者。具有对该文件读、写、运行的权限。
对于文件所属组的用户,拥有读、写的权限。对于其它用户,仅仅有读权限。
chmod是Linux下设置文件权限的命令,后面的数字表示不同用户或用户组的权限。
通常是三个数字:
第一个数字表示文件全部者的权限
第二个数字表示与文件全部者同属一个用户组的其它用户的权限
第三个数字表示其他用户组的权限。
权限分为三种:读(r=4)。写(w=2),运行(x=1) 。 综合起来还有可读可运行(rx=5=4+1)、可读可写(rw=6=4+2)、可读可写可运行(rwx=7=4+2+1)。
所以,chmod 755 设置用户的权限为:
1.文件全部者可读可写可运行
2.与文件全部者同属一个用户组的其它用户可读可运行
3.其他用户组可读可运行
chmod 4755与chmod 755 的差别在于开头多了一位,这个4表示其它用户运行文件时,具有与全部者相当的权限。
比如:root用户创建了一个上网认证程序netlogin,假设其它用户要上网也要用到这个程序,那就须要root用户执行chmod 755 netlogin命令使其它用户也能执行netlogin。
可是netlogin运行时可能须要訪问一些仅仅有root用户才有权訪问的文件,那么其它用户运行netlogin时可能由于权限不够还是不能上网。
这样的情况下,就能够用 chmod 4755 netlogin 设置其它用户在运行netlogin也有root用户的权限,从而顺利上网。
ps:对shell脚本设置无效!仅仅相应用程序有效!
这里须要注意的是:文件的创建者是唯一能够改动该文件訪问权限的普通用户,另外一个能够改动文件訪问权限的用户是 root。
另一种表示方法,就是用字符串来设定文件訪问权限。当中读用 r 表示,写用 w 表示,运行用 x 表示;全部者用 u 表示。组用户用 g 表示。其它用户用 o 表示。全部用户用 a 表示。那么上面样例就写成以下的模样:
chmod a+r,u+w,u+x,g+w a.txt
======================================================================================
权限修饰位
SUID含义:文件的该位被设 置为1,在该文件被运行时,该文件将以全部者的身份运行。也就是说不管谁来运行这个文件,他都有文件全部者的特权,假设全部者是root的话,那么运行人就有超级用户 的特权了。这是该位将变成一个安全漏洞。因此不要轻易设置该位。
SGID含义:执行者将具有文件全部组的权限。
STICKY粘合位: 要求操作系统既是在可运行程序退出后。仍要在内存中保留该程序的映像。这样做是为了节省大型程序的启动时间。可是会占用系统资源。因此设置该位,不如把程序写好。
setuid 。setgid;sticky bit差别
每个文件有全部者及组编号,set uid ;set gid能够改变用户对文件具有的权限:写和运行.
setuid: 在运行时具有文件全部者的权限.
setgid: 设置文件夹. 一个文件夹被标上setgid位,此文件夹下创建的文件继承该文件夹的属性.
sticky bit: 该位能够理解为防删除位. 设置sticky bit位后,就算用户对文件夹具有写权限,但也仅仅能加入文件而不能删除文件。
怎样设置
操作这些标志与操作文件权限的命令是一样的, 都是 chmod. 有两种方法来操作,
1) chmod u+s temp -- 为temp文件加上setuid标志. (setuid 仅仅对文件有效,U=用户)
chmod g+s tempdir -- 为tempdir文件夹加上setgid标志 (setgid 仅仅对文件夹有效。g=组名)
chmod o+t temp -- 为temp文件加上sticky标志 (sticky仅仅对文件有效)
2) 採用八进制方式. 这一组八进制数字三位的意义例如以下,
abc
a - setuid位, 假设该位为1, 则表示设置setuid
b - setgid位, 假设该位为1, 则表示设置setgid
c - sticky位, 假设该位为1, 则表示设置sticky
设置后, 能够用 ls -l 来查看. 假设本来在该位上有x, 则这些特殊标志显示为小写字母 (s, s, t). 否则, 显示为大写字母 (S, S, T)
如:
rwsrw-r-- 表示有setuid标志 (rwxrw-r--:rwsrw-r--)
rwxrwsrw- 表示有setgid标志 (rwxrwxrw-:rwxrwsrw-)
rwxrw-rwt 表示有sticky标志 (rwxrw-rwx:rwxrw-rwt)
==============================================================================================================
inux/unix 下的可运行文件:
被设置了setuid, 当一个程序一旦设置了该标记以后, 使用该可运行程序的进程将拥有该运行文件的全部者的权限,可提升使用者的权限,普通用户能够运行改命令,使自己升级为root权限。
setuid的使用方法是: chmod 4755 program 或 chmod u+s program (setuid 仅仅对文件有效)
被设置了setgid, 同理使用该程序的进程将拥有该程序全部组的权限。单独setGid的文件很少用,通常都是即setUid又setGid,同一时候setuid,setgid 是为了绑定某个特殊用户及其组的特殊权限。
setgid的使用方法是:chmod 2755 dir 或 chmod g+s dir (setgid 仅仅对文件夹有效)
同一时候设置setuid,setgid的使用方法:chmod 6755 program
被设置粘着位,设置的使用方法是: chmod 1777 file 或 chmod o+t file (sticky仅仅对文件有效)
当一个文件夹被设置为"粘着位"(用chmod a+t),则该文件夹下的文件仅仅能由
一、超级管理员删除
二、该文件夹的全部者删除
三、该文件的全部者删除
也就是说,即便该文件夹是不论什么人都能够写,但也仅仅有文件的属主才干够删除文件 。
文件的属性管理
1.读取文件属性
使用stat函数。例如以下演示样例:
stat的结构体包括的例如以下:主要见stat.h头文件,详细该文件的解读參见:http://blog.csdn.net/xuemiao1234/article/details/5544226
The structurestatcontains at least the following members:
struct stat { dev_t st_dev; //文件的设备编号 ino_t st_ino; //节点 mode_t st_mode; //文件的类型和存取的权限 nlink_t st_nlink; //连到该文件的硬连接数目,刚建立的文件值为1 uid_t st_uid; //用户ID gid_t st_gid; //组ID dev_t st_rdev; //(设备类型)若此文件为设备文件。则为其设备编号 off_t st_size; //文件字节数(文件大小) unsigned long st_blksize; //块大小(文件系统的I/O 缓冲区大小) unsigned long st_blocks; //块数 time_t st_atime; //最后一次訪问时间 time_t st_mtime; //最后一次改动时间 time_t st_ctime; //最后一次改变时间(指属性) };
相同具有查询功能的函数有lstat,參见http://pubs.opengroup.org/onlinepubs/7908799/xsh/lstat.html
正在打开文件的查询函数:fstat,參见http://pubs.opengroup.org/onlinepubs/7908799/xsh/fstat.html
相同上文中的改动命令中。对于已经打开的文件,使用fchmod的类型,加f前缀。
以下是一个使用lstat函数查询文件属性的演示样例程序,能够依据文件的类型打印相应的提示信息。
代码例如以下:
#include <sys/types.h> #include <sys/stat.h> #include <stdlib.h> #include <stdio.h> int main(int argc, char *argv[]) { int i; struct stat buf; char *ptr; for (i = 1; i < argc; i++) { printf("%s: ", argv[i]); if (lstat(argv[i], &buf) < 0) // obtains information about the file { perror("lstat"); continue; } if(S_ISREG(buf.st_mode)) ptr = "regular file"; // regular file else if (S_ISDIR(buf.st_mode)) ptr = "directory file"; // directory file else if (S_ISCHR(buf.st_mode)) ptr = "character special file"; // character_special file else if (S_ISBLK(buf.st_mode)) ptr = "block special file"; // block_special file else if (S_ISFIFO(buf.st_mode)) ptr = "fifo file"; // pip file #ifdef S_ISLNK else if (S_ISLNK(buf.st_mode)) ptr = "symbolic link"; // link file #endif #ifdef S_ISSOCK else if (S_ISSOCK(buf.st_mode)) ptr = "socket"; // socket file #endif else ptr = "** unknown mode **"; // unknown file printf("%s\n", ptr); } return 0; }
ok。 that‘s all.
The Next :
文件管理的应用项目实现
一些关于文件管理系统的重要知识点:
inode
下一代的文件管理系统btrfs
硬链接,软连接
以上是关于Linux 程序设计学习笔记----Linux下文件类型和属性管理的主要内容,如果未能解决你的问题,请参考以下文章