4.2 Linux中的文件管理

与Windows通过盘符管理各个分区不同,Linux把所有文件和设备都当作文件来管理,这些文件都在根目录下,同时Linux中的文件名区分字母的大小写。本节主要介绍文件的属性和权限管理。

4.2.1 文件的类型

Linux系统是一种典型的多用户系统,不同的用户处在不同的地位,拥有不同的权限。为了保护系统的安全性,对于同一资源来说,不同的用户具有不同的权限,Linux系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定。示例4-2用于认识Linux系统中的文件类型。

【示例4-2】

在示例4-2的输出代码中:

● 第1列表示文件的类型,如表4.1所示。

● 第2列表示文件权限。例如,文件权限是“rw-r--r--”,表示文件所有者可读、可写,文件所归属的用户组可读,其他用户可读此文件。

● 第3列为硬链接个数。

● 第4列表示文件所有者,就是文件属于哪个用户。

● 第5列表示文件所属的组。

● 第6列表示文件大小,通过选项h可以显示为可读的格式,如K/M/G等。

● 第7列表示文件修改时间。

● 第8列表示文件名或目录名。

表4.1 Linux文件类型

4.2.2 文件的属性与权限

为了系统的安全性,Linux为文件赋予了3种属性:可读、可写和可执行。在Linux系统中,每个文件都有唯一的属主,同时Linux系统中的用户可以属于同一个组,通过权限位的控制定义了每个文件的属主,同组用户和其他用户对该文件具有不同的读、写和可执行权限。

● 读权限:对应标志位为“r”,表示具有读取文件或目录的权限,对应的使用者可以查看文件内容。

● 写权限:对应标志位为“w”,用户可以变更此文件,比如删除、移动等。写权限依赖于该文件父目录的权限设置。示例4-3说明了即使文件其他用户权限标志位为可写,其他用户仍然不能操作此文件。

【示例4-3】

● 可执行权限:对应标志位为“x”,一些可执行文件(比如C程序)必须有可执行权限才可以运行。对于目录而言,可执行权限表示其他用户可以进入此目录,如目录没有可执行权限,则其他用户不能进入此目录。

注意

文件拥有执行权限才可以运行,比如二进制文件和脚本文件。目录文件要有执行权限才可以进入。

在Linux系统中文件权限标志位由3部分组成。例如,在“-rwxrw-r--”中,第1位表示普通文件,然后“rwx”表示文件属主具有可读可写可执行的权限,“rw-”表示与属主属于同一组的用户就有读写权限,“r--”表示其他用户对该文件只有读权限。“-rwxrwxrwx”为文件最大权限,对应编码为777,表示任何用户都可以读写和执行此文件。

4.2.3 改变文件所有权

一个文件属于特定的所有者,如果更改文件的属主或属组可以使用chown和chgrp命令。那么chown命令可以将文件变更为新的属主或属组,只有root用户或拥有该文件的用户才可以更改文件的所有者。如果拥有文件但不是root用户,那么只可以将组更改为当前用户所在的组。chown常用参数说明如表4.2所示。

表4.2 chown常用参数说明

chown经常使用的参数为“R”参数,表示递归地更改目录文件的属主或属组。更改时可以使用用户名或用户名对应的UID。操作方法如示例4-4所示。

【示例4-4】

  [root@localhost ~]# useradd  test
  [root@localhost ~]# mkdir /data/test
  [root@localhost ~]# ls -l  /data|grep test
  drwxr-xr-x. 2 root root  4096 Jun  4 20:39 test
  [root@localhost ~]# chown -R test.users /data/test
  [root@localhost ~]# ls -l  /data|grep test
  drwxr-xr-x. 2 test users  4096 Jun  4 20:39 test
  [root@localhost ~]# su - test
  [test@localhost ~]$ cd /data/test
  [test@localhost test]$ touch file
  [test@localhost test]$ ls -l
  total 0
  -rw-rw-r--. 1 test test 0 Jun  4 20:39 file
  [test@localhost test]$ chown root.root file
  chown: changing ownership of `file': Operation not permitted
  [root@localhost ~]# useradd test2
  [root@localhost ~]# grep test2 /etc/passwd
  test2:x:502:502::/home/test2:/bin/bash
  [root@localhost ~]# mkdir /data/test2
  #按用户ID更改目录所有者
  [root@localhost ~]# chown -R 502.users /data/test2
  [root@localhost ~]# ls -l /data/|grep test2
  drwxr-xr-x. 2 test2 users  4096 Jun  4 20:44 test2
  #更改文件所有者
  [root@localhost test]# chown test2.users file
  [root@localhost test]# ls -l file
  -rw-rw-r--. 1 test2 users 0 Jun  4 20:39 file

Linux系统中chgrp命令用于改变指定文件或目录所属的用户组。使用方法与chown类似,此处不再赘述。chgrp命令的操作方法如示例4-5所示。

【示例4-5】

  #更改文件所属的用户组
  [root@localhost test]# ls -l file
  -rw-rw-r--. 1 test test 0 Jun  4 20:39 file
  [root@localhost test]# groupadd testgroup
  [root@localhost test]# chgrp  testgroup file
  [root@localhost test]# ls -l file
  -rw-rw-r--. 1 test testgroup 0 Jun  4 20:39 file

4.2.4 改变文件权限

chmod是用来改变文件或目录权限的命令,可以将指定文件的拥有者改为指定的用户或组。其中,用户可以是用户名或用户ID;组可以是组名或组ID;文件是以空格分开的要改变权限的文件列表,支持通配符。只有文件的所有者或root用户可以执行,普通用户不能将自己的文件更改成其他的拥有者。更改文件权限时u表示文件所有者,g表示文件所属的组,o表示其他用户,a表示所有。通过它们可以详细控制文件的权限位。chmod除了可以使用符号更改文件权限外,还可以利用数字来更改文件权限。“r”对应数字4,“w”对应数字2,“x”对应数字1,如可读写则为4+2=6。chmod常用参数如表4.3所示,操作方法如示例4-6所示。

表4.3 chmod命令常用参数说明

【示例4-6】

  #新建文件test.sh
  [test2@localhost ~]$ cat test.sh
  #!/bin/sh
  echo "Hello World"
  #文件所有者没有可执行权限
  [test2@localhost ~]$ ./test.sh
  -bash: ./test.sh: Permission denied
  [test2@localhost ~]$ ls -l test.sh
  -rw-rw-r-- 1 test2 test2 29 May 30 19:39 test.sh
  #给文件所有者加上可执行权限
  [test2@localhost ~]$ chmod u+x test.sh
  [test2@localhost ~]$ ./test.sh
  #设置文件其他用户不可以读
  [test2@localhost ~]$ chmod o-r test.sh
  [test2@localhost ~]$ logout
  [root@localhost test1]# su - test1
  [test1@localhost ~]$ cd /data/test2
  [test1@localhost test2]$ cat test.sh
  cat: test.sh: Permission denied
  #采用数字设置文件权限
  [test2@localhost ~]$ chmod 775 test.sh
  [test2@localhost ~]$ ls -l test.sh
  -rwxrwxr-x 1 test2 test2 29 May 30 19:39 test.sh
  #将文件 file1.txt 设为所有人都可读取
  [test2@localhost ~]$ chmod ugo+r file1.txt
  #将文件 file1.txt 设为所有人都可读取
  [test2@localhost ~]$ chmod a+r file1.txt
  #将文件 file1.txt 与 file2.txt 设为文件拥有者,与其所属同一群体者可写入,其他人不可写入
  [test2@localhost ~]$ chmod ug+w,o-w file1.txt file2.txt
  #将 ex1.py 设定为只有文件拥有者可以执行
  [test2@localhost ~]$ chmod u+x ex1.py
  #将当前目录下的所有文件与子目录都设为任何人可读取
  [test2@localhost ~]$chmod -R a+r *
  #收回所有用户对file1的执行权限
  [test2@localhost ~]$chmod a-x file1