• 类UNIX系统基础:文件安全与权限


    这里面可能用到用户管理方面的知识,可查看贴:
    http://bbs.chinaunix.net/forum/viewtopic.php?p=2923303#2923303

    主要有以下内容:

    文件权限位
    基本命令
    chmod
    suid/guid
    chown
    chgrp
    umask算法和用法
    符号链接
    当创建一个文件的时候,系统保存了有关该文件的全部信息,包括:
    " 文件的位置。
    " 文件类型。
    " 文件长度。
    " 哪位用户拥有该文件,哪些用户可以访问该文件。
    " i节点。
    " 文件的修改时间。
    " 文件的权限位。

    让我们用touch命令创建一个文件:

    $ touch temp
    创建了一个空文件,现在用ls -l命令查看该目录下文件的属性(我这里用中文版):
    如下:

    [root@Linux_chenwy temp]# ls -l
    总用量 36
    -rw-r--r--    1 root     root        34890 10月 19 20:17 httpd.conf
    -rw-r--r--    1 root     root            0 10月 19 20:16 temp


    总用量 36:是ls所列出的入口占用空间的字节数(以K为单位)。
    1该文件硬链接的数目。
    root:文件属主。
    root:文件属组(一般是文件属主所在的缺省组。)
    34890:字节来表示的文件长度,记住,不是K字节!
    10月 19 20:17:件的更新时间。
    temp or httd.conf :件名。


    QUOTE:
    原帖由 "sunsroad " 发表:

    BTW:要检查该目录所有文件占用的空间应该用这个命令:du。
    譬如说前面说的36是如何计算出来:
    首先我们要先了解你所用的文件系统的IO BLOCK(中文叫作簇)为多少,在你所使用的这个文件系统的IO BLOCK大小是4096 Bytes。

    他意义是文件系统最小的读写及分配单位,每次读写操作你都不能小于这个尺寸。即使你的文件是只有一个字节。而且文件在硬盘上的存储也是以这个为单位,就是说如果文件尺寸小于这个值,那么它在磁盘上占用的空间就是4096字节。

    占用空间的具体算法是:(进一(文件尺寸/4096))×4096。根据这个你就可以计算出你所列举的例子中的文件的空间使用状况:34890除以 4096,大约等于8.5,进一法取得为9,就是说文件在磁盘上占用了9个BLOCk,每个BLOCK为4K,所以这两个文件占用的空间就是36K。

    这个规则也适合于目录,不过不会出现为0的目录,即使是空目录
    -rw-r--r-- :这是该文件的权限位。

    第一个横杠:指定文件类型,表示该文件是一个普通文件。(所创建的文件绝大多数都是普通文件或符号链接文件)。

    除去最前面的横杠,一共是9个字符,他们分别对应9个权限位。通过这些权限位,可以设定用户对文件的访问权限。对这两个文件的精确解释是:

    rw-:前三位,文件属主可读、写
    r--:中间三位,组用户可读
    r--:最后三位,其他用户只可读
    在创建的时候并未给属主赋予执行权限,在用户创建文件时,系统不会自动地设置执行权限位。这是出于加强系统安全的考虑

    BTW:文件的属主组并不一定就是所有者所在的缺省组,而可以是任何一个跟该文件所有者无关的用户组。为了方便,还是统称属主,属组和其它
    现在分开详细说明:

    文件类型

    前面提到的第一条横杠,表示该文件是普通文件型
    文件类型有七种,它可以从ls -l命令所列出的结果的第一位看出.

    七种类型:

    d 目录。
    l 符号链接(指向另一个文件)。
    s 套接字文件。
    b 块设备文件。
    c 字符设备文件。
    p 命名管道文件。
    - 普通文件,或者更准确地说,不属于以上几种类型的文件。
    文件的权限位中中每一组字符中含有三个权限位:

    r 读权限
    w 写/更改权限
    x 执行该脚本或程序的权限
    如:

    r-- --- --- 文文件属主可读,但不能写或执行
    r-- r-- --- 文文件属主和属组用户(一般来说,是文件属主所在的缺省组)可读
    r-- r-- r- - 文任何用户都可读,但不能写或执行
    rwx r-- r- - 文文件属主可读、写、执行,属组用户和其他用户只可读
    rwx r-x --- 文文件属主可读、写、执行,属组用户可读、执
    rwx r-x r- x 文文件属主可读、写、执行,属组用户和其他用户可读、执行
    rw- rw- --- 文文件属主和属组用户可读、写
    rw- rw- r- - 文文件属主和属组用户可读、写,其他用户可读
    rw- rw- --- 文文件属主和属组用户及其他用户读可以读、写,慎用这种权限
    设置,因为任何用户都可以写入该文件
    [quote]原帖由 "sunsroad"]文件的所有者组并非是文件所有者所在的缺省组,而可以是任何一个跟该文件所有者无关的用户组。[/quote 发表:
    使用chmod来改变权限位

    这一命令有符号模式和绝对模式。

    符号模式

    chmod命令的一般格式为:

    chmod [who] operator [permission] filename

    w h o的含义是:

    u 文件属主权限。
    g 属组用户权限。
    o 其他用户权限。
    a 所有用户(文件属主、属组用户及其他用户)。
    o p e r a t o r的含义:

    + 增加权限。
    - 取消权限。
    = 设定权限。
    p e r m i s s i o n的含义:

    r 读权限。
    w 写权限。
    x 执行权限。
    s 文件属主和组set-ID。
    t 粘性位*。
    l 给文件加锁,使其他用户无法访问。
    u,g,o 针对文件属主、属组用户及其他用户的操作。

    *在列文件或目录时,有时会遇到“ t”位。“t”代表了粘性位。如果在一个目录上出现“t”位,这就意味着该目录中的文件只有其属主才可以删除,即使某个属组用户具有和属主同等的权限。不过有的系统在这一规则上并不十分严格。

    如果在文件列表时看到“ t”,那么这就意味着该脚本或程序在执行时会被放在交换区(虚存)。
    对"t"还没弄清楚这是"sunsroad"的解释:

    QUOTE:
    原帖由 "sunsroad"]"t"权限用在文件上面是没有意义的,不是什么在交换区的概念,它跟文件的执行没有关系,而主要是为了文件共享设置的。 [/quote 发表:


    [quote]原帖由 "风流涕淌" 发表:
    1,t 权限是粘着位,例:TMP目录下,任何人都有读写执行权限,但是不是任何人对里边的可写权限的文件就可以删除呢,当然不是了,这个就是粘着位的做用,只有所有者才有权删除自已的文件,当然,ROOT除外
    2,关于文件安全的另一种权限,
    i权限 也就是不可修改权限  例:chattr u+i aaa 则aaa文件就不可修改,无论任何人,如果删除就用u-i就好了
    a权限 也就是只追加权限, 对于日志系统很好用,这个权限让目标文件只能追加,不能删除,而且不能通过编辑器追加。方法和i权限一样加
    如果想要看某个文件是不是有这个权限,用lsattr filename就行了
    谢谢风流涕淌的分享


    例如

    chmod a-x temp //rw- rw- rw- 收回所有用户的执行权限
    chmod og-w temp //rw- r-- r- - 收回属组用户和其他用户的写权限
    chmod g+w temp //rw- rw- r- - 赋予属组用户写权限
    chmod u+x temp //rwx rw- r- - 赋予文件属主执行权限
    chmod go+x temp //rwx rwx r- x 赋予属组用户和其他用户执行权限
    举如

    当创建temp文件时,它具有这样的权限:

    -rw-r--r--    1 root     root            0 10月 19 20:16 temp
    如果要使属主和属组用户具有有执行权限,并取消其他用户(所有其他用户)的写权限,可以用:

    $ chmod ug+x temp
    $ chmod o-w temp
    这样,该文件的权限变为:

    -rwxr--r--    1 root     root            0 10月 19 20:16 temp
    现在已经使文件属主对temp文件具有读、写执行的权限,属组用户真有读写权限,其它用户没有权限了。

    绝对模式

    chm d命令绝对模式的一般形式为:

    chmod [mode] file

    其中m o d e是一个八进制数。
    在绝对模式中,权限部分有着不同的含义。每一个权限位用一个八进制数来代表,如

    0 4 0 0 文件属主可读
    0 2 0 0 文件属主可写
    0 1 0 0 文件属主可执行

    0 0 4 0 属组用户可读
    0 0 2 0 属组用户可写
    0 0 1 0 属组用户可执行

    0 0 0 4 其他用户可读
    0 0 0 2 其他用户可写
    0 0 0 1 其他用户可执行
    在设定权限的时候,只需按照上面查出与文件属主、属组用户和其他用户所具有的权限相对应的数字,并把它们加起来,就是相应的权限表示。
    可以看出,文件属主、属组用户和其他用户分别所能够具有的最大权限值就是7。

    再来看看前面举的例子:

    -rwxr--r--  1   root            0 10月 19 20:16 temp
    相应的权限是:

    rwx-:0400 + 0200 +0100 (文件属主可读、写、执行) = 0 7 0 0
    r--:0 0 4 0 (属组用户可读) = 0 0 4 0
    r--:0 0 4 0 (属组用户可读) = 0 0 4 0
    0 7 4 4
    有一个计算八进制权限表示的更好办法,如下:

    文件属主:r w x:4 + 2 + 1
    属组用户:r w x:4 + 2 + 1
    其他用户:r w x:4 + 2 + 1
    这上面这相,更容易地计算出相应的权限值,只要分别针对文件属主、属组用户和其他用户把相应权限下面的数字加在一起就可以了。

    temp文件具有这样的权限:

    r w x     r - - r - -
    4+2+1  4     4
    把相应权限位所对应的值加在一起,就是7 4 4。

    如:

    chmod 666 rw- rw- rw- 赋予所有用户读和写的权限
    chmod 644 rw- r-- r- - 赋予所有文件属主读和写的权限,所有其他用户读权限
    chmod 744 rwx r-- r- - 赋予文件属主读、写和执行的权限,所有其他用户读的权限
    chmod 664 rw- rw- r- - 赋予文件属主和属组用户读和写的权限,其他用户读权限
    chmod 700 rwx --- --- 赋予文件属主读、写和执行的权限
    chmod 444 r-- r-- r- - 赋予所有用户读权限
    下面举一个例子,假定有一个名为temp的文件,具有如下权限:

    -rw-rw-r--  1   root            0 10月 19 20:16 test1
    现在希望对该文件可读、写和执行, root组用户对该文件只读,可以键入:

    $chmod 740 test1
    $ls -l
    -rwxr-----  1   root            0 10月 19 20:16 test1
    如果文件可读、写和执行,对其他所有用户只读,用:

    $chmod 744 test1
    $ls -l
    -rwxr--r--  1   root            0 10月 19 20:16 test1
    如果希望一次设置目录下所有文件的权限,可以用:

    $chmod 664*
    $ls -l
    -rw-r--r--  1   root            0 10月 19 20:16 test1
    这将使文件属主和属组用户都具有读和写的权限,其他用户只具有读权限。

    还可以通过使用- R选项连同子目录下的文件一起设置:

    chmod -R 664 /temp/*
    这样就可以一次将/ temp目录下的所有文件连同各个子目录下的文件的权限全部设置为文件属主和属组用户可读和写,其他用户只读。使用- R选项一定要谨慎,只有在需要改变目录树下全部文件权限时才可以使用。

    目录

    目录的权限位和文件有所不同。目录的读权限位意味着可以列出其中的内容。写权限位意味着可以在该目录中创建文件,如果不希望其他用户在你的目录中创建文件,可以取消相应的写权限位。执行权限位则意味着搜索和访问该目录.

    r :可以列出该目录中的文件
    w:可以在该目录中创建或删除文件
    x:可以搜索或进入该目录
    权限文件属主属组用户其他用户

    drwx rwx r- x ( 775 ) 属主读、写、执行,属组读、写、执行,其它组读、执行
    drwx r-x r- - ( 754 ) 属主读、写、执行,属组读、执行,其它组读
    drwx r-x r- x ( 755 ) 属主读、写、执行,属组读、执行,其它组读、执行
    如果把属组用户或其他用户针对某一目录的权限设置为- - x,那么他们将无法列出该目录中的文件。如果该目录中有一个执行位置位的脚本或程序,只要用户知道它的路径和文件名,仍然可以执行它。用户不能够进入该目录并不妨碍他的执行。

    目录的权限将会覆盖该目录中文件的权限。例如,如果目录temp具有如下的权限:

    drwxr--r--  1   admin            0 10月 19 20:16 temp
    而目录下的文件myfile的权限为:

    -rwxrwxrwx  1   admin           0 10月 19 20:16 myfile
    那么admin组的用户将无法编辑该文件,因为它所属的目录不具有这样的权限。

    该文件对任何用户都可读,但由于它所在的目录并未给admin组的用户赋予执行权限,所以该组的用户都将无法访问该目录,他们将会得到“访问受限”的错误消息。
    目录

    目录的权限位和文件有所不同。目录的读权限位意味着可以列出其中的内容。写权限位意味着可以在该目录中创建文件,如果不希望其他用户在你的目录中创建文件,可以取消相应的写权限位。执行权限位则意味着搜索和访问该目录.

    r :可以列出该目录中的文件
    w:可以在该目录中创建或删除文件
    x:可以搜索或进入该目录
    权限文件属主属组用户其他用户

    drwx rwx r- x ( 775 ) 属主读、写、执行,属组读、写、执行,其它组读、执行
    drwx r-x r- - ( 754 ) 属主读、写、执行,属组读、执行,其它组读
    drwx r-x r- x ( 755 ) 属主读、写、执行,属组读、执行,其它组读、执行
    如果把属组用户或其他用户针对某一目录的权限设置为- - x,那么他们将无法列出该目录中的文件。如果该目录中有一个执行位置位的脚本或程序,只要用户知道它的路径和文件名,仍然可以执行它。用户不能够进入该目录并不妨碍他的执行。

    目录的权限将会覆盖该目录中文件的权限。例如,如果目录temp具有如下的权限:

    drwxr--r--  1   admin            0 10月 19 20:16 temp
    而目录下的文件myfile的权限为:

    -rwxrwxrwx  1   admin           0 10月 19 20:16 myfile
    那么admin组的用户将无法编辑该文件,因为它所属的目录不具有这样的权限。

    该文件对任何用户都可读,但由于它所在的目录并未给admin组的用户赋予执行权限,所以该组的用户都将无法访问该目录,他们将会得到“访问受限”的错误消息。



    suid/guid


    1、为什么要使用这种类型的脚本?

    例如有几个着几个大型的数据库系统,对它们进行备份需要有系统管理权限。可以写几个脚本,并设置了它们的g u i d,这样就可以指定的一些用户来执行这些脚本就能够完成相应的工作,而无须以数据库管理员的身份登录,以免不小心破坏了数据库服务器。通过执行这些脚本,他们可以完成数据库备份及其他管理任务,但是在这些脚本运行结束之后,他们就又回复到他们作为普通用户的权限。


    2、查找suid/guid命令

    有相当一些U N I X命令也设置了s u i d和g u i d。如果想找出这些命令,可以进入/ b i n或/ s b i n目录,执行下面的命令:

    $ ls -l | grep '^...s'
    上面的命令是用来查找s u i d文件的;

    $ ls -l | grep '^...s..s'
    上面的命令是用来查找s u i d和g u i d的。


    3、设置UID

    设置s u i d:将相应的权限位之前的那一位设置为4;
    设置g u i d:将相应的权限位之前的那一位设置为2;
    两者都置位:将相应的权限位之前的那一位设置为4+2=6。
    设置了这一位后x的位置将由s代替。
    记住:在设置s u i d或g u i d的同时,相应的执行权限位必须要被设置。
    例如,如果希望设置g u i d,那么必须要让该用户组具有执行权限。

    如果想要对文件l o g i n[它当前所具有的权限为rwx rw- r-- (741)]设置s u i d,,可在使用c h m o d命令时在该权限数字的前面加上一个4,即chmod 4741,这将使该文件的权限变为r w s rw- r - -。

    $ chmod 4741 login
    设置suid/guid的例子

          命令          结果        含义
    chmod 4755   rws r-x r- x   文件被设置了s u i d,文件属主具有读、写和执行的权限,其他用户具有读和执行的权限
    chmod 6711   rws --s --x    文件被设置了s u i d和g u i d,文件属主具有读、写和执行的权限,其他用户具有执行的权限
    chmod 4764   rws rw- r- -   文件被设置了s u i d,文件属主具有读、写和执行的权限,属组用户具有读和执行的权限,用户具有读权限
    4、还可以使用符号方式来设置s u i d / g u i d。如果某个文件具有这样的权限: rwx r-x r- x,那么可以这样设置其s u i d:

    chmod u+s <filename>;
    于是该文件的权限将变为: rws r-x r-x

    在查找设置了s u i d的文件时,没准会看到具有这样权限的文件:rwS r-x r- x,其中S为大写。
    它表示相应的执行权限位并未被设置,这是一种没有什么用处的s u i d设置,可以忽略它的存在。

    注意,c h m o d命令不进行必要的完整性检查,可以给某一个没用的文件赋予任何权限,但chmod 命令并不会对所设置的权限组合做什么检查。因此,不要看到一个文件具有执行权限,就认为它一定是一个程序或脚本。


    chown和chgrp

    当你创建一个文件时,你就是该文件的属主。一旦你拥有某个文件,就可以改变它的所有权,把它的所有权交给另外一个/ e t c / p a s s w d文件中存在的合法用户。可以使用用户名或用户I D号来完成这一操作。

    在改变一个文件的所有权时,相应的s u i d也将被清除,这是出于安全性的考虑。只有文件的属主和系统管理员可以改变文件的所有权。一旦将文件的所有权交给另外一个用户,就无法再重新收回它的所有权。如果真的需要这样做,那么就只有求助于系统管理员了。

    1、c h o w n命令的一般形式为:

    chmod -R -h owner file


    QUOTE:
    - R选项意味着对所有子目录下的文件也都进行同样的操作。
    - h选项意味着在改变符号链接文件的属主时不影响该链接所指向的目标文件。
    2、chown举例

    如:
    # ls -l
    drwxrwxr-x    2 sam      sam          4096 10月 26 19:48 sam
    # chown gem sam
    # ls -l
    drwxrwxr-x    2 gem      sam          4096 10月 26 19:48 sam
    文件sam的所有权现在由用户sam交给了用户gem。


    3、chgrp举例

    c h g r p命令和c h o w n命令的格式差不多,下面给出一个例子。

    # ls -l
    drwxrwxr-x    2 gem      sam          4096 10月 26 19:48 sam
    # chgrp group sam
    # ls -l
    drwxrwxr-x    2 gem      group        4096 10月 26 19:48 sam
    现在把该文件sam所属的组由sam变为group。


    4、找出你所属于的用户组

    如果你希望知道自己属于哪些用户组,可以用ID这个命令:

    # su sam
    $ id
    uid=506(sam) gid=4(adm) groups=4(adm)
    5、找出其他用户所属于的组

    # id
    uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)
    查看当前用户所属组

    # id gem
    uid=507(gem) gid=507(group) groups=507(group),0(root),4(adm)
    查看其它用户所用组:#id 用户名

    # su sam
    $ id gem
    uid=507(gem) gid=507(group) groups=507(group),0(root),4(adm)
    查看其它用户所属组
    这里书上用group,但我试过不能使
    BTW:可以用#cat /etc/passwd和#cat /etc/group直接查看用户和组

    umask

    当最初登录到系统中时, u m a s k命令确定了你创建文件的缺省模式。这一命令实际上和c h m o d命令正好相反。你的系统管理员必须要为你设置一个合理的u m a s k值,以确保你创建的文件具有所希望的缺省权限,防止其他非同组用户对你的文件具有写权限。

    在已经登录之后,可以按照个人的偏好使用u m a s k命令来改变文件创建的缺省权限。相应的改变直到退出该s h e l l或使用另外的u m a s k命令之前一直有效。

    一般来说,u m a s k命令是在/ e t c / p r o f i l e文件中设置的,每个用户在登录时都会引用这个文件,所以如果希望改变所有用户的u m a s k,可以在该文件中加入相应的条目。如果希望永久性地设置自己的u m a s k值,那么就把它放在自己$ H O M E目录下的. p r o f i l e或. b a s h _ p r o f i l e文件中。



    如何计算umask值


    u m a s k命令允许你设定文件创建时的缺省模式,对应每一类用户(文件属主、属组、其他用户)存在一个相应的u m a s k值中的数字。对于文件来说,这一数字的最大值分别是6。系统不允许你在创建一个文本文件时就赋予它执行权限,必须在创建后用c h m o d命令增加这一权限。目录则允许设置执行权限,这样针对目录来说, u m a s k中各个数字最大可以到7。
    该命令的一般形式为:

    umask nnn
    其中n n n为u m a s k置0 0 0 - 7 7 7。

    计算u m a s k值:

    可以有几种计算u m a s k值的方法,通过设置u m a s k值,可以为新创建的文件和目录设置缺省权限。

    与权限位相对应的u m a s k值。

    umask                文件                目录
    0                6                7
    1                 6                6                           
    2                4                5
    3                4                4
    4                2                3
    5                2                2
    6                0                1
    7                0                0
    在计算u m a s k值时,可以针对各类用户分别按上面那张表中按照所需要的文件/目录创建缺省权限查找对应的u m a s k值。
    例如,u m a s k值

    0       6    7
    0       6    7
    2       4    5
    所以002所对应的文件和目录创建缺省权限分别为6 6 4和7 7 5。

    还有另外一种计算u m a s k值的方法。我们只要记住u m a s k是从权限中“拿走”相应的位即可。

    umask                文件                目录
    0                6                7
    1                 6                6                           
    2                4                5
    3                4                4
    4                2                3
    5                2                2
    6                0                1
    7                0                0
    例如,对于u m a s k值0 0 2,相应的文件和目录缺省创建权限是什么呢?

    QUOTE:
    第一步,我们首先写下具有全部权限的模式,即7 7 7 (所有用户都具有读、写和执行权限)。
    第二步,在下面一行按照u m a s k值写下相应的位,在本例中是0 0 2。
    第三步,在接下来的一行中记下上面两行中没有匹配的位。这就是目录的缺省创建权限。
    稍加练习就能够记住这种方法。
    第四步,对于文件来说,在创建时不能具有文件权限,只要拿掉相应的执行权限比特即可。
    这就是上面的例子,其中u m a s k值为0 0 2:

    QUOTE:
    1) 文件的最大权限rwx rwx rwx (777)
    2) umask值为0 0 2 - - - - - - -w-
    3) 目录权限rwx rwx r-x (775) 这就是目录创建缺省权限
    4) 文件权限rw- rw- r-- (664) 这就是文件创建缺省权限
    下面是另外一个例子,假设这次u m a s k值为0 2 2:

    QUOTE:
    1) 文件的最大权限rwx rwx rwx (777)
    2 ) u m a s k值为0 2 2 - - - -w- -w-
    3) 目录权限rwx r-x r-x (755) 这就是目录创建缺省权限
    4) 文件权限rw- r-- r-- (644) 这就是文件创建缺省权限
    如果想知道当前的umask 值,可以使用u m a s k命令:

    #su sam    /*切换到sam用户玩境下
    #umask    /*查看sam的umask
    0022
    前面多了个0,是suid/guid的


    $ touch file1
    $ mkdir file2
    $ ls -l
    总用量 8
    -rw-r--r--    1 sam      adm             0 10月 30 19:27 file1
    drwxr-xr-x    2 sam      adm          4096 10月 30 19:28 file2


    QUOTE:
    新建文件file1和目录file2,查看新建文件和目录的默认权限,umask为022时
    目录权限rwx r-x r-x (755)
    文件权限rw- r-- r-- (644)
    更改umask默认值由022至002

    $ umask 002
    $ touch file3
    $ ls -l
    总用量 12
    -rw-r--r--    1 sam      adm             0 10月 30 19:27 file1
    drwxr-xr-x    2 sam      adm          4096 10月 30 19:28 file2
    -rw-rw-r--    1 sam      adm             0 10月 30 19:34 file3
    drwxrwxr-x    2 sam      adm          4096 10月 30 19:34 file4


    QUOTE:
    可以看到,新建文件和目录的默认权限改变了,umask为002时
    目录权限rwx rwx r-x (775)
    文件权限rw- rw- r-- (664)
    可以看见,$ umask 002已生效


    选项说明

    bash

              -S

    以 "u=rwx,g=rx,o=rx" 这种较人性的格式取代数字显示。


    -p

    当使用 -p 选项,但 mode 省略,输出格式为 umask mode (可以做为下 umask 指令使用)。当模式改变成功,或 mode 参数被省略,执行的状态值为 0。否则状态值为 1。
    实例说明

    bash

    首先,让我们先显示目前环境的 umask 设定情况

    # umask
    0022
    #
    得到的数值为 "0022"。所以,建立新档案的预设权限是 644,目录则是755。如果不习惯看数字,我们可以使用 -S 选项来显示设定值

    # umask -S
    u=rwx,g=rx,o=rx
    #
    实际建个档案与目录看看

    # ls >; fileA
    # mkdir dirB
    # ls -l
    总计 8
    drwxr-xr-x    2 root     root         4096 12月 21 16:42 dirB
    -rw-r--r--    1 root     root            6 12月 21 16:42 fileA
    #
    可以看到文件和目录的不同

    tcsh

    $ umask
    22
    $
    $ umask 000
    $ umask
    0
    $  
    从以上,我们可以知道,tcsh 简单到连 0 都懒的显示...

    要设置 umask 值,使文件所有者具有读写执行权限,属组的其他用户具有只读权限,除此之外的其他用户没有访问权限 (-rw-r-------),请输入以下内容:

    $ umask u=rwx,g=r,o=r
    $ touch file5
    $ mkdir file6
    $ ls -l
    总用量 16
    -rw-r--r--    1 sam      adm             0 10月 30 19:48 file5
    drwxr--r--    2 sam      adm          4096 10月 30 19:48 file6
    要确定当前的 umask 设置,请键入:

    $ umask -S
    u=rwx,g=r,o=r
    符号链接

    存在两种不同类型的链接,软链接和硬链接。修改其中一个,硬连接指向的是节点(inode),而软连接指向的是路径(path)



    软链接文件

      软链接又叫符号链接,这个文件包含了另一个文件的路径名。可以是任意文件或目录,可以链接不同文件系统的文件。和win下的快捷方式差不多。链接文件甚至可以链接不存在的文件,这就产生一般称之为"断链"的问题(或曰“现象",链接文件甚至可以循环链接自己。类似于编程语言中的递归。

    命令格式:

    ln [-s] source_path target_path
    硬链接文件

      info ln 命令告诉您,硬链接是已存在文件的另一个名字,硬连接的命令是

    ln -d existfile newfile


    QUOTE:
    硬链接文件有两个限制

      1、不允许给目录创建硬链接;
      2、只有在同一文件系统中的文件之间才能创建链接。
      对硬链接文件进行读写和删除操作时候,结果和软链接相同。但如果我们删除硬链接文件的源文件,硬链接文件仍然存在,而且保留了愿有的内容。这时,系统就“忘记”了它曾经是硬链接文件。而把他当成一个普通文件。修改其中一个,与其连接的文件同时被修改

    举例 说明:

    $umask 022
    $ cp /etc/httpd/conf/httpd.conf /usr/sam
    原来前面做的试验,改变了系统默认的umask值,现在改回来为022,
    举个httpd.conf文件做例 子

    $ ln httpd.conf httpd1.conf
    $ ln -s httpd.conf httpd2.conf
    第一条为硬链接,第二条为软链接

    $ ls -li


    总用量 80
    1077669   -rw-r--r--    2 sam      adm         34890 10月 31 00:57 httpd1.conf
    1077668  lrwxrwxrwx    1 sam      adm            10 10月 31 00:58 httpd2.conf ->; httpd.conf
    1077669  -rw-r--r--    2 sam      adm         34890 10月 31 00:57 httpd.conf
    可以看到,使用ls -li,软连接只产生了10字节的快捷而已,硬连接却实实在在的的拷贝。最前面的inode硬链接和源文件是一样的,而软链接不一样,具体看一下回复这话有误,但先这么理解,具体请看下面的回复

    对http1.conf进行编辑,可以发现httpd.conf也发生了一样的变化

    $ rm httpd.conf
    现在删除链接的源文件,来比较不同之处

    $ ls -l
    总用量 44
    drw-r--r--    2 sam      adm          4096 10月 30 20:14 file6
    -rw-r--r--    1 sam      adm         34890 10月 31 00:57 httpd1.conf
    lrwxrwxrwx    1 sam      adm            10 10月 31 00:58 httpd2.conf ->; httpd.conf
    发现,httpd2.conf实际已经不存在了,是断链,而httpd1.conf变也了普通文件

    转一个:更好理解

    索引节点、硬连接和连接计数

    索引节点inode:

    QUOTE:
    Linux为每个文件分配一个称为索引节点的号码inode,可以将inode简单理解成一个指针,它永远指向本文件的具体存储位置。系统是通过索引节点(而不是文件名)来定位每一个文件。
    例如:

    假设我们在硬盘当前目录下建立了一个名为mytext文本文件,其内容只有一行:

    This is my file.


    1、当然这行文字一定是存储在磁盘数据区某个具体位置里(物理上要通过磁头号、柱面号和扇区号来描述,在本例中假设分别是1、20、30)。

    2、假设其inode是262457,那么系统通过一段标准程序,就能将这个inode转换成存放此文件的具体物理地址(1磁头、20柱面、30扇区),最终读出文件的内容:“This is my file.”

    3、所以inode是指向一个文件数据区的指针号码,一个inode对应着系统中唯一的一片物理数据区,而位于两个不同物理数据区的文件必定分别对应着两个不同的inode号码。
    文件拷贝命令与硬链接的区别:

    # cp /home/zyd/mytext newfile
    在当前工作目录建立了一个新文件newfile,其实际操作主要包括如下三步:

    QUOTE:
    1、在当前目录中增加一个目录项,其文件名域填入newfile,并分配了一个新的inode,假设是262456。
    2、将原文件(在1磁头、20柱面、30扇区)的内容复制了一份到新的空闲物理块(假设是1磁头、20柱面、31扇区)。
    3、填写一些其他关键信息,使系统通过这些信息及inode号码可以完成物理地址的转换。
    所以文件复制要分配新的inode和新的数据区,虽然两个文件的内容是一样的。


    硬连接hardlink:

    QUOTE:
    我们实际使用文件时一般是通过文件名来引用的。通过上面的讨论,我们知道:

    1个inode号码肯定和一片完全属于一个文件的数据区一一对应。那么一个文件系统中两个或更多个不同的文件名能否对应同一个文件呢?答案是肯定的。

    我们知道inode号码是记录在文件名对应的目录项中的,我们可以使两个或多个文件的目录项具有相同的inode值,实际上就使它们对应着同一个文件。

    有几个目录项具有相同的inode号,我们就说这个文件有几个硬连接(hardlink),

    对于普通文件,ls -l命令的连接计数count域的数值就是本文件拥有的硬连接数。硬连接可以通过ln命令建立,
    例如:

    # ln /home/zyd/mytext hardlink_mytext
    就建立了一个新的文件hardlink_mytext,这个文件的inode同样是262457。建立硬连接实际上只是增加了一个目录项,但并复制文件数据区,原文件的数据区由两个文件共享。这一方面能够节约大量磁盘空间,同时可以保证两个文件能同步更新。

    'ls -il'可以显示文件的inode(在下面最左边):

    262456 -rw-rw-r-- 1 zyd zyd 17 Nov 3 14:52 newfile
    262457 -rw-rw-r-- 2 zyd zyd 17 Nov 3 14:50 hardlink_mytext
    262457 -rw-rw-r-- 2 zyd zyd 17 Nov 3 14:50 mytext
    连接计数count:

    前面我们介绍了,文件的连接计数域表明本系统中共有几个文件目录项的inode和本文件相同,也就是本文件共有几个硬连接。如上面的例子中hardlink_mytext和mytext文件的count值都是2。

    那么对于目录,其count域的含义是什么呢?目录的count同样表示共有多少个目录项指向此目录,不过要详细说明必须进一步解释VFS文件系统的结构,为简单起见,只要这样理解就行了:(count-2)等于本目录包含的直接子目录数(就是只包括儿子,不包括孙子啦!)。

    例如:如果一个目录/abc的count域为5,那么/abc目录一定包含3个子目录。


    QUOTE:
    进一步说明:

    硬连接文件实际上并不是一种新的文件类型,两个文件互为对方的硬连接。它们应该都是普通文件(谁能告诉我:其它类型的文件可以硬连接吗?)。两个文件除了名称或/和文件目录不同外,其它部分完全相同,更改了一个文件,另一个的文件长度、内容、更改时间等都将相应发生变化,更改了一个文件的权限位mode,另一个也会发生同样的变化。


    QUOTE:
    注意连接计数字段count,互为硬连接的两个文件的count值都是2,表明有两个inode指向同一文件的inode。

    当我们删除其中一个文件时,系统首先将(count-1)->;count,如果结果是零,就将其目录项和数据区都删除,否则只将本目录项删除,数据区仍然保留,仍然可以通过另外的文件名访问。根据这个特性,可以通过为重要的文件建立硬连接的方法来防止其被误删除。
    一个文件系统允许的inode节点数是有限的,如果文件数量太多,即使每个文件都是0字节的空文件,系统最终也会因为节点空间耗尽而不能再创建文件。所以当发现不能建立文件时首先要考虑硬盘数据区是否还有空间(可通过du命令),其次还得检查节点空间。

    QUOTE:
    互为硬连接的多个文件必须位于同一个文件系统上。根设备及任何一个需要mount才能挂接进来的分区、软盘、NFS、光驱等都是一个独立的文件系统,每个文件系统有一个相应的设备号,不同文件系统中具有相同inode节 点的文件间没有任何联系。系统则通过设备号和inode号的组合唯一确定一个文件。
    Linux之所以能支持多种文件系统,其实是由于Linux提供了一个虚拟文件系统VFS,VFS作为实际文件系统的上层软件,掩盖了实际文件系统底层的具体结构差异,为系统访问位于不同文件系统的文件提供了一个统一的接 口。

    实际上许多文件系统并不具备inode结构,其目录结构也和以上的讨论不同,但通过VFS,系统均为其提供了虚拟一致的inode和目录项结构。

    所以,'ls -il'命令实际显示的inode应该是VFS inode,也就是说,inode是存在于内存中的数据结构,而不一定是实际的硬盘结构。

    但为Linux量身定做的ext2文件系统具备实际的inode和连接型目录项结构,所以,对于ext2文件系统,可以认为我们上面讨论的关于硬连接的概念是完全正确的。


    關於 permission mode, 我這裡想補充一下:

    permission mode 是存在於 inode block 裡的 12 個 bit.
    當 bit 為 0 時表示關, 1 表示開, 如:
    110111101101

    若這 12 bit 分開4組的話, 分別為如下內容:
    1) suid, sgid, sticky_bit
    2) owner_read, owner_write, owner_exectue
    3) group_read, group_write, group_exectue
    4) others_read, others_write, others_exectue
    按前例來算的, 被打開的 permission 有:
    suid, sgid (110)
    owner_read, owner_write, owner_exectue (111)
    group_read, group_exectue (101)
    others_read, others_exectue (101)

    不過, 在操作上, 我們不不會用 2 進位啦, 一般(視程式而別)可使用 8 進位或 text mode :

    110111101101換算為 8 進位就是 6755 了.
    這個相對簡單多了, 我們可用 bc 來算算看:
    echo "obase=8;ibase=2;110111101101" | bc
    echo "obase=2;ibase=8;6755" | bc
    如果手頭上沒有 bc 或其它工具可用, 那也可用如下的換算表來對照:
    000|0
    001|1
    010|2
    011|3
    100|4
    101|5
    110|6
    111|7
    分別將 12 bit 拆四組來算就是了...(考筆試時最好用了!)

    然而, 換算成 text mode 就沒那麼輕鬆了.
    是因為 text mode 上只能用 9 個字母去表示 12 個 bit .
    需花些心思還是可以的.
    可先從最簡單的右邊 9 個 bit 來算起:
    111101101
    rwxr-xr-x
    不難發現每組都是 rwx , 1 對著就寫相應的 text, 0 就寫 - 了.
    再下來分別找到那三個 x 的位置, 因為:
    suid 若為 1 會修改 owner_x: 以 s 代替 x, 以 S 代替 - .
    sgid 若為 1 會修改 group_x: 以 s 代替 x, 以 S 代替 - .
    sticky_bit 若為 1 會改 others_x: 以 t 代替 x, 以 T 代替 - .
    簡單來說, 若原來的 x 為 1 , 就是小寫, 為 0 則是大寫.
    以上例來說, 最後結果將是:
    110111101101
    rwsr-sr-x

    至於 umask 運算, 也是可從 permission bit 來運算的.
    先抓出 directory 的 default mode: 0777
    及 file 的 default mode: 0666
    然後將 umask bit 的 1 所對的位置設為 0 就是了.
    以 umask 0123 為例吧, 換為 2 進為就是:
    000001010011
    對應 new file 的 0666:
    000110110110
    結果, 凡是 umask 1 的位置都設為 0, 得:
    000110100100
    再轉回 8 進位就是:
    0644

    若你簡單用減法來算的話, 是不對的:
    0666
    -0123
    -------
    0543 (000101100011)

    真的公式可參考這個:
    (bitwise_NOT umask) AND default_mode = new_permission
    上例:
    (bitwise_NOT 0123) AND 0666 = 0644

    計算過程如下:
    000001010011
    bitwise_NOT 得:
    111110101100
    AND
    000110110110
    得:
    000110100100
    換算為 8 進位, 就是:
    0644

    用 2 進位來算是最接近電腦思維的方法, 也是最準確的.
    只是人們一般不習慣 2 進位思維而已, 一旦熟悉之後就萬變不離其宗了!

    至於 file 與 directory 在 rwx 及 suid,sgid, sitcky_bit 上的差異,
    可先參考前面 wingger 版主與相關資料.
    若還是理解不來的話, 我們日後再來慢慢討論好了.

  • 相关阅读:
    vue-fullcalendar插件
    iframe 父框架调用子框架的函数
    关于调试的一点感想
    hdfs 删除和新增节点
    hadoop yarn 实战错误汇总
    Ganglia 安装 No package 'ck' found
    storm on yarn(CDH5) 部署笔记
    spark on yarn 安装笔记
    storm on yarn安装时 提交到yarn失败 failed
    yarn storm spark
  • 原文地址:https://www.cnblogs.com/studio313/p/1245965.html
Copyright © 2020-2023  润新知