秒懂Linux文件权限及chmod命令

【版权申明】非商业目的注明出处可自由转载
出自:shusheng007

概述

去年把自己的阿里云服务器从Windows系统换成了 Ubuntu(一个Linux发行版本)。自己一直是使用Windows的,一直觉得Linux过于高深,自己非常抗拒去了解它,这次自己的服务器换成的Linux所以只能被动去了解了。

任何事物的流行都是存在原因的,Linux那么流行,肯定是有其独到的优势的,那些站在门外面的人肯定觉得自己现在使用东西是最好的,等真的推开门进去后却发现,原来世界上还有更好的,所以我们程序员要不轻易否定新事物,乐于接受新事物,用于尝试新事物,才能不落后。

嘚嘚了这么多,今天想总结一下关于Linux文件权限的一些知识,及相关命令。别害怕,书生的文章力求让人秒懂。

Linux 安全体系简述

Linux 是以用户账户来管理权限的,每个进入Linux系统的用户都会被分配唯一的用户账户,每个账户拥有不同的权限,这个应该非常容易理解。

例如组长王二狗的账户A 权限肯定比实习生牛翠花的账户B 权限高。账户系统虽然在控制单个用户安全性时很好用,但是涉及到共享资源的一组用户时就比较尴尬了,例如公司又招了个一个实习生“上官无雪” 公司给他分配了账户C, 但是日常工作中,牛翠花和上官无需都需要操作同一组资源,那么就要分别给这两个账户增删权限,这只有两个实习生账户还好,但是以后账户多了可就不好管了,所以Linux还有组(group)的概念,在同一组的账户可以享有此组的所有权限。

账户

  1. 系统管理员账户(root)
    root是系统中唯一的超级用户,具有系统中所有的权限,如启动或停止一个进程,删除或增加用户,增加或者禁用硬件等等。
  2. 系统账户
    Linux为满足自身系统管理所内建的账号,通常在安装过程中自动创建,不能用于登录操作系统。
  3. 自定义账户
    由root管理员创建供用户登录系统进行操作使用的账号

  1. 用户的主要组(primary group):一个用户必须属于一个且只有一个主要组
  2. 用户的附加组(supplementary group):一个用户可以属于一个或者零个附加组

查看账户

账户信息位于/etc/passwd文件内,使用如下命令查看

cat /etc/passwd

结果如下:

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
...
mysql:x:109:118:MySQL Server,,,:/nonexistent:/bin/false
tomcat:x:1000:1000::/opt/tomcat:/bin/false

我们看下root账户每一列的含义,如下图所示:

在这里插入图片描述
注册名:口令:用户标识号(uid):组标识号(gid):注释性描述:用户主目录:用户登陆的shell类型

  1. 注册名(username):用于区分不同的用户,例如root。
  2. 口令(password): 为了安全起见密码被加密存在/etc/shadow 中,只显示一个x
  3. 用户标识(uid):是一个整数,系统内部用它来标识用户, root 的uid是0。
  4. 组标识(gid):当前用户的工作组标识。
  5. 注释(comment):对此账户的一些描述。
  6. 用户主目录(home directory):是用户的起始工作目录,它是用户在登录到系统之后所处的目录。
  7. shell类型(shell used):用户登录后,要启动一个进程,负责将用户的操作传给内核,这个进程是用户登录到系统后运行的命令解释器或某个特定的程序,即Shell。Shell是用户与Linux系统之间的接口

查看组

账户信息位于/etc/group文件内,使用如下命令查看

cat  /etc/group

结果如下:

root:x:0:
sudo:x:27:
...
mysql:x:118:
tomcat:x:1000:

我们看下root账户每一列的含义,如下图所示:

在这里插入图片描述
含义图中已经标记的很清晰了。

理解文件权限

上面之所以要嘚嘚那么多Linux用户和组的知识,主要是因为不明白上面的知识,下面再怎么讲都是一团浆糊。

那么一个文件的权限是指什么呢?目录的权限呢?

  • 文件的权限分为:是否可读,是否可写,是否可执行,即 rwx
  • 目录的权限分为:是否可进入,是否可以读/写、执行其内部的文件.

这些权限又被分为了3类:

  1. 文件拥有者
  2. 文件所属的组
  3. 其他账户

使用 ls -l 命令查看一个目录下的所有文件
例如我查看一下我服务器上tomcat目录下的文件

/opt/tomcat# ls -l
drwxrwx--- 2 tomcat tomcat  4096 Apr  5 16:09 bin
-rw-r----- 1 root   tomcat 18982 Dec  8 00:46 BUILDING.txt
drwxrwx--- 2 root   tomcat  4096 Jan 11 18:11 conf
-rw-r----- 1 root   tomcat  5409 Dec  8 00:46 CONTRIBUTING.md
drwxrwx--- 2 root   tomcat  4096 Jan 11 13:57 lib
-rw-r----- 1 root   tomcat 57092 Dec  8 00:46 LICENSE
drwxrwx--- 3 tomcat tomcat 12288 Apr  6 00:31 logs
-rw-r----- 1 root   tomcat  2333 Dec  8 00:46 NOTICE
-rw-r----- 1 root   tomcat  3255 Dec  8 00:46 README.md
-rw-r----- 1 root   tomcat  6898 Dec  8 00:46 RELEASE-NOTES
-rw-r----- 1 root   tomcat 16262 Dec  8 00:46 RUNNING.txt
drwxr-x--- 2 tomcat tomcat  4096 Apr  5 10:10 temp
drwxrwx--- 9 tomcat tomcat  4096 Apr  5 12:49 webapps
drwxr-x--- 3 tomcat tomcat  4096 Jan 11 14:11 work

看到最左边一列了吗,我第一次接触的时候太懵逼了,完全不知道什么意思,-rw-r—– 什么jb玩意啊?弄懂了也就不难了,让我们一起来看一下:

总共10个字符:

第一个字符表示文件的性质:

  • - :表示此行展示的是一个文件
  • d:表示此行展示的是一个目录

第2到4个字符表示此文件所有者对此文件的权限
第5到7个字符表示此文件所属于的组里面的账户对此文件的权限
第8到10个字符表示除了上面两类型的其他用户对此文件的权限
其中

  • r (read):可读,文件可以被查看。
  • w(write): 可写,文件可以被修改,删除。
  • x(execute):可执行,如果文件是脚本活程序,可以被执行。
  • - :无以上权限

我们来举个例子:

-rw-r----- 1 root   tomcat 57092 Dec  8 00:46 LICENSE

上面的语句表明,LICENSE 是一个文件,其可以被其所有者读写,但不能执行。其仅仅可以被所属的组的用户查看,对于其他用户无权查看、修改、执行此文件。

修改文件的权限

终于到了chmod命令出场的时候了,我不会刻板的讲述此命令的各种参数,那是文档应该干的事情,依据二八定律,我们只讲那个八,就是最常使用的情形。

chmod 概述

使用chmod 来修改权限,我们需要告诉此命令如下几个关键信息:

  • Who:我们在为谁设置权限
  • What:我们要增加还是移除这些权限
  • Which: 我们要修改哪些权限

我们来举个例子

使用 ls -l 命令查看filePermissionTest.txt 文件

-rw-r--r-- 1 root root 12 Apr  5 09:23 filePermissionTest.txt

可以看到其所有者对其具有读写权限,下面我们使用下面的命令给此用户加上可执行权限。

chmod u+x filePermissionTest.txt

执行后查看结果如下:

-rwxr--r-- 1 root root 12 Apr  5 09:23 filePermissionTest.txt

可见此文件所有者权限的标识已经从rw-变成了rwx了,说明其已经拥有了此文件的执行权限。

我们看一下 chmod u+x filePermissionTest.txt 这个命令是怎么起作用的:
who:u 表示是为此文件的用户设置权限
what:+ 表示是为此文件增加一个权限
which:x 表示要修改可执行权限

可见只要按照chmod who what which 来来使用这个命令就会变得很简单。那接下来的问题就是who、what、which 分别取什么值了。

常用参数

who

  • u:User, 此文件的所有者
  • g:Group, 此文件所属的组
  • o:Others, 其他用户
  • a:All,为以上三种用户设置权限

如果who 被省略了的话,默认使用a.

what

  • -: 减号,表示移除权限
  • +:加号,表示增加权限
  • =:等号,表示设置此权限并移除其他权限

which

  • r: Read, 可读权限
  • w: Write,可写权限
  • x: execute,可执行权限

如果理解了上面的内容就足以应对日常工作中的使用情形了。

实例

下面我们来实际操作一下,毕竟理论和实践直接往往隔着巨大的鸿沟!

假设我有如下3个文件

-rw-r--r-- 1 root root  2 Apr  6 20:04 filePermissionTest2.txt
-rwxr--r-- 1 root root 12 Apr  5 09:23 filePermissionTest.txt
-rw-r--r-- 1 root root 12 Apr  6 20:04 helloLinux.html

修改单个文件权限

我要给helloLinux.html 文件所属于的组(root组)加上写权限

chmod g+w helloLinux.html

执行后的结果为

-rw-rw-r-- 1 root root 12 Apr  6 20:04 helloLinux.html

其已经从-rw-r--r--变成了-rw-rw-r--,说明写权限已经加上了。

修改多个文件权限

我一次性为others用户增加对后缀为.txt的文件的写权限

chmod o+w *.txt

结果:

-rw-r--rw- 1 root root  2 Apr  6 20:04 filePermissionTest2.txt
-rwxr--rw- 1 root root 12 Apr  5 09:23 filePermissionTest.txt
-rw-rw-r-- 1 root root 12 Apr  6 20:04 helloLinux.html

数字速记法

当我想修改文件权限的时候就google了一下,看到chmod 776 xxx的命令一脸懵逼,776是什么东东?
其实这是rxw的数字简记法。其值如下所示,0到7的数字就代表了rxw的所有组合

权限 二进制 十进制 描述
– – – 000 0 无权限
– -x 001 1 只有执行权限
-w- 010 2 只有写入权限
-wx 011 3 写和执行权限
r- – 100 4 读权限
r-x 101 5 读取和执行的权限
rw- 110 6 读取和写入的权限
rwx 111 7 所有权限

例如上面chmod 776 xxx 的命令表示为此文件的所有者和所属的组设置所有权限,为其他用户设置读写权限。

总结

如果你完整了阅读了以上内容,相信你对于如何修改文件权限已经胸有成竹了,好文难得注意点赞和收藏。祝编码愉快,生活愉快,疫情之下,不被裁员。

引用文章:
How to Use the chmod Command on Linux
How To List Users and Groups on Linux

You May Also Like

About the Author: shusheng007

发表评论

邮箱地址不会被公开。