chmod维护文件权限

版权声明:自我梳理及总结的内容,如果您需要转载请注明出处,非常感谢! https://blog.csdn.net/Smasegain/article/details/48230469
一.说明
Unix-Based操作系统中文件是否可以执行是通过文件本身的属性来控制的,而在Windows中则必须是.exe的文件。当然, Unix-Based系统的权限实际不止是是否可以执行。本文将着重说明我们常用的权限设置命令--chmod。

二.语法说明
通常情况下,我们多数时候都是用数字来设置权限,但是此处则按照chmod本身说明的顺序先说明字母描述权限的办法来设置权限。

2.1.字母描述权限说明
chmod实际是change mode的缩写,意为改变文件的模式,详细说明:
chmod [OPTION] MODE[,MODE] FILE
OPTION可用选项包含:
  -c:详细输出,仅输出有权限变更的内容;
  -f:屏蔽错误信息;
  -R:递归修改权限,包含子文件及子文件夹
          
MODE可用模式组合:[ugoa...][[+-=][rwxXstugo...]
   ugoa表示文件相关的用户:
   u(user)为文件属主,
   g(group)为文件属组中的用户,
   o(other)不在文件组中的其他用户,
   a(all)表示所有用户,如果不指定关联用户则默认为所有用户( 但是无法覆盖umask设置的权限),范例如下:
      [oracle@shadcplamc02a ~]$ cd test/
      [oracle@shadcplamc02a test]$ umask  
      0022-->umask基于666进行权限设置,本例对应创建的文件权限为:644
      [oracle@shadcplamc02a test]$ ls -ltr
      total 0
      [oracle@shadcplamc02a test]$ touch xxx
      [oracle@shadcplamc02a test]$ ls -ltr
      total 0
       -rw-r--r-- 1 oracle dba 0 Sep  1 10:59 xxx
      [oracle@shadcplamc02a test]$ chmod +w xxx--> 相当于a+w,但是umask为022故相当于权限未做变更
      [oracle@shadcplamc02a test]$ ls -ltr
      total 0
       -rw-r--r-- 1 oracle dba 0 Sep  1 10:59 xxx
      [oracle@shadcplamc02a test]$ chmod o+w xxx-->单独执行o+w可以为其他用户添加成功
      [oracle@shadcplamc02a test]$ ls -ltr
      total 0
       -rw-r--rw- 1 oracle dba 0 Sep  1 10:59 xxx
      [oracle@shadcplamc02a test]$ chmod -w xxx--> 移除w权限,因umask限制,不会修改其他用户的权限
       chmod: xxx: new permissions are r--r--rw-, not r--r--r--
      [oracle@shadcplamc02a test]$ ls -ltr
      total 0
      -r--r--rw- 1 oracle dba 0 Sep  1 10:59 xxx
      [oracle@shadcplamc02a test]$ chmod o-w xxx-->指定o-w可以移除成功
      [oracle@shadcplamc02a test]$ ls -ltr
      total 0
      -r--r--r-- 1 oracle dba 0 Sep  1 10:59 xxx
      [oracle@shadcplamc02a test]$ umask 002-->修改umask为0002
      [oracle@shadcplamc02a test]$ umask
      0002
      [oracle@shadcplamc02a test]$ chmod 644 xxx-->还原文件权限
      [oracle@shadcplamc02a test]$ ls -ltr
      total 0
       -rw-r--r-- 1 oracle dba 0 Sep  1 11:10 xxx
      [oracle@shadcplamc02a test]$ chmod +w xxx--> 再次+w,发现仅umask中设定的其他用户写权限无法添加w权限
      [oracle@shadcplamc02a test]$ ls -ltr
      total 0
       -rw-rw-r-- 1 oracle dba 0 Sep  1 11:10 xxx
               
  [+-=]表示给对应的用户如何设置权限:
    +:表示为指定用户增加某些权限;
    -:表示为某些用户移除某些权限;
    =:表示不管原来权限是什么,直接设置为等号后面点额权限;
               
 [rwxXstugo]为文件对应的权限:
   r(Read,数值对应4):
      文件-->通过vi, cat等工具 查看文件内容;
      文件夹-->可以通过ls查看文件夹中的文件,但是 看不到文件的属性;
                    
   w(Write,数值对应2):
      文件-->可以通过vi等命令编辑文件的内容;
      文件夹-->可以在文件夹下创建或删除文件(也需要x权限),实际上是修改的文件夹的inode;
                    
   x(Execute,数值对应1):
      文件-->可以执行文件;
      文件夹-->可以进入文件夹

   X(Execute):execute only if the file is a directory or already has execute permission for some user-->没测出来.
               
  s(SetUID数值对应4/SetGID数值对应2):
SetUID对于文件--> 1). 必须是二进制文件; 2).文件用户本身需要有x权限(否则S为大写); 3).执行者将具备所有者的权限,passwd就是一个很好的例子因为每个用户都需要调用passwd去修改自己的密码,但是密码相关的的文件(/etc/passwd,/etc/shadow*)只有root可以修改。我们可以看到/usr/bin/passwd这个命令的属性为: -rwsr-xr-x,第四位的s即表示set Uid,且普通用户执行时可以看到程序的执行者是root。将mkdir设置Suid属性则普通用户创建的文件夹为root的所有者和普通用户的组:
        [root@shadcplamc02a ~]# ls -ltr /bin/mkdir
         -rw xr-xr-x 1 root root 31664 Mar 14  2012 /bin/mkdir
        [root@shadcplamc02a ~]# chmod u+s /bin/mkdir
        [root@shadcplamc02a ~]# ls -ltr /bin/mkdir
         -rw sr-xr-x 1 root root 31664 Mar 14  2012 /bin/mkdir
        [oracle@shadcplamc02a app]$ mkdir /app/test1-->切换到Oracle用户创建一个文件夹
        [oracle@shadcplamc02a app]$ ls -ld /app/test1
         drwxrwxr-x 2 root dba 4096 Sep  1 13:30 /app/test1
         :SetUid可以实现类似sudo才能实现的部分功能
               
      SetGID对于文件-->同SetUid一致,以该用户的属组的权限去执行该文件,权限位描述为 -rwxrwsr-x;
                    
      SetGID对于文件夹-->主要特性包含:
           1).如果用户对此目录包含r和x的权限,则用户能够进入此目录;
           2).用户在具备此属性的目录下的有效用户组将会变成该目录的组;
           3).如果用户在文件夹上有w权限,则用户创建的文件及文件夹与此目录的用户组相同。
               
      t(Stick bit数值对应1):
           文件--> Linux内核会忽略文件的粘滞位属性,有的操作系统只有root用户可以设置粘滞位;
           文件夹-->文件夹的粘滞位可以确保在所有人都有读写执行的权限的文件夹下,文件只能被owner或root用户进行重命名,删除等操作, 例如/temp:
                [ncaomon@shadcplamc02a test]$ ls -ld /tmp
                 drwxrwxrwt 14 root root 4096 Sep  1 11:53 /tmp-->所有普通用户都可以在/tmp下维护自己的文件,但是不能删除别人的文件。
            注意:粘滞位设置需要确保原文件/文件夹本身有x权限,否则t将会是大写的(也就是 没有生效),例如:
                [oracle@shadcplamc02a app]$ ls -ld test
                 drwxrwxrw- 2 oracle dba 4096 Sep  1 13:13 test
                [oracle@shadcplamc02a app]$ chmod 1776 test-->第一位的1表示粘滞位,2表示set Gid, 4表示Set Uid
                [oracle@shadcplamc02a app]$ ls -ld test
                 drwxrwxrwT 2 oracle dba 4096 Sep  1 13:13 test
                    
      u(User):将授予文件所有者的权限授予目标用户;
                    [oracle@shadcplamc02a app]$ ls -ltr
                    -rw------- 1 oracle dba   28 Sep  1 11:55 test.log
                    [oracle@shadcplamc02a app]$ chmod u=o test.log
                    [oracle@shadcplamc02a app]$ ls -ltr
                    ---------- 1 oracle dba   28 Sep  1 11:55 test.log
                    
     g(Group):将授予文件组的权限授予目标用户;
               
     o(Other):将授予其他用户的权限授予目标用户;


2.2.数字描述的文件权限
数字的权限主要通过四位数字来描述,例如0055(前面的0可以忽略,相当于常规的55,实际权限---r-xr-x),每一位上的数字都可以为4,2,1三种权限的组合(0为无此权限)
1).第一位的4-->suid,2-->sgid,1-->stick bit;
2).第二位的4-->user的r,2-->user的w,1-->user的x;
3).第三位的4-->group的r,2-->group的w,1-->group的x;
4).第四位的4-->other的r,2-->other的w,1-->other的x;


三.权限设置范例
1).设置当前路径下print.sh文件对于属主有读的权限,对于属组用户有写的权限,对于其他用户有执行的权限:
chmod u=r,g=w,o=x print.sh-->等同于:chmod 421 print.sh
-r---w---x  1 root root     0 Sep  5 21:53 print.sh

2).在范例一的Print.sh的文件添加SUID的权限
chmod u+s print.sh-->等效于:chmod 4421 print.sh
-r-S-w---x  1 root root     0 Sep  5 21:53 print.sh-->大写S是因为该文件对于属主本身没有可执行的权限

猜你喜欢

转载自blog.csdn.net/Smasegain/article/details/48230469
今日推荐