Linux 文件和文件夹的操作权限

730 查看

由于 linux 是多用户操作系统,所以基于安全的考虑,需要具备保障个人隐私和系统安全的机制。因此在使用 linux 系统的时候,经常会出现权限的问题(比如: 删除文件、安装软件、运行应用等等),期初遇到这些问题的时候,大部分都使用sudo或者是sudo chmod 777 file(后面会讲解这个命令)来解决的。虽然这种方式可以解决问题,但是这样是不安全的,特别是在服务器上操作的时候,因为不是所有的文件和文件夹都可以被其它用户操作的,不是所有的用户都有root权限的,不是所有的应用都可以用root用户启动的。那么我们要如何正确的处理这些权限问题呢?那就让我们来学习一下 linux 权限相关的知识。

用户的权限

要确定一个用户对某个文件或文件夹是否具有相应的操作权限,先要明确该用户与文件或文件夹之间的关系。在 linux 系统中,定义了如下三种关系:

  • 文件或文件夹的所有者 (owner):文件或文件夹的拥有者,开始创建文件或文件夹时为创建者。

  • 组 (group):文件或文件夹所属的组, 开始创建文件或文件夹时为创建者的所属的组。

  • 其他人 (other):除了文件或文件夹的所有者和文件或文件夹所属的组的其他成员,剩下的 linux 的用户。

因为在 linux 下的文件和文件夹都有读取(r)写入(w)执行(x)的操作,所以上面描述的每种关系的用户分别都可以赋予这些操作权限。操作权限介绍:

权限 简写 对普通文件的作用 对文件夹的作用
读取 r 查看文件内容 列出文件夹中的文件(ls)
写入 w 修改文件内容 在文件夹中删除、添加或重命名文件(夹)
执行 x 文件可以作为程序执行 cd 到文件夹

文件或文件夹和用户的三种关系的基础操作权限

在 linux 使用ls -la命令可以查看文件夹内文件的属性,下面是我电脑上某个文件夹下文件的属性:

$ ls -la
drwxr-xr-x 14 root root     4096 Apr  3 18:47 .
drwxr-xr-x 23 root root     4096 Mar  2 05:48 ..
drwxr-xr-x  2 root root     4096 Apr  3 07:44 backups
drwxr-xr-x 17 root root     4096 Jul 22  2014 cache
drwxr-xr-x  2 root root     4096 Mar  2 04:26 docker-registry
lrwxrwxrwx  1 root root        9 Feb 25 13:31 lock -> /run/lock
drwxrwxr-x 15 root syslog   4096 Apr  3 07:44 log
-rw-r--r--  1 root root        0 Apr  3 18:47 test
  • 上面的有九列数据,第一列数据表示和文件或文件夹相应关系用户的操作权限,第二列表示文件夹内文件和文件夹的总数量(包括文件夹本身),第三列表示文件夹或文件的拥有者,第四列表示文件或文件夹的所属的组,第五列表示文件或文件夹的大小,第六、七、八列表示文件或文件夹最后被修改的时间,第九列文件或文件夹的名字。

  • 接下主要分析第一列的数据,在上面的信息中倒数第二行drwxrwxr-x,从左到右第一个字母表示文件系统对象的类别,这里d表示为目录(文件夹)。其它文件系统对象:

-(常规文件)、d(目录)、l(符号链接)、c(字符特殊设备)、b(模块特殊设备)、p(FIFO)、s(套接字)

  • drwxrwxr-x除出去第一个字母d后的rwxrwxr-x表示的是三种用户关系对文件或文件夹的操作权限。从左到右每三个一组,依次表示所有者权限、组权限、其他用户权限。每组的顺序均为rwx,如果用户有相应的操作权限就用相应的字母表示,如果不具有相应的操作权限就用-表示。比如: rwxrwxr-x表示文件或文件夹的所有者具有rwx(可读,可写,可执行)的操作权限,组用户也具有rwx(可读,可写,可执行)的权限,其他用户具有r-x(可读,可执行,没有可读)的操作权限。

特殊权限SUIDSGIDSticky

在 linux 系统中还有三种与用户身份无关的三个文件权限属性。即SUID、SGID和Sticky

  • SUID(Set User ID, 4):

该属性只对有执行权限的文件有效,对目录无效。执行具有SUID权限的程序时,引发的进程的所有者是程序文件的所有者,而不是启动程序的用户(除非二者是同一个人)。比如,如果一个程序的所有者是root且具有SUID属性,一个普通用户执行此程序时,如同root执行此程序一样。(请注意该属性对Shell脚本程序无效)该属性为一些特殊程序(如lpr)的启动带来了方便。但有时也带来了安全隐患:比如一个具有SUID属性的程序如果在执行时运行了一个shell,那么用户可以籍此得到系统的最高权限。SUID可用s表示,如:

$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 47032 Feb 16  2014 /usr/bin/passwd
  • SGID(Set Group ID, 4):

对于可执行文件,SGIDSUID类似,引发的进程的所有组是程序文件所属的组。对于目录,SGID属性会使目录中新建文件的所属组与该目录相同。SGID也可以用s表示,如:

$ ls -l /var
drwxrwsr-x  2 root staff    4096 Apr 10  2014 local
drwxrwxr-x 15 root syslog   4096 Apr  4 19:57 log
  • Sticky, 1:

仅对目录有效。带sticky属性的目录下的文件或目录可以被其拥有者删除或改名。常利用sticky属性创建这样的目录:组用户可以在此目录中创建新文件、修改文件内容,但只有文件所有者才能对自己的文件进行删除或改名。如系统中的/tmp文件夹。在属性字符串中,通常用t表示。

$ ls -l /
drwxrwxrwt   8 root root  4096 Apr  4 23:57 tmp

修改文件或文件夹对应用户的操作权限

在 linux 系统中,可以使用chmod命令来修改文件或文件夹对应用户的操作权限,chmod命令也有两种方式修改,一种是使用代表相应操作权限的字母简写表示,另一种是使用代表相应操作权限的数字表示。

  • 使用简写字母

chmod语法参数格式: ugoa[rwxst]
第一个字符是u、g、 o 或 a 中的一个(分别表示用户、组、其他人和所有人)。还可以选择添加(+)、删除(-)或设置(=)各种不同权限。

    • 给文件或文件夹try的拥有者加可执行权限

    $ sudo chmod u+x try
    • 给文件或文件夹try的拥有者和组成员加可读可写权限

    $ sudo chmod ug+rw try
    • 给文件或文件夹try的拥有者和组成员除去可写权限

    $ sudo chmod ug-r try
    • 使用数字表示(八进制数)

    为了简化表述,也可使用八进制数来表示权限。即用一个四位八进制数来表示,其中最高位表示特殊权限,随后的三位依次是所有者权限、组权限和其他人权限。每一个八进制位的权限数值是文件具有的相应权限所对应的数值之后,如:

    0755=rwxr-xr-x=0(4+2+1)(4+0+1)(4+0+1)

    数值权限的算法,比如rw-其实就是110的二进制,也就是0*2^0 + 1*2^1 + 1*2^2 = 6。有相应的权限就用1表示,没有相应的权限就用0表示。不过这种算法特殊权限不包含在内。

    • 给文件或文件夹try的拥有者加rwx权限,组用户加r-x权限,其他用户r--权限

      $ sudo chmod 0754 try
    • chmod命令也可以递归的修改文件夹下所有的文件的权限,如给 try 文件夹下得所有文件加上 0755 权限

      $ sudo chmod -R 0755 try
    • 批量只修改文件或文件夹权限

      $ find -type d|xargs chmod 745     // 只修改文件夹权限
      $ find -type f|xargs chmod 644     // 只修改文件权限
      // 或者
      $ chmod 745 `find 路径 -type d`     // 只修改文件夹权限
      $ chmod 644 `find 路径 -type f`    // 只修改文件权限
    • 相应权限的数值:

    • rwx(7)、rw-(6)、r-x(5)、r--(4)、--wx(3)、-w-(2)、--x(1)、---(0)

    • suid: 符号s(4)

    • sgid: 符号s(2)

    • sticky: 符号t(1)

    修改文件或文件夹的拥有者和所属的组

    使用chown可以修改文件或文件夹的拥有者和所属的组。

    • 将文件或文件夹try的拥有者修改成aikin,所属的组修改成adm

      $ sudo chown aikin:adm try
    • chmod一样,-R参数可以起到递归的作用

      $ sudo chown -R aikin:adm try

    创建组和用户

    • 组相关操作:

      • 创建一个try

      $ sudo groupadd  try
      • 修改try组的名字为rename-try

      $ sudo groupadd -n rename-try try
      • 修改try组的名字为rename-try

      $ sudo groupadd -n rename-try try
      • 删除try2

      $ sudo groupdel  try2
      • 查看所有组

      $ sudo cat /etc/group
    • 用户相关操作:

      • 创建用户test

    在 linux 系统上虽然可以使用useraddadduser来创建用户,但是这两个命令是有区别的。

    1. 使用useradd时,如果后面不添加任何参数选项,例如:$sudo useradd test创建出来的用户将是默认“三无”用户:一无Home Directory,二无密码,三无系统Shell。

    2. 使用adduser时,创建用户的过程更像是一种人机对话,系统会提示你输入各种信息,然后会根据这些信息帮你创建新用户。
      下面创建用户使用的是adduser命令:

    $ sudo adduser test
    Adding user `test' ...
    Adding new group `test' (1002) ...
    Adding new user `test' (1001) with group `test' ...
    Creating home directory `/home/test' ...
    Copying files from `/etc/skel' ...
    Enter new UNIX password:
    Retype new UNIX password:
    passwd: password updated successfully
    Changing the user information for test
    Enter the new value, or press ENTER for the default
      Full Name []: test
      Room Number []:
      Work Phone []:
      Home Phone []:
      Other []:
    Is the information correct? [Y/n] y
    • 修改用户

      $ sudo passwd test    // 修改用户密码
      $ sudo usermod -d /home/test -G try2 test   // 将test用户的登录目录改成/home/test,并加入 try 组,注意这里是大 G。
      $ sudo gpasswd -a test try     // 将用户 test 加入到 try2 组。
      $ sudo gpasswd -d test try2    // 将用户 test 从 try 组中移除
    • 删除用户test

      $ sudo userdel test
    • 查看所有用户

      $ cut -d : -f 1 /etc/passwd
      // 或者
      $ cat /etc/passwd |awk -F \: '{print $1}'

      了解 linux 用户操作权限,安全就掌握在手中。

    参考

    原文链接