一、属主,属组,其他人
https://www.jianshu.com/p/8a6219c09e4c
Linux 系统中一切皆文件。
每个文件和目录都有自己的属主和属组
属主 表示这个文档是属于哪个用户的,这个用户必须存在于这个系统中。
属组 表示这个文档是属于哪个组的, 这个组必须存在于这个系统中。
其他人 表示这个文档和哪些用户没有任何的关系,此时那些用户就是其他人的范畴。
二、记录用户和组的文件
/etc/passwd
保存了用户的相关信息
/etc/shadow
保存了用户的密码等信息
/etc/group
保存了组的相关信息
三、文件属性
文档类型
- :常规文件;即普通文件;
d : directory 目录文件
b : block device, 块设备文件,支持以block(块)为单位进行随机访问
c :character device,字符设备文件,支持以(字符)character为单位进行线性访问,
例如键盘、鼠标(一次性读取设备)。
major number :主设备号,用标识设备文件,今儿确定要加载的驱动程序
minor number :次设备号,用于标识同一类型中的不同的设备
8位二进制:0-255
l : symbolic link, 符号链接文件,就行 Windows 中的快捷方式;
p : pipe, 命名管道;
s : socker, 套接字文件;
关于索引节点,课外阅读资料阮一峰博客
关于权限部分
一个文档的权限分为三部分,每个部分对应了具体的对象(谁的,哪个组的,其他人)。
每个部分有分为 3 个位,每个位都对应了不同的权限。所有的位置中,假如表示没有权限,就在次位置用英文的短横线 -
占位 。
第一个位置是
读权限
,有读权限,就在此位置用r
表示,假如没有,用英文的短横线-
表示。
比如:r--
, 表示 只读的权限。第二个位置是
写权限
, 有写权限,就在此位置用w
表示。第三个位置是
执行权限
, 有写权限, 就在此位置用x
表示。
随意练习一下, 开始你的表演。提问开始
修改文档的权限和属性
修改属主和组
修改属主和属组的命令可以使用 chown
, 就是 change owner 的简写。
chown 命令语法
chown [-R] 帐号名称 文件或目录 chown [-R] 帐号名称:组名称 文件或目录 chown [-R] 帐号名称.组名称 文件或目录
注意:
这里的账号名称和组名称,必须存在于系统中,在
/etc/passwd
和/etc/group
文件中有相应的记录。
// 修改属主和属组
chown sshd.sshd a.txt
// 修改目录及其下面所有的文件和目前的属主和属组, 需要创建这个目录
chown -R sshd:sshd /opt/mysql/data
// 修改属主
chown sshd b.txt
// 修改属组, 注意组名 sshd 前面有个点
chown .sshd b.txt
修改权限
修改权限的命令使用 chmod
, 就是 change mode 的简写。
chmod 命令语法
chmod [-R] 权限表示方式 文件或目录
-R 选项是对目录进行递归操作
权限的改变使用的是chmod这个指令,但是,权限的设置方法有两种, 分别可以使用数字或者是符号来进行权限的变更。
符号的方式
所谓的符号就是上图中的 r
、w
和 x
。
那如何表示身份对象呢?
属主, 就是 user 的意思, 可以使用
u
来表示属组, 就是 group 的意思, 可以使用
g
来表示其他人, 就是 others 的意思, 可以使用
o
来表示所有人, 可以使用 all, 就用
a
来表示
增加权限使用英文的 +
符号
移除权限使用英文的 -
符号
设置权限使用英文的 =
符号
开始你的表演
- 设置
.bashrc
文件的权限,具体要求如下- 属主为 可读,可写
- 属组为 可读
- 其他人为 可读
chmod u=rw,g=r,o=r .bashrc
- 修改
.bashrc
文件的权限为如下描述- 属主增加 可执行权限
- 属组增加 可写,可执行权限
- 其他人移除 可读权限
chmod u+x,g+wx,o-r .bashrc
-
修改
.bashrc
文件的权限为:- 给所有用户增加可执行权限
chmod a+x .bashrc
数字的方式
使用数字的方式操作权限,就是把之前的每个角色的具体位置的的符号转变成一个数字。
r
--> 4
w
--> 2
x
--> 1
那如何把这些数字对应到具体的身份中呢,比如 属主、数组,其他人。
对应到每个身份上时,需要把三个位置的数字相加。
比如一个文档的权限是 -rwxr--r--
, 对应的数字方式的权限是 744
.
文档类型: -
代表普通文件
属主:rwx
分别对应了 4
2
1
,相加后就是 7
属组: r--
分别对应了 4
0
0
, 相加后就是 4
其他人: r--
分别对应了 4
0
0
, 相加后就是 4
开始你的表演
数字方式的权限设置,都是直接设置的,没有增加、删除之说。
- 设置文件
.bashrc
的权限为
属主:可读可写可执行
属组: 可读可执行
其他人: 无权限
chomd 750 .bashrc
四、权限对于文件和目录的意义
认识 Linux 系统
分区和文件系统的基本认知
由于盘片是圆的,并且通过机器手臂去读写数据,盘片要转动才能够让机器手臂读写。因此,通常数据写入当然就是以圆圈转圈的方式读写啰!
所以,当初设计就是在类似盘片同心圆上面切出一个一个的小区块,这些小区块整合成一个圆形,让机器手臂上的磁头去存取。 这个小区块就是磁盘的最小物理储存单位,称之为扇区 (sector),那同一个同心圆的扇区组合成的圆就是所谓的磁道(track)。 由于磁盘里面可能会有多个盘片,因此在所有盘片上面的同一个磁道可以组合成所谓的柱面 (cylinder)。
原本硬盘的扇区都是设计成 512Byte 的容量,但因为近期以来硬盘的容量越来越大,为了减少数据量的拆解,所以新的大容量硬盘已经有 4KByte 的扇区设计! 购买的时候也需要注意一下。也因为这个扇区的设计不同了,因此在磁盘的分区方面,目前有旧式的 MSDOS 相容模式,以及较新的 GPT 模式。
具体分区参考
一块磁盘需要经过分区,之后对每个分区进行格式化操作,操作系统才能用于存储数据。
一块磁盘 --》 一大间房子
分区 --》 分割成不同的房间
格式化 --》 规定每个房间的用途
规定每个房间的用途,就相当于确定如何使用存放数据,这个过程中就需要制定一定的规则,就是规定数据如何存放的硬盘的这个分区。这个规则称为文件系统。
为什么需要进行格式化*呢?这是因为每种操作系统所设置的文件属性/权限并不相同, 为了存放这些文件所需的数据,因此就需要将分区进行格式化。
所以不同的操作系统也有自己独有的文件系统。
对于 Windows 中,有的文件系统比如 FAT32、NTFS 等
对于 Linux 系统中,有的文件系统:EXT2、 EXT3、 EXT4、 XFS
大部分情况下,每种操作系统只能够使用自己的文件系统,也有一些特殊的,比如FAT32 多种操作系统都是可以支持的,因为这个文件系统比较陈旧,支持的特性功能不多,所以大部分操作系统都支持。
Mac 和 Windows 都能读写的文件系统是 ExFAT
Mac 、Linux、Windows 都是读写的是 Fat32。
Fat32 系统缺点读写速度慢,并且单个文件的大小不能超过 4G, 比如不能存储一个超过 4G的视频或者 ISO格式的文件等
inode 和 block
Linux 系统中有很多高级的文件系统,这些文件系统中的文档除了有文件内容本身外,还有很多属性,在管理这些内容的时候,会把一个文档这些内容分为两个部分存储。
inode 部分和 block 部分
每个 inode 与 block 都有编号
- inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的 block 号码;
- block:实际记录文件的内容,若文件太大时,会占用多个 block 。
假设某一个文件的属性与权限数据是放置到 inode 4 号(下图较小方格内),而这个 inode 记录了文件数据的实际放置点为 2, 7, 13, 15 这四个 block 号码,此时我们的操作系统就能够根据 block 号来排列磁盘的读取顺序,可以一口气将四个 block 内容读出来! 那么数据的读取就如同下图中的箭头所指定的模样了。
参考文档:鸟哥私房菜基础篇
关于 inode
inode 也可以称为 inode table(表格)
inode 的内容在记录文件的属性以及该文件实际数据是放置在哪几号 block 内! 基本上,inode 记录的文件数据至少有下面这些:
- 该文件的存取模式(read/write/excute);
- 该文件的拥有者与群组(owner/group);
- 该文件的容量;
- 该文件创建或状态改变的时间(ctime);
- 最近一次的读取时间(atime);
- 最近修改的时间(mtime);
- 定义文件特性的旗标(flag),如 SetUID...;
- 该文件真正内容的指向 (pointer);
关于 block
block 可以称为 data block
data block 顾名思义,就是存放数据的,但是,block 对于文件和目录有不同的意义。存放的数据不一样,具体如下:
对于文件来说,就是存放真实是文件内容的,比如文件内容是 "hello shark" 就是存放 "hello shark" 这几个字符串的。
对于目录,Linux 中一切皆文件,目录其实也是文件。目录的 block 中存放了这个目录下的文档名和其对应的 inode 号。像下面这样
所以整个目录和其下面的文档的记录方式和关系如下图:
软链接 和 硬链接
硬链接
创建硬链接文件
两个文件的路径必须在同一个文件系统(分区)内
ln 源文件 硬链接文件路径
ln anaconda-ks.cfg an.cfg
硬链接不可跨分区
只能对文件建立硬链接。
建立硬链接文件,不会占用实际的磁盘空间,也不会使用用文件系统的 inode 号。
软链接
创建软链接
ln -s[f] 源文件绝对路径 软链接文件路径
ln -s /root/anaconda-ks.cfg /tmp/an-ks.cfg
-f
选项是覆盖原来的软连接文件
软链接可以跨分区
对文件、目录都可以创建软链接。
建立软链接文件,实际上就是创建一个新的文件一样,所以会使用文件系统的 inode 号,也会占用用实际的磁盘空间,只不过这个磁盘空间的大小是源文件的绝对路径名所占用的大小。
比如源文件的绝对路径名是/root/a.txt
, 那么软链接到文件占用的实际磁盘空间是11 bytes(字节)
,因为,英文的每个字符大小是 1 个字节。
五、 权限与指令间的关系
我们知道权限对于使用者帐号来说是非常重要的,因为他可以限制使用者能不能读取/创建/删除/修改文件或目录! 在这一章我们介绍了很多文件系统的管理指令,第五章则介绍了很多文件权限的意义。在这个小节当中, 我们就将这两者结合起来,说明一下什么指令在什么样的权限下才能够运行吧!_
1、让使用者能进入某目录成为“可工作目录”的基本权限为何:
- 可使用的指令:例如 cd 等变换工作目录的指令;
- 目录所需权限:使用者对这个目录至少需要具有 x 的权限
- 额外需求:如果使用者想要在这个目录内利用 ls 查阅文件名,则使用者对此目录还需要 r 的权限。
2、使用者在某个目录内读取一个文件的基本权限为何?
- 可使用的指令:例如本章谈到的 cat, more, less等等
- 目录所需权限:使用者对这个目录至少需要具有 x 权限;
- 文件所需权限:使用者对文件至少需要具有 r 的权限才行!
3、让使用者可以修改一个文件的基本权限为何?
- 可使用的指令:例如 vi 文本编辑器等;
- 目录所需权限:使用者在该文件所在的目录至少要有 x 权限;
- 文件所需权限:使用者对该文件至少要有 r, w 权限
4、让一个使用者可以创建一个文件的基本权限为何?
- 目录所需权限:使用者在该目录要具有 w,x 的权限,重点在 w 啦!
5、让使用者进入某目录并执行该目录下的某个指令之基本权限为何?
- 目录所需权限:使用者在该目录至少要有 x 的权限;
- 文件所需权限:使用者在该文件至少需要有 x 的权限
例题:让一个使用者 shark
能够进行“cp /dir1/file1 /dir2”的指令时,请说明 dir1, file1, dir2 的最小所需权限为何?答:执行 cp 时, dmtsai 要“能够读取来源文件,并且写入目标文件!”所以应参考上述第二点与第四点的说明! 因此各文件/目录的最小权限应该是:
- dir1 :至少需要有 x 权限;
- file1:至少需要有 r 权限;
- dir2 :至少需要有 w, x 权限。
例题:有一个文件全名为 /home/student/www/index.html ,各相关文件/目录的权限如下:
drwxr-xr-x 23 root root 4096 Sep 22 12:09 /
drwxr-xr-x 6 root root 4096 Sep 29 02:21 /home
drwx------ 6 student student 4096 Sep 29 02:23 /home/student
drwxr-xr-x 6 student student 4096 Sep 29 02:24 /home/student/www
-rwxr--r-- 6 student student 369 Sep 29 02:27 /home/student/www/index.html
请问 shark 这个帐号(不属于student群组)能否读取 index.html 这个文件呢?答:虽然 www 与 index.html 是可以让 shark 读取的权限,但是因为目录结构是由根目录一层一层读取的, 因此 shark 可进入 /home 但是却不可进入 /home/student/ ,既然连进入 /home/student 都不许了, 当然就读不到 index.html 了!所以答案是“shark不会读取到 index.html 的内容”!
那要如何修改权限呢?其实只要将 /home/student 的权限修改为最小 711
,或者直接给予 755
就可以啦! 这很重要!
六、文档默认权限 umask
权限掩码
umask -S
当用户创建文档时,创建后的默认权限计算方法
- 创建文件时:
(-rw-rw-rw-) - (-----w--w-) ==> -rw-r--r--
- 创建目录时:
(drwxrwxrwx) - (d----w--w-) ==> drwxr-xr-x
修改用户的 umask 可以在 /etc/profile
和 /etc/bashrc
文件中修改。
七、 文件特殊权限: SUID, SGID, SBIT
Set UID
名词介绍
二进制文件 就是可以被执行的文件,通俗说就是命令文件,程序文件,就想是 windows 中的 .exe
文件。
二进制文件也可以叫做二进制程序
先看一个文件
➜ ~ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 27832 Jun 10 2014 /usr/bin/passwd
上面文件拥有者的权限部分中的 x
位置,出现了一个 s
, 这个 s
标识就代表了这个文件具有 SUID 特殊权限。
其作用和限制如下:
- SUID 权限仅对二进制程序(binary program)有效;
- 执行者对于该程序需要具有 x 的可执行权限;
- 本权限仅在执行该程序的过程中有效 (run-time);
- 在执行此文件时,执行者将具有该程序拥有者 (owner) 的权限。
给一个文件设置 SUID
chmod u+s file
Set GID
当 s 标志在文件拥有者的 x 项目为 SUID,那 s 在群组的 x 时则称为 Set GID,即 SGID .
当一个文件具有 SGID(用的情况不多)
- SGID 对二进制程序有用;
- 程序执行者对于该程序来说,需具备
x
的权限;- 执行者在执行的过程中将会获得该程序群组的权限!
当一个目录具有 SGID
- 用户若对于此目录具有 r 与 x 的权限时,该用户能够进入此目录;
- 用户在此目录下的有效群组(effective group)将会变成该目录的群组;
- 用途:若用户在此目录下具有 w 的权限(可以新建文件),则用户所创建的新文件时,该新文件的群组与此目录的群组相同。
Sticky Bit
这个 Sticky Bit, SBIT 目前只针对目录有效,对于文件已经没有效果了。
SBIT 对于目录的作用是:
- 当使用者对于此目录具有 w, x 权限,亦即具有写入的权限时;
- 当使用者在该目录下创建文件或目录时,仅有自己与 root 才有权力删除该文件
ls -ld /tmp
设置 SBIT
chmod o+t a/