文件权限管理
文件的权限有三种:只读、可写、可执行。
Linux是一个多用户的系统,每个用户在系统中的角色和地位不同,所拥有的权限也不一样,同样一个文件,有的用户可读可写,有的用户则只能进行读操作,无法对其改写。有的文件具有执行权限,可以直接运行,而有的文件则不能。
这些是如何做到的呢?
Linux使用9位字符来表示一个文件的不同权限:
# ls -al
-rwxr-xr-x 1 root root 7348 Oct 10 08:40 a.out
drwxr-xr-x 2 root root 4096 Oct 10 08:44 dir
-rwxr-xr-x 1 root root 37 Oct 10 07:52 hello.sh
-rw-r--r-- 1 root root 83 Oct 10 08:40 main.c
一个文件一般都有一个唯一的所有者(owner),谁创建了这个文件,一般谁就是这个文件的所有者。文件的所有者一般对文件有读、写和执行的权限。
Linux分别使用r、w、x表示一个文件的读、写、执行权限,分别对应数字是1、2、4。对应符号位上的-表示当前用户没有该权限。文件的所有者对文件的权限最大,所以一般是rwx。所有者权限为前面还有一个字符位用来表示文件类型,d是目录,-是普通文件。
在一个公司项目中,一般都是团队开发,假设你创建的一个文件main.c,项目组的其他同事可能也会修改它,那该如何设置呢?很简单,可以创建一个用户组,把项目团队里的用户都拉进这个用户组里,赋予这个用户组写的权限,那么,所有属于这个用户组的用户都可以修改这个文件了。而对于公司里的其他用户,为了安全起见,只赋予他们只读权限就可以了:可以阅读和访问这个文件,但是无法更改。
在Linux系统中,一个用户必须有一个自己的组,所有的用户都是按组分类的,一个用户可以属于一个单人组,也可以同时属于多个组。就和人类一样,你可以同时是骑行协会和围棋社的成员,如果你什么社团都不加,你本身也有一个组,你是这个组的唯一成员。
在Linux系统下,对于每一个普通用户,如wit,对应目录/home/wit下的文件都是wit用户创建的,文件的所有者和所属群组都是wit,wit用户对该目录下的文件有读和写的权限,其它普通用户则只有读的权限。
# pwd
/home/wit
# ls -al
drwxr-xr-x 2 wit wit 4096 Jun 19 2017 Music
drwxr-xr-x 2 wit wit 4096 Jun 19 2017 Pictures
-rw-r--r-- 1 wit wit 675 Jun 19 2017 .profile
drwxr-xr-x 2 wit wit 4096 Jun 19 2017 Public
-rw-r--r-- 1 wit wit 0 Jun 19 2017 .sudo_as_admin_successful
drwxr-xr-x 2 wit wit 4096 Jun 19 2017 Templates
drwxr-xr-x 2 wit wit 4096 Jun 19 2017 Videos
-rw------- 1 wit wit 4526 Oct 8 13:38 .viminfo
-rwxr--r-- 1 wit wit 8400 Jul 9 2019 .vimrc
-rw------- 1 wit wit 51 Oct 9 18:16 .Xauthority
-rw------- 1 wit wit 201 Oct 9 18:16 .xsession-errors
而在Linux其它目录下的文件,如Linux根目录下的文件和目录,都是root用户创建的,文件的所有者和所属群组都是一般都是root,除了root用户,其它普通用户只有读的权限。
# pwd
/
# ls -al
total 112
drwxr-xr-x 23 root root 4096 Oct 9 11:56 .
drwxr-xr-x 23 root root 4096 Oct 9 11:56 ..
drwxr-xr-x 2 root root 4096 Oct 9 11:54 bin
drwxr-xr-x 3 root root 4096 Oct 9 11:56 boot
drwxrwxr-x 2 root root 4096 Jun 19 2017 cdrom
drwxr-xr-x 18 root root 4040 Oct 9 16:06 dev
drwxr-xr-x 134 root root 12288 Oct 9 16:01 etc
drwxr-xr-x 9 root root 4096 Oct 10 07:51 home
drwxr-xr-x 23 root root 4096 Oct 9 11:53 lib
drwx------ 2 root root 16384 Jun 19 2017 lost+found
drwxr-xr-x 3 root root 4096 Apr 21 2016 media
drwxr-xr-x 2 root root 4096 Apr 21 2016 mnt
drwxr-xr-x 3 root root 4096 Jun 19 2017 opt
dr-xr-xr-x 197 root root 0 Oct 9 15:56 proc
drwx------ 8 root root 4096 Oct 10 09:41 root
drwxr-xr-x 28 root root 960 Oct 10 07:48 run
drwxr-xr-x 2 root root 12288 Oct 9 11:54 sbin
drwxr-xr-x 2 root root 4096 Feb 16 2020 snap
drwxr-xr-x 2 root root 4096 Apr 21 2016 srv
dr-xr-xr-x 13 root root 0 Oct 10 07:51 sys
drwxrwxrwt 14 root root 12288 Oct 10 09:17 tmp
drwxr-xr-x 13 root root 4096 Jun 19 2017 usr``
drwxr-xr-x 14 root root 4096 Apr 21 2016 var
因为root用户是一个具有超级权限的用户,对所有的文件都有最高读写权限,所以对于普通用户创建的文件,虽然所有者和所属组都不包含root,但root仍然对其有读、写的权限。
用户可以通过chmod命令来更改一个文件的读写权限,通过chomd +数字,重新设置9个符号位,来修改不同用户和组对该文件的读写权限(读4:、写:2、执行:1)。
# chomd 666 main.c 将main.c文件设置为所有人可读写
# touch test.sh
# ll test.sh
-rw-r--r-- 1 root root 0 Oct 10 09:51 test .sh
# chmod +x test.sh 给test.sh添加可执行权限
# ll test.sh
-rwxr-xr-x 1 root root 0 Oct 10 09:51 test.sh
我们在root账户下创建了test.sh文件,所以test.sh文件的所有者和所属组都是root,我们也可以通过chown来更改文件的所有者、所属组。
# chown wit test.sh 更改文件的owner
# ll test.sh
-rwxr-xr-x 1 wit root 0 Oct 10 09:51 test.sh
# chown wit:wit test.sh 更改文件的owner和groups
# ll test.sh
-rwxr-xr-x 1 wit wit 0 Oct 10 09:51 test.sh