Linux 文件和目录的属性
摘要:本文讲述的是文件或目录的属性,比如节点inode、文件类型、文件权限及归属;还对setuid、setgid及粘贴位进行了一般性的讲解。对ln 、chmod、umask、chown、chgrp 、touch 的用法也进行了比较详细的说明和举例;
目录
8、影响文件的读写执行的因素;
9、文件被修改或被访问的时间;
10、文件属性和文件系统属性的关系;
11、关于本文;
12、后记;
13、参考文档;
14、相关文档;
+++++++++++++++++++++++++++++++++++++++++++
正文
+++++++++++++++++++++++++++++++++++++++++++
1、 Linux 文件属性概说;
Linux 文件或目录的属性主要包括:文件或目录的节点、种类、权限模式、链接数量、所归属的用户和用户组、最近访问或修改的时间等内容;
[root@localhost ~]# ls -lih
总计 104K
2408949 -rwxr-xr-x 1 root root 7 04-21 12:47 lsfile.sh
2408830 drwxr-xr-x 2 root root 4.0K 04-21 12:46 mkuml-2004.07.17
2408260 drwxr-xr-x 2 root root 4.0K 04-21 22:15 mydir
2408258 lrwxrwxrwx 1 root root 7 04-21 22:16 sun001.txt -> sun.txt
2408263 -rw-r--r-- 2 root root 11 04-20 14:17 sun002.txt
2408263 -rw-r--r-- 2 root root 11 04-20 14:17 sun.txt
解释:
第一字段:inode
第二字段:文件种类和权限;
第三字段: 硬链接个数;
第四字段: 属主;
第五字段:所归属的组;
第六字段:文件或目录的大小;
第七字段和第八字段:最后访问或修改时间;
第九字段:文件名或目录名
我们以lsfile.sh为例:
2408949 -rwxr-xr-x 1 root root 7 04-21 12:47 lsfile.sh
inode 的值是:2408949
文件类型:文件类型是-,表示这是一个普通文件; 关于文件的类型,请参考:《Linux 文件类型和文件扩展》
文件权限:文件权限是rwxr-xr-x ,表示文件属主可读、可写、可执行,文件所归属的用户组可读可执行,其它用户可读可执行;
硬链接个数: lsfile.sh这个文件没有硬链接;因为数值是1,就是他本身;
文件属主:也就是这个文件归哪于哪个用户 ,它归于root,也就是第一个root;
文件属组:也就是说,对于这个文件,它归属于哪个用户组,在这里是root用户组;
文件大小:文件大小是7个字节;
访问可修改时间 :这里的时间是最后访问的时间,最后访问和文件被修改或创建的时间,有时并不是一致的;
当然文档的属性不仅仅包括这些,这些是我们最常用的一些属性。我们把比较重要的说一说,比如文件所归属的种类、权限、硬链接个数 ... ...
2、 关于inode;
inode 译成中文就是索引节点。每个存储设备或存储设备的分区(存储设备是硬盘、软盘、U盘 ... ... )被格式化为文件系统后,应该有两部份,一部份是inode,另一部份是Block,Block是用来存储数据用的。而inode呢,就是用来存储这些数据的信息,这些信息包括文件大小、属主、归属的用户组、读写权限等。inode为每个文件进行信息索引,所以就有了inode的数值。操作系统根据指令,能通过inode值最快的找到相对应的文件。
做个比喻,比如一本书,存储设备或分区就相当于这本书,Block相当于书中的每一页,inode 就相当于这本书前面的目录,一本书有很多的内容,如果想查找某部份的内容,我们可以先查目录,通过目录能最快的找到我们想要看的内容。虽然不太恰当,但还是比较形象。
当我们用ls 查看某个目录或文件时,如果加上-i 参数,就可以看到inode节点了;比如我们前面所说的例子;
[root@localhost ~]# ls -li lsfile.sh
2408949 -rwxr-xr-x 1 root root 7 04-21 12:47 lsfile.sh
lsfile.sh 的inode值是 2408949 ; 查看一个文件或目录的inode,要通过ls 命令的的 -i参数。
2.10 inode 相同的文件是硬链接文件;
在Linux 文件系统中,inode值相同的文件是硬链接文件,也就是说,不同的文件名,inode可能是相同的,一个inode值可以对应多个文件。理解链接文件并不难,看看例子就会了。在Linux中,链接文件是通过ln工具来创建的。
2.11 创建硬链接,硬链接和源文件关系;
用ln 创建文件硬链接的语法:
# ln 源文件 目标文件
下面我们举一个例子,在这个例子中,我们要为sun.txt 创建其硬链接sun002.txt。然后看一下sun.txt和sun002.txt的属性的变化;
[root@localhost ~]# ls -li sun.txt 注:查看sun.txt的属性;
2408263 -rw-r--r-- 1 root root 29 04-22 21:02 sun.txt 注:这是sun.txt的属性;
[root@localhost ~]# ln sun.txt sun002.txt 注:我们通过ln 来创建sun.txt的硬链接文件sun002.txt
[root@localhost ~]# ls -li sun* 注:我们列一下sun.txt 和sun002.txt
2408263 -rw-r--r-- 2 root root 29 04-22 21:02 sun002.txt
2408263 -rw-r--r-- 2 root root 29 04-22 21:02 sun.txt
我们可以看到sun.txt在没有创建硬链接文件sun002.txt的时候,其链接个数是1(也就是-rw-r--r--后的那个数值),创建了硬链接sun002.txt创建后,这个值变成了2。也就是说,我们每次为sun.txt创建一个新的硬链接文件后,其硬链接个数都会增加1。
inode值相同的文件,他们的关系是互为硬链接的关系。当我们修改其中一个文件的内容时,互为硬链接的文件的内容也会跟着变化。如果我们删除互为硬链接关系的某个文件时,其它的文件并不受影响。比如我们把sun.txt删除后,我们还是一样能看到sun002.txt的内容,并且sun02.txt仍是存在的。
可以这么理解,互为硬链接关系的文件,他们好象是克隆体,他们的属性几乎是完全一样;
下面的例子,我们把sun.txt删除,然后我们看一下sun002.txt 是不是能看到其内容。
[root@localhost ~]# rm -rf sun.txt
[root@localhost ~]# more sun002.txt
注意:硬链接不能为目录创建,只有文件才能创建硬链接。
2.12 软链接的创建,及软接与源文件的关系;
创建软链接(也被称为符号链接)的语法;
# ln -s 源文文件或目录 目标文件或目录
软链接也叫符号链接,他和硬链接有所不同,软链接文件只是其源文件的一个标记。当我们删除了源文件后,链接文件不能独立存在,虽然仍保留文件名,但我们却不能查看软链接文件的内容了。
[root@localhost ~]# ls -li linuxsir001.txt
2408274 -rw-r--r-- 1 root root 29 04-22 21:53 linuxsir001.txt
[root@localhost ~]# ln -s linuxsir001.txt linuxsir002.txt
[root@localhost ~]# ls -li linuxsir001.txt linuxsir002.txt
2408274 -rw-r--r-- 1 root root 29 04-22 21:53 linuxsir001.txt
2408795 lrwxrwxrwx 1 root root 15 04-22 21:54 linuxsir002.txt -> linuxsir001.txt
解释
上面的例子,首先我们查看 linuxsir001.txt 的属性,比如inode 、所属文件种类、创建或修改时间等... ...我们来对比一下:
首先 对比一下节点:两个文件的节点不同;
其次 两个文件的归属的种类不同 linuxsir001.txt是-,也就是普通文件,而linuxsir002.txt 是l,它是一个链接文件;
第三 两个文件的读写权限不同 linuxsir001.txt 是rw-r--r-- ,而linuxsir002.txt的读写权限是 rwxrwxrwx
第三 两者的硬链接个数相同;都是1
第四 两文件的属主和所归属的用户组相同;
第五 修改(或访问、创建)时间不同;
我们还注意到了linuxsir002.txt 后面有一个标记 ->,这表示linuxsir002.txt 是linuxsir001.txt的软链接文件。
值得我们注意的是:当我们修改链接文件的内容时,就意味着我们在修改源文件的内容。当然源文件的属性也会发生改变,链接文件的属性并不会发生变化。当我们把源文件删除后,链接文件只存在一个文件名,因为失去了源文件,所以软链接文件也就不存在了。这一点和硬链接是不同的;
[root@localhost ~]# rm -rf linuxsir001.txt 注:删除linuxsir001.txt
[root@localhost ~]# ls -li linuxsir002.txt 注:查看linuxsir002 的属性;
2408795 lrwxrwxrwx 1 root root 15 04-22 21:54 linuxsir002.txt -> linuxsir001.txt
[root@localhost ~]# more linuxsir002.txt 注:查看linuxsir002.txt的内容;
linuxsir002.txt: 没有那个文件或目录 注:得到提示,linuxsir002.txt不存在。
上面的例子告诉我们,如果一个链接文件失去了源,就意味着他已经不存在了;
我们可以看到软链接文件,其实只是源文件的一个标记,当源文件失去时,他也就是存在了。软链接文件只是占用了inode来存储软链接文件属性等信息,但文件存储是指向源文件的。
软件链接,可以为文件或目录都适用。无论是软链接还是硬链接,都可以用rm来删除。rm工具是通用的。
3、文件类型;
当用ls指令的长格式显示文件或目录的属性时;比如:
[root@localhost ~]# ls -lih
总计 104K
2408949 -rwxr-xr-x 1 root root 7 04-21 12:47 lsfile.sh
2408830 drwxr-xr-x 2 root root 4.0K 04-21 12:46 mkuml-2004.07.17
2408260 drwxr-xr-x 2 root root 4.0K 04-21 22:15 mydir
2408258 lrwxrwxrwx 1 root root 7 04-21 22:16 sun001.txt -> sun.txt
2408263 -rw-r--r-- 2 root root 11 04-20 14:17 sun002.txt
2408263 -rw-r--r-- 2 root root 11 04-20 14:17 sun.txt
我们来看一下lsfile.sh这行,其中有这样一个字段 -rwxr-xr-x 。这个字段包括两个信息,一是文件类型,二是文件的权限;文件类型就第一个字符,lsfile.sh的文件所归属的文件种类是- 。同理 mkuml-2004.07.17的这段是drwxr-xr-x,它所归属的文件种类应该是d;sun001.txt文件呢,对应的lrwxrwxrwx,sun001.txt所归属的文件种类应该是-l 。
我们可以知道Linux文件可以分为如普通文件、目录、符号链接文件、字符和块设备文件、套接口文件等。
详情请参考 :《Linux 文件类型和文件的扩展名》
4、文件的权限;
Linux文件或目录的权限是和用户和用户组联系在一起的,所以理解这部份内容,您首先得了解一下Linux用户管理方面的知识 。请参考 :《Linux 用户(user)和用户组(group)管理概述》。如果您是新手,要把这篇文档的相关文档也了解一下,这对您理解本文真的很重要;
每个文件或目录都有一组9个权限位,每三位被分为一组,他们分别是属主权限位(占三个位置 )、用户组权限位(占三个位置)、其它用户权限位(占三个位置)。比如rwxr-xr-x ,我们数一下就知道是不是9个位置了,正是这9个权限位来控制文件属主、用户组以及其它用户的权限。
4.1 关于权限位;
Linux文件或目录的权限位是由 9 个权限位来控制,每三位为一组,它们分别是文件属主(Ower)的读、写、执行,用户组(Group)的读、写、执行以及(Other)其它用户的读、写、执行;
文件属主: 读r、写w、执行x 用 户 组 : 读r、写w、执行x 其它用户: 读r、写w、执行x 如果权限位不可读、不可写、不可执行,是用-来表示。
对于普通文件的读、写、执行权限可以这样理解:
可读:意味着我们可以查看阅读;
可写:意味着,可以修改或删除(不过删除或修改的权限受父目录上的权限控制);
可执行:意味着如果文件就可以运行,比如二进制文件(比如命令),或脚本(要用脚本语言解释器来解释运行)。
比如:
[root@localhost ~]# ls -l lsfile.sh
-rwxr-xr-x 1 root root 7 04-21 12:47 lsfile.sh
第一个字段 -rwxr-xr-x中的第一个字符是-,表示lsfile.sh是一个普通文件;
lsfile.sh的权限是 rwxr-xr-x。表示lsfile.sh文件,文件的属主root,拥有rwx(可读、可写、可执行)权限,用户组root,拥有 r-x(可读、可写)权限 ,其它用户拥有 r-x(可读、可写)权限。这9个权限连在一起就是 rwxr-xr-x,也就是说,lsfile.sh 文件,文件属主root拥有可读、可写、可执行权限,用户组root下的所有用户拥有可读可执行权限,其它用户拥有可读可执行权限。
查看文件的属性用 ls -l 文件 ;查看目录的属性是 ls -d 目录。请参考 :
4.2 改变权限的命令 chmod ;
chmod 是用来改变文件或目录权限的命令,但只有文件的属主和超级权限用户root才有这种权限。通过chmod 来改变文件或目录的权限有两种方法,一种是通过八进制的语法,另一种是通过助记语法;
举例:
[root@localhost ~]# touch linuxsir007.txt 注:创建linuxsir007.txt文件;
[root@localhost ~]# touch linuxsir008.txt 注:创建linuxsir008.txt 文件;
[root@localhost ~]# ls -lh linuxsir007.txt linuxsir008.txt 注:查看linuxsir007.txt和linuxsir008.txt文件属性;
-rw-r--r-- 1 root root 0 04-23 20:11 linuxsir007.txt 注:linuxsir007.txt 文件属性;
-rw-r--r-- 1 root root 0 04-23 20:11 linuxsir008.txt 注:linuxsir008.txt 文件属性;
[root@localhost ~]# chmod 755 linuxsir007.txt 注:通过八进制语法来改变linuxsir007.txt的权限;
[root@localhost ~]# chmod u+x,og+x linuxsir008.txt 注:通过助记语法来改变linuxsir008.txt的权限;
[root@localhost ~]# ls -lh linuxsir007.txt linuxsir008.txt 注:查看linuxsir007.txt和linuxsir008.txt文件属性;
-rwxr-xr-x 1 root root 0 04-23 20:11 linuxsir007.txt
-rwxr-xr-x 1 root root 0 04-23 20:11 linuxsir008.txt
上 面例子是一个演示通过chmod的两种语法来改变权限的例子,我所要说明的是,两种方法都能达到同一目的。
这个过程是:
首先:创建linuxsir007.txt和linuxsir008.txt两个文件;
其次:查看两个文件的属性;他们的权限都是一样的,都是 rw-r--r-- ,表示文件属主可读可写、文件所归属的用户组对文件可读、其它用户可读;
第三:通过chmod的八进制语法来改变linuxsir007.txt 的权限;通过chmod的助记语法来改变linuxsir008.txt的权限; 我们用两种方法来改变linuxsir007.txt和linuxsir008.txt 文件,通过chmod的两种不同的语法来让两个文件的权限达以一致。在八进制语法中,我们用了 755 ,而在助记语法中,我们用了 u+x,og+x。虽然用了两种不同的语法,但达到的目的是一样的,最后的结果,我们可以看到两个文件的权限都是 rwxr-xr-x。也就是说文件的属主对文件有可读可写可执行的权限,文件所归属的用户组有可读可执行的权限,其它用户有可读可执行的权限。
由此我们引出了通过chmod 工具来改变文件或目录权限的的两种方法:chmod 的八进制语法,chmod的助记语法;
4.21 通过 chmod 八进制语法来改变文件或目录的权限;
我们前面已经说了,文件或目录的权限位总共有9个位置 ,文件属主、文件所归属的组占用三位和其它用户各占用三个位置。看个例子:
-rwxr-xr-x 1 root root 0 04-23 20:11 linuxsir007.txt
说明:
属主权限位:占用三个位置,三个位置的顺序是读r、写w、执行x。如果是没有权限,则为-。在这个例子中,我们看到rwx,表示属主在三个权位上都有权限,也就是可读可写可执行;
属组权限位:占用三个位置,三个位置的顺序是读r、写w、执行x。如果是没有权限,则为-。在这个例子中,我们看到的是r-x,在写的位置上是-,表示没有写权限,文件所归属的组对文件拥有的是可读可执行,但没有写的权限。
其它用户权限位:占用三个位置 ,三个位置的顺序是读r、写w、执行x,如果是没有权限,则为-。在这个例子中,我们看其它用户的权限位是r-x,在写的位置上是-,表示没有写权限,文件所归属的组对文件拥有的是可读可执行,但没有写的权限。
chmod 的八进制语法的数字说明;
r 4 w 2 x 1 - 0
属主的权限用数字表达:属主的那三个权限位的数字加起来的总和。比如上面的例子中属主的权限是rwx ,也就是4+2+1 ,应该是7;
属组的权限用数字表达:属组的那个权限位数字的相加的总和。比如上面的例子中的r-x ,也就是4+0+1 ,应该是5;
其它用户的权限数字表达:其它用户权限位的数字相加的总和。比如上面例子中是 r-x ,也就是4+0+1 ,应该是5;
[root@localhost ~]# ls -l sun.txt
-rwxr-xr-x 2 root root 29 04-22 21:02 sun.txt 注:查看sun.txt的属性,我们看到sun.txt的权限位是rwxr-xr-x,用八进制数字表示是755 ;
[root@localhost ~]# chmod 644 sun.txt 注;我们改变它的权限为属主可读可写、属组可读、其它用户可读,也就是rw-r--r--,用数字表示就是644;
[root@localhost ~]# ls -l sun.txt
-rw-r--r-- 2 root root 29 04-22 21:02 sun.txt 注:是不是达到目的了?是的!
每个三位的权限代码(分别是属主、属组,其它用户)组合,有8种可能;
八进制数字 权限 0 --- 1 --x 2 -w- 3 -wx 4 r-- 5 r-x 6 rw- 7 rwx
注解:我们可以根据上面的数字列表来组合权限,比如我想让属主拥有 rwx(所对应的数字是7),属组拥有 --x(所对应的数字是1),其它用户拥有 ---(所对应的数字是0),这样我们把各组的权限组合起来就是是 rwx--x---(对应的数字是710)。
[root@localhost ~]# ls -l sun.txt
-rw-r--r-- 2 root root 29 04-22 21:02 sun.txt
[root@localhost ~]# chmod 710 sun.txt
[root@localhost ~]# ls -l sun.txt
-rwx--x--- 2 root root 29 04-22 21:02 sun.txt
如果我们想改变的仅仅是打开目录的权限 ,不用加任何参数。如果想把目录以下的所有文件或子目录改变,应该加-R参数;
[root@localhost ~]# ls -ld testdir/
drwxr-xr-x 3 root root 4096 04-24 11:01 testdir/
[root@localhost ~]# ls -lr testdir/
总计 4
-rw-r--r-- 1 root root 0 04-24 11:01 sir01.txt
drwxr-xr-x 2 root root 4096 04-24 11:01 linuxsir
我们仅仅改变testdir的权限,让其拥有属主可读可写、属组可读、其它用户可读,也就是rw-r--r-- ,用八进制的算数应该是644。
[root@localhost ~]# ls -ld testdir/ 注:我们查看到的testdir目录的权限是rwxr--r--;
drwxr-xr-x 3 root root 4096 04-24 11:01 testdir/
[root@localhost ~]# chmod 644 testdir/
[root@localhost ~]# ls -ld testdir/
drw-r--r-- 3 root root 4096 04-24 11:01 testdir/ 注:改变成功;
[root@localhost ~]# ls -lr testdir/ 注:我们查看一下testdir目录下的子目录是否改变了?
尝试一下改变testdir及其子目录和文件权限都要改变为 rw-r--r--权限。我们要用到-R参数;
[root@localhost ~]# chmod -R 644 testdir/ 注:我们改变testdir下所有的文件或子目录的权限都为 rw-r--r--
[root@localhost ~]# ls -ld testdir/
drw-r--r-- 3 root root 4096 04-24 11:01 testdir/
[root@localhost ~]# ls -lr testdir/
总计 4
-rw-r--r-- 1 root root 0 04-24 11:01 sir01.txt
drw-r--r-- 2 root root 4096 04-24 11:01 linuxsir
值得注意的是:chmod 改变一个目录下的所有.file时,要小心操作。比如我们要改变testdir下的所有.file 的权限为 rwxr--r--,但我们不想改变testdir目录的权限 。下面的例子操作是错误的。
[root@localhost ~]# ls -ld testdir/
drw-r--r-- 3 root root 4096 04-24 11:01 testdir/
[root@localhost ~]# ls -lr testdir/
总计 4
-rw-r--r-- 1 root root 0 04-24 11:01 sir01.txt
drw-r--r-- 2 root root 4096 04-24 11:01 linuxsir
[root@localhost ~]# chmod -R 755 testdir/.* 注:这样操作,会把testdir目录的权限一并改为 rwxr--r--
[root@localhost ~]# ls -ld testdir/
drwxr-xr-x 3 root root 4096 04-24 11:01 testdir/
所以当您想改变一个目录下的所有.file权限,并且想保留该目录的原有权限时,请不要用.*通配符。至于应该怎么做,我想大家都明白。比如下面的匹配;
[root@localhost ~]# chmod -R 644 testdir/.[a-z]*
上面的例子chmod 会匹配所有以.a到.z 开头的文件。
4.22 通过 chmod 助记语法来改变文件或目录的权限;
chmod 的助记语法相对简单,对文件或目录权限的改变时,是通过比较直观的字符的形式来完成;在助记语法中,相关字母的定义;
用户或用户组定义:
u 代表属主
g 代表属组
o 代表其它用户
a 代表属主、属组和其它用户,也就是上面三个用户(或组)的所有;
权限定义字母:
r 代表读权限;
w 代表写权限;
x 代表执行权限;
权限增减字符;
- 代表减去相关权限;
+ 代表增加相关权限;
示例一:
[root@localhost ~]# ls -l linuxsir007.txt
-rwxr-xr-x 1 root root 0 04-23 20:11 linuxsir007.txt
[root@localhost ~]# chmod ugo-x linuxsir007.txt 注:把属主、用户组及其它用户的执行权限都减掉;
[root@localhost ~]# ls -l linuxsir007.txt
-rw-r--r-- 1 root root 0 04-23 20:11 linuxsir007.txt
示例二:
[root@localhost ~]# ls -l linuxsir007.txt
-rw-r--r-- 1 root root 0 04-23 20:11 linuxsir007.txt
[root@localhost ~]# chmod u+x linuxsir007.txt 注:为文件的属主增加执行权限
[root@localhost ~]# ls -l linuxsir007.txt
-rwxr--r-- 1 root root 0 04-23 20:11 linuxsir007.txt
示例三:
[root@localhost ~]# ls -l linuxsir007.txt
-rwxr--r-- 1 root root 0 04-23 20:11 linuxsir007.txt
[root@localhost ~]# chmod u-x,go+rw linuxsir007.txt 注:减去文件属主对文件的执行权,增加属组和其它用户对文件的可读可写权;
[root@localhost ~]# ls -l linuxsir007.txt
-rw-rw-rw- 1 root root 0 04-23 20:11 linuxsir007.txt
用助记语法比较灵活,组合起来比较方便;比如;
u=r+x 为文件属主添加读写权限;
ug=rwx,o=r 为属主和属组添加读、写、执行权限,为其它用户设置读权限。
a+x 为文件的属主、属组和其它用户添加执行权限;
g=u 让文件的属组和属主和权限相同;
对于目录权限的设置,要用到-R参数;
和八进制方法一样,如果我们为一个目录及其下的子目录和文件具有相同的属性,就可以用-R参数;
[root@localhost ~]# chmod -R a+rwx testdir/
[root@localhost ~]# ls -lr testdir/
总计 4
-rwxrwxrwx 1 root root 0 04-24 11:01 sir01.txt
drwxrwxrwx 2 root root 4096 04-24 11:01 linuxsir
4.3 默认权限分配的命令 umask ;
umask 是通过八进制的数值来定义用户创建文件或目录的默认权限。umask 表示的是禁止权限。不过文件和目录有点不同。
对于文件来说,umask 的设置是在假定文件拥有八进制666权限上进行,文件的权限就是是666减去umask的掩码数值;
对于目录来说,umask 的设置是在假定文件拥有八进制777权限上进行,目录八进制权限777减去umask的掩码数值;
实例一:
[root@localhost ~]# umask 066
[root@localhost ~]# mkdir testdir003
[root@localhost ~]# ls -ld testdir003/
drwx--x--x 2 root root 4096 04-24 15:01 testdir003/
[root@localhost ~]# ls -lh sun998.txt
-rw------- 1 root root 0 04-25 15:57 sun998.txt
实例二:
系统用户的家目录的权限是通过在配置文件中指定的,比如Fedora 中是用的 /etc/login.defs文件;
其中有这样一段:
CREATE_HOME yes
UMASK 077
表示的意思是,当我们创建用户时,他的家目录umask的数值是077 。我们怎么理解这个077呢。当用户添加时,系统自动在/home中创建用户的家目录,并且设置它的权限为777-077=711 ,也就是rwx------ ;我们看一下/home下的某个用户的家目录是不是这样的呢?
[root@localhost ~]# ls -ld ~beinan
drwx------ 36 beinan beinan 4096 04-24 15:08 /home/beinan
umask 一般都是放在用户相关SHELL的配置文件中,比如用户家目录下的.bashrc 或.profile ,也可以放在全局性的用户配置文件中,比如 /etc/login.defs,还可以放在SHELL全局的配置文件中,比如/etc/profile 或/etc/bashrc或/etc/csh.cshrc 等;
umask 放在相关的配置文件中,目的是当管理员创建用户时,系统会自动为用户创建文件或目录时配置默认的权限代码。
5、setuid和setgid 位;
本部份内容做为了解,看看就行了;
5.1 setuid和setgid的解说 ;
setuid 和setgid位是让普通用户可以以root用户的角色运行只有root帐号才能运行的程序或命令。比如我们用普通用户运行passwd命令来更改自己的口令,实际上最终更改的是/etc/passwd文件。我们知道/etc/passwd文件是用户管理的配置文件,只有root权限的用户才能更改。
[root@localhost ~]# ls -l /etc/passwd
-rw-r--r-- 1 root root 2379 04-21 13:18 /etc/passwd
作为普通用户如果修改自己的口令通过修改/etc/passwd肯定是不可完成的任务,但是不是可以通过一个命令来修改呢。答案是肯定的,作为普通用户可以通过passwd 来修改自己的口令。这归功于passwd命令的权限。我们来看一下;
[root@localhost ~]# ls -l /usr/bin/passwd
-r-s--x--x 1 root root 21944 02-12 16:15 /usr/bin/passwd
因为/usr/bin/passwd 文件已经设置了setuid 权限位(也就是r-s--x--x中的s),所以普通用户能临时变成root,间接的修改/etc/passwd,以达到修改自己口令的权限。
我们在《Linux 系统中的超级权限的控制》中有提到过。我们知道Linux的用户管理是极为严格的,不同的用户拥有不同的权限,为了完成只有root用户才能完成的工作,我们必须为普通用户提升权限,最常用的方法就是su或sudo。虽然setuid 和setgid也是让普通用户超越自身拥有的普通权限达到root权限的方法,但我不推荐大家使用,因为它能为系统带来安全隐患!!
注意:setuid和setgid会面临风险,所以尽可能的少用,了解了解既可~~~
5.2 setuid和setgid的实例应用;
我们想让一个普通用户beinan拥有root用户拥有超级rm删除权限,我们除了用su或sudo 临时切换到 root身份操作以外,还能怎么做呢???
[root@localhost ~]#cd /home 注:进入/home目录
[root@localhost home]# touch beinantest.txt 注:创建一个测试文件;
[root@localhost home]# ls -l beinantest.txt 注:查看文件属性;
-rw-r--r-- 1 root root 0 04-24 18:03 beinantest.txt 注:文件的属性;
[root@localhost home]# su beinan 注:切换到普通用户 beinan
[beinan@localhost home]$ rm -rf beinantest.txt 注:以普通用户身份来删除beinantest.txt文件;
rm: 无法删除 “beinantest.txt”: 权限不够
那我们怎么才能让beinan 这个普通用户也拥有root超级的rm 删除功力呢?
[root@localhost ~]# ls -l /bin/rm
-rwxr-xr-x 1 root root 93876 02-11 14:43 /bin/rm
[root@localhost ~]# chmod 4755 /bin/rm 注:设置rm的权限为4755 , 就把setuid 位设置好了。
[root@localhost ~]# ls -l /bin/rm
-rwsr-xr-x 1 root root 43980 02-11 14:43 /bin/rm
[root@localhost ~]# cd /home/
[root@localhost home]# su beinan 注:切换到beinan用户身份;
[root@localhost home]$ ls -l beinantest.txt 注:查看文件属性;
-rw-r--r-- 1 root root 0 04-24 18:03 beinantest.txt 注:文件的属性;
[beinan@localhost home]$ rm -rf beinantest.txt 注:删除beinantest.txt文件;
我们只是设置了rm的setuid位,让普通用户在rm指令上有超级root的删除超级权力。
通过这个例子,我们应该能明白setuid和setgid位的应用了,如同前面所说,让普通用户超越本身的能力,让普通用户能执行只有root才能执行的命令。在这一点,我们要和su和sudo 区分开来。请参见su和sudo的文档:《Linux 系统中的超级权限的控制》
5.3 setuid和setgid的设置方法;
第一种方法:八进制方法:
setuid位是的设置用八进制的4000,setgid占用的是八进制的2000 ;比如我们前面所说的 chmod 4755 /bin/rm 就是设置的setuid位;
至于setuid的设置方法,只是在我们通过chmod设置文件或目录权限位的八进制方法的前面多加一个数字,也就是4。比如:
[root@localhost ~]# chmod 4755 /bin/rm 注:设置rm的权限为4755 , 就把setuid 位设置好了。
作为setgid 位占用的是八进制的2000位,我们下面举个例子;
[root@localhost ~]# cd /home/
[root@localhost home]# mkdir slackdir
[root@localhost home]# ls -ld slackdir/
drwxr-xr-x 2 root root 4096 04-24 18:25 slackdir/
[root@localhost home]# chmod 2755 slackdir/
[root@localhost home]# ls -ld slackdir/
drwxr-sr-x 2 root root 4096 04-24 18:25 slackdir/
我们看到 slackdir这个目录,经过改变权限后的,目录所归属用户组的那三个权限位是 r-s。 如果我们见到的是小写的s,表明文件所归属的用户组位有执行权限x。因为我们用了2755 ,意思是说文件属主拥有可读可写可执行权限,所归属的用户组拥有可读可执行权限,并且设置了setuid,所以这时本来文件所归属的用户组拥有r-x,现在加了setgid位,就把其中的x换成了s。如果文件所归属的用户组没有执行权限,这个权限应该是S。同理setuid位的中的大写的S和小写的s,也是这个原理。见下面的例子;
[root@localhost home]# chmod 2740 slackdir/
[root@localhost home]# ls -ld slackdir/
drwxr-S--- 2 root root 4096 04-24 18:25 slackdir/
这个例子是因为目录slackdir所归属的组没有执行权限,这时本来在执行权限位上显示-,由于有了setuid,所以显示为S。
如果我们为一个文件的权限拥有 属主可读可写可执行、所归的组拥有可读可执行,其它用户可读可执行,并且同时设置setuid和setgid位,我们应该怎么运行命令呢?
[root@localhost ~]# touch gooddoc.txt
[root@localhost ~]# ls -l gooddoc.txt
-rw-r--r-- 1 root root 0 04-24 18:47 gooddoc.txt
[root@localhost ~]# chmod 6755 gooddoc.txt
[root@localhost ~]# ls -l gooddoc.txt
-rwsr-sr-x 1 root root 0 04-24 18:47 gooddoc.txt
所以,同时设置setuid和setgid,就是把setuid和setgid两个八进位的值相加 (4000+2000=6000),然后加上文件或目录的权限位的三位数值(上面的例子是755),然后通过chmod 运行就行了。所以上面例子中用了6755 。
第二种方法:通过助记语法;
还是延用chmod的助记语法,通过u+s 或u-s 来增减setuid位,同理,我们可以通过g+s 或g-s 来setgid位;
[root@localhost ~]# touch mydoc.txt 注:创建一个文件;
[root@localhost ~]# ls -l mydoc.txt
-rw-r--r-- 1 root root 0 04-24 19:00 mydoc.txt
[root@localhost ~]# chmod u+s mydoc.txt
[root@localhost ~]# ls -l mydoc.txt
-rwSr--r-- 1 root root 0 04-24 19:00 mydoc.txt
我们也可以用file命令来查看setuid和setgid位,当然也能用file来查看文件的类型;
比如:
[root@localhost ~]# file /usr/bin/passwd
6、粘贴位及设置方法;
粘贴位的理解,我们还是先看一个例子;
[root@localhost ~]# ls -ld /tmp/
drwxrwxrwt 12 root root 4096 04-24 18:36 /tmp/
我们看到/tmp权限位最后的一个字母是 t。这就是设置了粘贴位。
粘贴位的设置,可以用八进制的1000位来设置。比如
[root@localhost ~]# mkdir googledir
[root@localhost ~]# ls -ld googledir/
drwxr-xr-x 2 root root 4096 04-24 21:59 googledir/
[root@localhost ~]# chmod 1755 googledir/
[root@localhost ~]# ls -ld googledir/
drwxr-xr-t 2 root root 4096 04-24 21:59 googledir/
也可以用chmod 的助记语法来设置。用o+t表示设置粘帖位,用o-t表示取消粘贴位;
[root@localhost ~]# ls -ld googledir/
drwxr-xr-x 2 root root 4096 04-24 21:59 googledir/
[root@localhost ~]# chmod o+t googledir/
[root@localhost ~]# ls -ld googledir/
drwxr-xr-t 2 root root 4096 04-24 21:59 googledir/
粘贴位现在也很少用了,不过对于象/tmp目录这样的,是整个系统临时文件存放在,还是有点意义。一个目录既使它的所有权限都开放rwxrwxrwx,如果是设置了粘帖位,除非目录的属主和root用户有权限删除它,除此之外其它用户不能删除这个目录。用途一般是把一个文件夹的的权限都打开,然后来共享文件,象/tmp目录一样。
建议最好不要用!
7、文件或目录的归属关系;
文件或目录的归属关系主要定义文件归属哪个用户所有及归于哪个用户组所有。
[root@localhost ~]# ls -ld dony.txt
-rw-rw-rw- 1 root root 0 04-24 15:05 dony.txt
上面的例子表示,dony.txt 这个文件,其属主是root,归属的组是root用户组,而root用户所拥有的权限是rw-,root用户组拥有的权限是rw-。
有时我们可能不理解,为什么Linux要设置文件的属主、属组,为什么还要为属主、属组和其它用户都要设置权限呢??我们在以前的文档说过,Linux是多用户的操作系统,文件的安全性对Linux是极为重要的,Linux的安全性主要表示在用户管理和权限(用户的权限及文件的权限)管理上。
7.1 改变文件的当属关系的工具 chown ;
当我们要改变一个文件的属组,我们所使用的用户必须是该文件的属主而且同时是目标属组成员,或超级用户。只有超级用户的才能改变文件的属主。
chown 语法:
#chown [选项]... [所有者][:[组]] 文件...
举例:将example.txt文件的属主改为linuxsirorg用户;
[root@localhost ~]# ls -l example.txt
-rw-r--r-- 1 root root 0 04-24 22:37 example.txt
[root@localhost ~]# ls -l example.txt
-rw-r--r-- 1 linuxsirorg root 0 04-24 22:37 example.txt
[root@localhost ~]# chown beinan:root example.txt
[root@localhost ~]# ls -l example.txt
-rw-r--r-- 1 beinan root 0 04-24 22:37 example.txt
chown 所接的新的属主和新的属组之间应该以.或:连接,属主和属组之一可以为空。如果属主为空,应该是 :属组 ;如果属组为空 就就不必需要.或:了。
[root@localhost ~]# ls -l sun.txt
-rwxr-xr-x 2 root root 29 04-22 21:02 sun.txt
[root@localhost ~]# chown beinan sun.txt 注:把sun.txt文件的属主改为beinan;
[root@localhost ~]# ls -l sun.txt
-rwxr-xr-x 2 beinan root 29 04-22 21:02 sun.txt
[root@localhost ~]# chown :beinan sun.txt 注:把sun.txt文件的属组改为beinan
[root@localhost ~]# ls -l sun.txt
-rwxr-xr-x 2 beinan beinan 29 04-22 21:02 sun.txt
[root@localhost ~]# chown root:linuxsir sun.txt 注:把sun.txt的属主改为root,把改组改为linuxsir用户组;
[root@localhost ~]# ls -l sun.txt
-rwxr-xr-x 2 root linuxsir 29 04-22 21:02 sun.txt
chown 也提供了-R参数,这个参数对目录改变属主和属组极为有用,我们可以通过加-R参数来改变某个目录下的所有文件到新的属主或属组;
[root@localhost ~]# ls -ld mydir/ 注:查看mydir目录的属性
drwxr-xr-x 2 root root 4096 04-25 09:08 mydir/ 注:我们发现此目录的属主是root用户,属组是root用户组;
[root@localhost ~]# ls -lr mydir/ 注:我们查看mydir目录下的有什么文件,及他们的属主和属组;
总计 8
-rwxr-xr-x 2 beinan linuxsir 29 04-22 21:02 sun.txt
-rwxr-xr-x 2 beinan linuxsir 29 04-22 21:02 sun002.txt
lrwxrwxrwx 1 root root 7 04-21 22:16 sun001.txt -> sun.txt
-rw-r--r-- 1 linuxsirorg root 0 04-24 22:37 example.txt
-rw-rw-rw- 1 beinan root 0 04-24 15:05 dony.txt
[root@localhost ~]# chown -R beinan:linuxsir mydir/ 注:我们修改mydir及它的下级目录和所有文件到新的用户和用户组;
[root@localhost ~]# ls -ld mydir/
drwxr-xr-x 2 beinan linuxsir 4096 04-25 09:08 mydir/
[root@localhost ~]# ls -lr mydir/
总计 8
-rwxr-xr-x 2 beinan linuxsir 29 04-22 21:02 sun.txt
-rwxr-xr-x 2 beinan linuxsir 29 04-22 21:02 sun002.txt
lrwxrwxrwx 1 beinan linuxsir 7 04-21 22:16 sun001.txt -> sun.txt
-rw-r--r-- 1 beinan linuxsir 0 04-24 22:37 example.txt
-rw-rw-rw- 1 beinan linuxsir 0 04-24 15:05 dony.txt
值得注意的是chown 和chmod 类似,我们 改变一个目录下的所有.file时的属主和属组时要小心操作。比如我们要改变testdir及它目录下的所有.file 的属主和改组时。下面的例子操作是错误的。
[root@localhost ~]# ls -ld /root/ 注:查看/root目录的属性,主要看他的属主和属组;
drwxr-xr-x 19 root root 4096 04-25 09:20 /root/ 注:属主是root,属组是root用户组;
[root@localhost ~]# ls -ld /root/testdir/ 注:查看/root/testdir 目录的属主和属组;
drwxr-xr-x 2 root root 4096 04-25 09:20 /root/testdir/ 注:属主是root,属组是root用户组;
[root@localhost ~]# chown -R beinan:beinan /root/testdir/.* 注:改变/root/testdir目录下的以.开头的所有文件(注:假设我们是这么想的)
[root@localhost ~]# ls -ld /root/ 注:查看/root的属性;
drwxr-xr-x 19 beinan beinan 4096 04-25 09:20 /root/ 注:看到了吧,testdir 目录的上组目录/root的属主和属组也改变了。
[root@localhost ~]# ls -ld /root/testdir/ 注:查看testdir
drwxr-xr-x 2 beinan beinan 4096 04-25 09:20 /root/testdir/
所以我们用.*来匹配文件时,可能会存在让chown 误操作,这样会连同父目录的属主和属组的归属关系也被改变。
7.2 改变文件的属组工具 chgrp ;
语法:
chgrp [参数选项]... 组 文件...
它的用户和chown 类似,只不过它仅是用来改变文件或目录的属组的;-R参数用于目录及目录下所有文件改变属组的。这和chown也是一样的。简单来两个例子;
例子一:
[root@localhost ~]# ls -l sun.txt
-rw-r--r-- 1 root root 0 04-25 09:38 sun.txt
[root@localhost ~]# chgrp beinan sun.txt 注:改变sun.txt的属组为beinan用户组;
[root@localhost ~]# ls -l sun.txt
-rw-r--r-- 1 root beinan 0 04-25 09:38 sun.txt
例子二:
[root@localhost ~]# ls -ld mydir/
drwxr-xr-x 2 root root 4096 04-25 09:08 mydir/
[root@localhost ~]# ls -lr mydir/
总计 8
-rwxr-xr-x 2 root root 29 04-22 21:02 sun.txt
-rwxr-xr-x 2 root root 29 04-22 21:02 sun002.txt
lrwxrwxrwx 1 root root 7 04-21 22:16 sun001.txt -> sun.txt
-rw-r--r-- 1 root root 0 04-24 22:37 example.txt
-rw-rw-rw- 1 root root 0 04-24 15:05 dony.txt
[root@localhost ~]# chgrp -R linuxsir mydir/ 注:改变所mydir及其下面所有的文件及子目录的属组为linuxsir;
[root@localhost ~]# ls -ld mydir/
drwxr-xr-x 2 root linuxsir 4096 04-25 09:08 mydir/
[root@localhost ~]# ls -lr mydir/
总计 8
-rwxr-xr-x 2 root linuxsir 29 04-22 21:02 sun.txt
-rwxr-xr-x 2 root linuxsir 29 04-22 21:02 sun002.txt
lrwxrwxrwx 1 root linuxsir 7 04-21 22:16 sun001.txt -> sun.txt
-rw-r--r-- 1 root linuxsir 0 04-24 22:37 example.txt
-rw-rw-rw- 1 root linuxsir 0 04-24 15:05 dony.txt
7.3 文件属主和属组的特殊情况 ;
[root@localhost ~]# ls -lh sungood.txt
-rw-r--r-- 1 501 502 85 04-25 13:45 sungood.txt
上面的例子是不是有点怪?因为他的属主和属组都是一个数值;这是为什么呢?出现这种情况的原因是系统中不存在与之对应的用户,所以只能以数字形式显示了。有时我们删除了用户,但没有删除其家目录,这种情况下,它的家目录的属主和属组也会变成数字;
[root@localhost ~]# userdel linuxsir
[root@localhost ~]# ls -ld /home/linuxsir
drwx------ 16 501 502 4096 03-27 02:28 /home/linuxsir
8、影响文件的读写执行的因素;
之所以把这部份的内容单列出来,是因为这部份的内容是基于我们对用户管理及文件权限了解的基础上进行的。比如一个文件的读、写、执行,它要受到哪几方面的影响。
一个文件能不能被读取,要受到它的属主、属组及其它用户权限的影响,还要受到其父目录权限的影响。我们来举个例子;
[root@localhost ~]# cd /home 注:进入/home 目录;
[root@localhost home]# mkdir redhatdir 注:创建一个目录redhatdir
[root@localhost home]# touch redhatdir/test.txt 注:创建一个文件test.txt
[root@localhost home]# chmod 700 redhatdir/ 注:修改redhatdir的权限 ,为属主可读可写可执行,属组和其它用户无权限;
[root@localhost home]# ls -ld redhatdir/ 注:查看redhatdir的属性;
drwx------ 2 root root 4096 04-25 13:01 redhatdir/
[root@localhost home]# ls -lr redhatdir/ 注:查看test.txt 文件的属性;
总计 0
-rw-r--r-- 1 root root 0 04-25 13:02 test.txt
[root@localhost home]# su beinan 注:我们切换到普通用户beinan
[beinan@localhost home]$ cd redhatdir/ 注:进入redhatdir目录,以beinan用户身份。
bash: cd: redhatdir/: 权限不够
[beinan@localhost home]$ more redhatdir/test.txt
redhatdir/test.txt: 权限不够
解释:我们通过这个例子来看,为什么test.txt在其它用户权位上拥有可读权限r--,但我们用普通用户还不能查看它的内容呢?这是因为他的父目录没有其它用户的何读权限。我们是不是redhatdir目录的其它用户可读权限打开,就能让普通用户beinan能读取 test.txt的内容了呢??
[root@localhost home]# chmod 704 redhatdir/
[root@localhost home]# ls -ld redhatdir/
drwx---r-- 2 root root 4096 04-25 13:02 redhatdir
[root@localhost home]# su beinan
[beinan@localhost home]$ cd redhatdir/
bash: cd: redhatdir/: 权限不够
看来如果不设置属组的权限,只打开属主的权限及其它用户在redhatdir目录的读权限的情况下,其它用户是不能访问的;我们应该把test.txt父目录的 redhatdir 的属主的读、写、执行要打开,还要把父目录的属组的读和执行权限打开,其它用户的读和执行权限打开,也就是要拥有 rwxr-xr-x 权限,这样文件的其它用户才能访问。
[root@localhost home]# chmod 755 redhatdir/
[root@localhost home]# more redhatdir/test.txt
好象这块说的不太清楚,如果您看不太明白,多多chmod 练习练习,也没有什么难的。
其实为文件分配权限的最终目的是让文件的属主有何权限,让属组下的用户有何权限,让其它用户有何权限。文件权限是和用户管理相关联的,所以理解这方面的内容还得了解用户管理。
9、文件被修改或被访问的时间;
[root@localhost ~]# ls -l adduml02.sh
-rwxr-xr-x 1 root root 545 04-21 22:26 adduml02.sh
我们通过查看 文件的属性时,会发现它的时间标记,比如上面的 04-21 22:26 。这个时间并不代表文件被创建的时候,他是代表文件被访问或被修改的时间。文件被修改的时间比较好理解,比如我们可以用编辑器来修改文本文件,然后保存一下,这样文件的时间就变了。
当然也有其它的工具不修改文件的内容,只修改文件的时间,这时可以被称为访问时间。比如touch工具能达到这个目的。
[root@localhost ~]# ls -l adduml02.sh
-rwxr-xr-x 1 root root 545 04-21 22:26 adduml02.sh
[root@localhost ~]# touch adduml02.sh 注:更新文件的访问时间成为当前系统时间;
[root@localhost ~]# ls -l adduml02.sh
-rwxr-xr-x 1 root root 545 04-25 11:21 adduml02.sh
关于touch 的用法, 更多的请参见: man touch或touch --help
10、文件属性和文件系统属性的关系;
文件系统的特性决定着文件属性的定义和修改,比如我们通过 chattr 来锁定一个文件为不可修改或不可删除时,要用到chattr 的+i参数;这在ext2和ext3文件系统是有效的,但在reiserfs 文件系统是没有任何效果的;
[root@localhost ~]# chattr +i lsfile.sh
[root@localhost ~]# lsattr lsfile.sh
----i-------- lsfile.sh
[root@localhost ~]# rm -rf lsfile.sh
rm: 无法删除 “lsfile.sh”: 不允许的操作
注:如果把lsfile.sh变成可修改可删除,应该用-i参数;
比如在ext3或ext2 文件系统中,我们要让一个文件只能追加内容,但不能删除。应该用chattr的+a参数。
如果您在用ext3文件系统,想查看chattr 的帮助,请man chattr 。
11、关于本文;
关于Linux文件系统相关的文章,我是写过很多篇了,但感觉还是没有把问题说的更明白一点。存在这样问题的主要原因是Linux基础知识都是关联的。我们为了把一个问题说的清楚,得解决其相当的知识,这是最让人头痛的。
有些更为深入的东西可能我没有能力去写,一是因为这些内容用的比较少,二是样的内容理论性太强,表达想来极为困难。比如ext3和reiserfs 文件系统的内幕,如果您想对这方面的了解,只能查看ext3和reiserfs 官方的文档了。目前我没有能力写这样的文档。
12、后记;
我想在最近些天慢慢把一些常用的命令,以分类应用的形式介绍给初学的弟兄。但我不会搞成命令大全的形式。如果弄成命令大全的样子,我看不如去查man 之类的。因为man 说的更清晰,更明白。学为所用,用为所学,边学边用。有的东西并不一定要全懂,知道有这么回事就行了。