使用者与群组

#文件拥有者

多人任务的场景下,如果没有权限,那么将是很恐怖的事情, 文件拥有者很简单的,只有你才有权利访问与修改。

#群组概念

群组的最有用功能之一:就是在多人协作方面,只要有该组的权限,使用者就能行驶群组的权限

#其他人的概念

可以想象成 if else 中的 else,

天神:指 root ,不是拥有者

#用户身份与群组记录的文件

在 linux 系统当中,默认情况下,相关信息是存储在下面的目录下的

  • /etc/passwd:账户信息(目前笔者还不知道里面有具体信息,看不太懂)
  • /etc/shadow:账户密码,不过是加密了的
  • /etc/group:所有组名

这三个目录可以说是 Linux 系统里面账户、密码、群组信息的集中地,不要随便删除

Linux 文件权限概念

文件权限是如何针对使用者与群组来设定的呢?这个部分相当重要,如果不懂这部分, 那么你将老是听不懂别人在说什么。尤其是当你屏幕上出现了「Permission deny」的时候

#Linux 文件属性

# 切换到 root 账户
[mrcode@study root]$ su -
Password:
Last login: Mon Oct  7 22:18:11 CST 2019 on pts/0
[root@study ~]# pwd
/root

# 查看当前目录下的文件数据
[root@study ~]# ls -al
total 32
#    权限  连接 拥有者 群组 文件容量 修改日期    文档名
dr-xr-x---.  6 root root  219 Oct  4 22:48 .
dr-xr-xr-x. 17 root root  224 Oct  4 18:31 ..
-rw-------.  1 root root 2175 Oct  4 18:32 anaconda-ks.cfg
-rw-------.  1 root root    5 Oct  4 22:48 .bash_history
-rw-r--r--.  1 root root   18 Dec 29  2013 .bash_logout
-rw-r--r--.  1 root root  176 Dec 29  2013 .bash_profile
-rw-r--r--.  1 root root  176 Dec 29  2013 .bashrc
drwx------.  4 root root   31 Oct  4 22:48 .cache
drwxr-xr-x.  3 root root   18 Oct  4 22:48 .config
-rw-r--r--.  1 root root  100 Dec 29  2013 .cshrc
drwx------.  3 root root   25 Oct  4 18:38 .dbus
-rw-r--r--.  1 root root 2206 Oct  4 18:42 initial-setup-ks.cfg
drwxr-xr-x.  3 root root   19 Oct  4 22:48 .local
-rw-r--r--.  1 root root  129 Dec 29  2013 .tcshrc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

由于后续的 chgrc、chown 等指令可能都需要使用 root 指令,所以这里使用 root 身份来学习,

  • su -:切换到 root 身份
  • exit:回到你自己的身份
  • ls -al: list 的意思
    • a:当前目录下的所有文件,包括隐藏文件
    • l:显示详细信息,包括大小,属组,创建时间

#文件的类型与权限

就是这一串了 -rw------- ,有十个字符

文件类型

  • d:表示目录
  • -:文件
  • l:连接文档(link file)
  • b:装置文件里面的可供存储的接口设备(可随机存取装置)
  • c:装置文件里面的串行端口设备、例如键盘、鼠标(一次性读取装置)

接下来就是三个为一组的「rwx」,r 代表刻度 read、w 可写 write、x 可执行 execute,如果没有则使用横线占位

  • 第一组:文件拥有者的权限;-rw-r--r--:就表示可读写,但是不可执行
  • 第二组:加入此群组之账户的权限
  • 第三组:非本人且没有加入本群组之其他账户的权限

#连接

表示有多少文档名连接到此节点(i-node)

每个文件都会将他的权限与数学记录到文件系统的 i-node 中,不过这里使用的目录树是使用文件名来记录, 因此每个文档名就会连接到一个 i-node,关于 i-node 后续会讲解

#拥有者

该文档属于谁

#所属群组

该文档属于哪个组

#文件容量,默认单位 bytes

#修改日期

这个文件的建档日期或则是最佳的修改日期

# 日期为 月 日 时间,但是这个文件被修改的时间距离现在太久了则只会显示年份了
drwxr-xr-x.  3 root root   19 Oct  4 22:48 .local
-rw-r--r--.  1 root root  129 Dec 29  2013 .tcshrc

1
2
3

如果想显示完整的日期时间格式,可以利用 ls 的选项,ls -l --full-time

[root@study ~]# ls -l --full-time
总用量 8
-rw-------. 1 root root 2175 2019-10-04 18:32:06.481779774 +0800 anaconda-ks.cfg
-rw-r--r--. 1 root root 2206 2019-10-04 18:42:03.993000000 +0800 initial-setup-ks.cfgs

1
2
3
4

前面说到过语系的问题,可以修改 /etc.local.conf 中的 LANG 变量来永久修改

#文档名

没什么好说的,特殊是 一个点 .,表示隐藏文件, 至于更多的用法,自行查看 ls –help 或则 man ls 或 info ls 等文档了(小提示,当语系为LANG=zh_CN.UTF-8 时,文档里面有部分描述是中文的)

TIP

非常重要的是权限,上面的也稍微记录下

#权限识别练习

-rw-r--r--.  1 root root   18 Dec 29  2013 .bash_logout
drwxr-xr--.  1 root testgroup   18 Dec 29  2013 groups/

1
2

  • 第一个文件:只有 root 可读写,但是没有执行权限
  • 第二个目录:
    • root:可读可写
    • testgroup:可读,不能写,可执行,因此可以能够进入该目录
    • 取他人:只有 r,可读,但是没有 x,所以都不能进入此目录

#Linux 文件权限的重要性

与 windows 系统不一样的是,在 linux 系统中,每一个文件都加了很多的属性,特别是群租的概念, 最大的用途就是在数据安全性上面

  • 系统保护的功能举个简单例子,在你的系统中,关于系统服务的文件通常只有 root 才能读写或执行, 例如 /etc/shadow 这个账户管理的文件,这个文件的是个字符都是横线,不能读写执行, 但是 root 不受限制
  • 团队开发软件或数据共享的功能就是多人协作的时候,希望每个人都可以使用某一些目录下的文件,而其他人不开放。 比如 testgroup 团队有三个人 t1、t2、t3 ,那么就可以将团队所需的文件权限设置为 -rwxrws--- 该组内的都可读写与执行(等等,这里怎么是 s? 后续会讲解)
  • 未将权限设置妥当的危害很简单,比如只有 root 才能做的开关机,新增、或删除用户等等的指令,那么随意人都可以用的话, 就乱套了

#如何改变文件属性与权限

一个文件的属性与权限有很多,那么我们可以修改哪些呢?这里先介绍几个常用与群组、拥有者、各种身份的权限修改指令

  • chgrp:改变文件所属群组
  • chown:改变文件拥有者
  • chmod:改变文件的权限、SUID、SGID、SBIT 等等的特性

#改变所属群组 chgrp

语法如下:

chgrp [-R] 文件或目录

-R:递归变更,如果是目录,则变更该目录以及目录下的所有文件

1
2
3

# 注意看这里,还补全群组
[root@study ~]# chgrp us
usbmuxd  users    
[root@study ~]# chgrp users initial-setup-ks.cfg
[root@study ~]# ls -al initial-setup-ks.cfg
-rw-r--r--. 1 root users 2206 10月  4 18:42 initial-setup-ks.cfg
[root@study ~]# chgrp root initial-setup-ks.cfg
[root@study ~]# ls -al initial-setup-ks.cfg
-rw-r--r--. 1 root root 2206 10月  4 18:42 initial-setup-ks.cfg

1
2
3
4
5
6
7
8
9

TIP

在改变群组的时候,这个组名,必须存在 /etc/group 中

#改变文件拥有者 chown

TIP

同样需要改变为存在 /etc/passwd 中有记录的用户名称

语法如下

chown [-R] 账户名称 文件或目录
chown [-R] 账户名称:组名 文件或目录

1
2

[root@study ~]# ls -al initial-setup-ks.cfg
-rw-r--r--. 1 root root 2206 10月  4 18:42 initial-setup-ks.cfg
# 修改为 mrcode 所拥有
[root@study ~]# chown mrcode initial-setup-ks.cfg
[root@study ~]# ls -al initial-setup-ks.cfg
-rw-r--r--. 1 mrcode root 2206 10月  4 18:42 initial-setup-ks.cfg
# 同时修改拥有者和群组
[root@study ~]# chown root:root initial-setup-ks.cfg
[root@study ~]# ls -al initial-setup-ks.cfg
-rw-r--r--. 1 root root 2206 10月  4 18:42 initial-setup-ks.cfg

1
2
3
4
5
6
7
8
9
10

那么什么时候使用 chown 和 chgrp 呢?他们都可以修改组,其实只是一个包含了另一个的功能了而已, 拿这个案例来讲解下

一般我们复制文件使用 cp 命令(cp 来源文件 目标文件),那么我需要把某个文件拷贝给 mrcode

[root@study ~]# cp initial-setup-ks.cfg initial-setup-ks-mrcode.cfg
[root@study ~]# ls -al initial-setup-ks*
-rw-r--r--. 1 root root 2206 10月  4 18:42 initial-setup-ks.cfg
# 注意看这个拷贝出来的拥有者和群组还是 root,就算我给了 mrcode,他也不能读取,权限不够
-rw-r--r--. 1 root root 2206 10月  7 23:30 initial-setup-ks-mrcode.cfg
# 那么使用 chown 同时修改拥有者和群组为 mrcode
[root@study ~]# chown mrcode:mrcode initial-setup-ks-mrcode.cfg
[root@study ~]# ls -al initial-setup-ks*
-rw-r--r--. 1 root   root   2206 10月  4 18:42 initial-setup-ks.cfg
-rw-r--r--. 1 mrcode mrcode 2206 10月  7 23:30 initial-setup-ks-mrcode.cfg

1
2
3
4
5
6
7
8
9
10

#改变权限 chmod

chmod 指令改变权限有两种形式,一种使用数字,一种使用符号

#数字类型改变文件权限

  • r = 4
  • w = 2
  • x = 1

每种身份 owner、group、others 各自的三个权限 r、w、x 分数是需要累加的, 例如权限是 -rwxrwx--- ,那么分数为:

  • owner:rwx = 4 + 2 + 1 = 7
  • group:rwx = 4 + 2 + 1 = 7
  • ohters:— = 0 + 0 + 0= 0

语法为

chmod [-R] xyz 文件或目录

xyz:就是刚刚的数值类型的权限范围,为 rwz 属性数值的相加
-R:递归

1
2
3
4

常用权限数值:

  • -rw-rw-r-- 664 :一般文件,可读可写无执行
  • -rwxr-x-r-x 755:shell 脚本文件,拥有者可读写执行,其他的都只能可读可执行,不可编辑
  • -rwxr------ 740:不希望该文件被其他人看到(能看到文件,但是不能读取里面的内容)

修改示例就是 chmod 740 text.txt

#符号类型改变文件权限

权限分三组:

  • user
  • group
  • other

每个组的首字母就代表了这个符号类型,其中 a 表示所有

chmod u/g/o/a +/-/= r/w/x 文件或目录

1

把一个文件更改为 -rwxr-xr-x

[root@study ~]# ls -al initial-setup-ks-mrcode.cfg
-rw-r--r--. 1 mrcode mrcode 2206 10月  7 23:30 initial-setup-ks-mrcode.cfg

# 三组字母可以写一起
[root@study ~]# chmod u=rwx,go=rx initial-setup-ks-mrcode.cfg
[root@study ~]# ls -al initial-setup-ks-mrcode.cfg
-rwxr-xr-x. 1 mrcode mrcode 2206 10月  7 23:30 initial-setup-ks-mrcode.cfg

1
2
3
4
5
6
7

那么还有一个需求,不知道原来的权限,但是需要让某个文件具有每个人都有写入的权限

[root@study ~]# ls -al initial-setup-ks-mrcode.cfg
-rwxr-xr-x. 1 mrcode mrcode 2206 10月  7 23:30 initial-setup-ks-mrcode.cfg

# 开始没有写入权限,使用 + 来增加写入权限
[root@study ~]# chmod o+w initial-setup-ks-mrcode.cfg
[root@study ~]# ls -al initial-setup-ks-mrcode.cfg
-rwxr-xrwx. 1 mrcode mrcode 2206 10月  7 23:30 initial-setup-ks-mrcode.cfg

1
2
3
4
5
6
7
8

#目录与文件之权限意义

前面谈到这些文件权限对于数据安全的重要性,那么对于一般文件与目录有何不同呢?

#权限对文件的重要性

文件是实际含有数据的地方,包括一般文件、数据库文件、二进制可执行文件(binary program)等, 因此,权限对于文件来说,意义是:

  • r(read):可读取此文件的实际内容
  • w(write):可以修改文件内容,但是不能删除
  • x(execute):该文件具有可以被系统执行的权限

x 怎么理解呢?在 windows 中一个文件是否具有执行的能力是由扩展名来判断的,如 .ext.bat 等, 在 linux 下就靠这个 x 来决定,根文档名没有关系

#权限对目录的重要性

目录主要的内容在记录文件名列表,文件名有目录有强烈的关联,rwx 对目录的意义如下

  • r(read contents in directory)具有读取目录结构列表的权限,使用 ls 这指令就可以将该目录的内容列表显示出来
  • w(modify contents of directory)表示你具有异动该目录结构列表的权限:
    • 建立新的文件与目录
    • 删除已存在的文件与目录(不论该文件的权限为何)
    • 将以存在的文件或目录进行更名
    • 搬移该目录内的文件、目录位置
  • x(access directory)目录只是记录文件名而已,总不能拿来执行吧?那么 x 代表的是用户能否进入该目录称为工作目录的用途
组件内容迭代物件rwx
文件详细资料 data文件文件夹读到文件内容修改文件内容执行文件内容
目录文档名可分类抽屉读到文件列表修改文件或目录进入该目录的权限