在之前,我们先了解几个概念以便更方便的了解文件系统
分为以下三类:
- 超级用户(root): root, 具有一切操作权限。在Linux操作系统的字符界面, root用户的提示符为 #。
- 系统用户: 系统用户时Linux系统正常工作所必需的内建的用户, 一般是用于管理服务所用。 系统用户不能用来登陆, 如 bin,daemon,lp等用户。
- 普通用户:普通用户是为了让他人能够使用Linux系统资源而建立的, 新建的账户一般就是普通账号,在Linux操作系统的字符界面, 普通用户的提示符为 $。
- 管理员(root): 0
- 普通用户: 1~65535
- 系统用户: 1~499(CentOS6) / 1~999(CentOS7)
- 登录用户: 500~ 65535(CentOS6) / 1000~65535(CentOS7)
- 解析库: /etc/passwd
系统解析用户的时候, 不能直接的去解析用户, 能够识别的是ID号,在创建用户时, 会产生一个与UID相同的用户组,这个用户组也会有一个GID
已知,Linux系统中可以用来登陆的用户为超级用户(root)和普通用户(userName)
那么,我们是如何在不打开新窗口的情况下进行用户切换呢? 答案是 su 指令
用户切换分为以下几种情况
- root用户 切换至 普通用户
- su userName // 在命令行提示符输入指令 su userName, 可直接切换为指定用户
- 普通用户 切换至 root用户
- su root // 在命令行提示符输入指令 su root (root可以省略), 敲击回车后, 会弹出Password : 在此输入root用户密码。 敲击回车后, 即可切换至 root 用户
- 普通用户 切换至 普通用户
- su userName //在命令行提示符输入指令 su userName, 敲击回车后, 会弹出Password : 在此输入相应用户密码。 敲击回车后, 即可切换至 指定的普通用户
补充:
- 当我们成功切换用户之后, 工作目录并没有改变, 依旧停留在切换用户之前的目录。
用户组的概念:具有相同特征的用户的集合体,
- 简而言之, 就是一组用户的集合。 就像一个数组中存放了同种类型的元素。
- 那我们为什么要把用户放入到用户组中呢? 。答案是 : 方便。
可以这样理解: 假如现在有100名普通用户,我想让这100名用户对同一个文件的权限是一致的,那我是一位用户一位用户地分配权限方便, 还是将这100名用户放入一个用户组中,然后给这个用户组分配权限方便呢? 那当然是给一个用户组分配权限更加方便啦。- 综上所述, 用户组就是对文件具有相同操作权限的用户的集合体
- 分类1 : 私有组,公共组
- 分类2 : 基本组,附加组
- 管理员组(组名root): 0
- 普通用户组: 1~65535
- 系统用户组: 1~499(CentOS6) , 1-999(CentOS7)
- 登录用户组: 500-65535(CentOS6), 1000-65535(CentOS7)
当访问一个文件时, 它的访问权限取决于访问者的身份
根据文件的创建及其所属组别分为以下三种
- 文件的所有者: u – User
- 文件的所属组 : g – Group
- 其他用户: o – Other
linux的核心理念 : Everything is file — 一切皆文件
- -, 普通文件: 储存普通数据, 一般为字符串
- d,目录文件: 储存的是一张表, 这张表记录了该目录下, 所有文件名与 inode 的映射关系。 d – directory
- l, 软连接文件: 亦称符号链接文件,(类似于Windows的快捷方式)
- b, 块设备文件: (硬盘,光驱),b – block
- c, 字符设备文件: (键盘,显示器等串口设备), c – character
- p, 管道文件
- s, 套接口文件
linux中文件的基本权限可分为以下三种
- r : 读权限 ( 读取文件内容的权限 | 浏览目录信息的权限
- w: 写权限 ( 修改文件内容的权限 | 删除或移动目录下所有文件的权限
- x : 执行权限 ( 执行文件的权限 | 进入目录的权限
linux表示 | 含义 | linux表示 | 含义 |
---|---|---|---|
r– | 只读 | r-x | 可读可执行 |
-w- | 只写 | -wx | 可写可执行 |
–x | 只可执行 | rwx | 可读可写可执行 |
rw- | 可读可写 | — | 无任何权限 |
r:可以读取这个普通文件的名字和内容。
w:可以修改这个文件的内容和文件名。
x:该文件是否具有被执行的权限。
易错补充 :
- 删除一个文件并不需要此文件的读写权限。 而是需要具备它所属目录文件的写权限
r-x:
- 可以使用cd指令进入该目录,
- 可以使用指令ls获得该目录下存储情况,
- 不能修改这个目录内部存储的文件(目录)的名字,
- 也不能在该目录下新建文件和目录
-wx:
- 可以使用cd指令该目录,
- 无法该目录下的储存情况(指令ls 不可用),
- 可以往该目录下添加、修改、删除文件。
- 可以通过指令cat来读取该目录下的文件or目录的内容,
- 由于得不到该目录下存储了那些文件,在不知情的情况下只能通过猜,cat + 文件名获得文件内容,所以这样依然不保密。
rw- :
- 不能使用cd指令该目录,
- 无法获取该目录文件储存的inode号,
- 使用指令ls仅仅可以获得文件名和目录名, (无法获取inode号)
- 也不能获得该目录下的文件的内容,(无法获取inode号)
- 不能往该目录下添加、修改、删除文件。
–x:
- 可以使用cd指令该目录,但是看不到存储情况,
- 不能往该目录下添加、修改、删除文件。
- 可以通过cat + xx(猜)来获得该目录下的文件的内容。
由于,删除一个文件需要的是其所在目录的写权限。
那么当多个用户共用一个目录,在这个公有目录下可以随意创建删除自己的文件时,就会引发一个问题,每一个用户都具备该公有目录的写权限,可以随意删除他人或自己的文件,在这种情况下,如何避免用户所创建文件不被他人删除。
粘滞位的作用就是为了解决此情况。
可以看到上图中 dir_1 三类用户都具有 w 权限, 当我们使用粘滞位
代码为: chmod +t dir_1
使得目录文件 dir_1 最后一位的权限变为了 t。
粘滞位有什么作用呢?
当一个目录被设置 “粘滞位”, 那么该目录下的文件只能由:
- 超级管理员(root)删除
- 该目录文件所有者删除
- 该文件所有者删除
当我们在linux命令行中输入指令 ls -l 之后不仅可以看到
文件名, 还会看到一行数据, 这行数据叫做文件元数据。
- rw- r-- r-- 这串字符串一共有十个字符
我们将这十个字符分别以0 123 456 789进行表示。
- 字符 0 ,它代表文件的类型
- 字符 123, 它代表文件所有者的访问权限,取决于rwx的组合
- 字符 456 , 它代表文件所属用户组的访问权限,也就是这个用户组的权限。取决于rwx的组合
- 字符 789, 它代表除用户组之外的其他用户的访问权限。取决于rwx的组合
什么是硬链接
- 硬连接指通过索引节点来引用另一个文件。
什么是inode
- 在 Linux 的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配了一个编号,这个编号称为索引节点号(Inode Index)。
多个文件对应于同一个inode
- 在 Linux 中,多个文件名指向同一索引节点是存在的。
- 如果两个文件指向同一索引节点,那么它们在目录项中的inode节点号相同
假如 文件A和文件B指向同一索引节点,则称A和B的链接状态完全相同,它们被称为指向文件的硬链接。内核记录了这个连接数,inode 的硬连接数显示为2。
总结 :
- 有几个文件名指向同一个inode , 那么这个文件的元数据中所记录的硬链接数就是几》
一般为文件的创建者, 谁创建了该文件, 谁就会天然的成为该文件的所有者
- 指令 ls -ahl 可以查看文件的所有者
- 指令 chown [选项] 用户名 文件名 可以修改文件的所有者
- 比如 chown root data 修改文件data的所有者为 root
当用户创建了一个文件后, 这个文件的所属组就是该用户所在的组
- 指令 ls -ahl 可以查看文件所属组
- 指令 chgrp [选项] 组名 文件名 可以修改文件所属组
- 比如 chgrp -r root : 省略了 路径 ./ 表示把当前目录下的所有文件的所属组改为root组
所占内存, 二进制字节数
最后一次修改文件内容或文件属性的时间
文件时间区分
- Access 最后访问时间
- Modify 文件内容最后修改时间
- Change 属性最后修改时间
创建文件时为文件起的名称
在理解文件的表示方法之前, 先来了解一下什么是 **八进制模式** 安全设置
八进制模式
- 安全设置将一个rwx权限转换为 3位的二进制值, 然后这个二进制值可以由一个八进制表示。
- 在二进制的表示中, 每个位置都是一个二进制位。
- 就像, 如果读取权限是唯一的权限集, 那么其字母表示值就应该是 r-- , 对应的二进制值为100, 由八进制值表示则是4.
- 这意味着, 是先将rwx的8种组合转化了8种二进制值, 再由二进制转化八进制值, 才有的八进制表示权限
- 八进制模式通过3位八进制权限依次代表三种安全级别的权限值。(属主, 属组, 其他)
- 像 664表示属主和属组具备读取和写入权限,而其他用户只具备读取权限
字符表示法 | 八进制表示法 | 二进制表示法 | 说明 |
---|---|---|---|
r | 4 | 100 | 仅可读 |
w | 2 | 010 | 仅可写 |
x | 1 | 001 | 仅执行 |
rw- | 6 | 110 | 可读可写 |
r-x | 5 | 101 | 可读可执行 |
-wx | 3 | 011 | 可写可执行 |
rwx | 7 | 111 | 可读可写可执行 |
— | 0 | 000 | 无权限 |
看了前面的内容我想你已经对文件权限有了个大概的认识, 那么这些
神奇的文件权限它又从何而来呢?
答案是 :
umask -- (user file-creatiopn mode mask) 用户文件创建掩码
作用: umask命令为我们新创建的任何类型的文件设置默认权限
- umask – (user file-creatiopn mode mask) 用户文件创建掩码
- 是Linux系统或类Linux系统的一个命令
- 该命令由三个八进制数组成
- 取值范围位 0 000 - 0 777
- 第一个数字它表示一种特殊的安全特性, 之所以添加到取值范围中是因为在我们命令行提示符处, 我们使用 umask 指令,它的打印结果是四个八进制数, 第一个八进制数表示的是一种特殊的安全特性。
- 这种安全特性我们暂时不过多解释, 下面会简略说明
作用:
umask命令为我们新创建的任何类型的文件设置默认权限
通俗来讲, umask命令对应的三个八进制数决定了进程创建文件时,文件的默认权限。
我们先抛开umask不谈, 谈谈没有umask - 用户文件创建掩码时, 文件的完整权限是什么
- 普通文件的完整权限会是 0666
- 原因 : 创建普通文件一般都是用来读写, 所以默认情况下所有用户都具有读写权限, 但是没有可执行权限。 因此普通文件的默认权限是0666
- 目录文件的完整权限会是 0777
- 原因 : 目录文件的 x 权限为进入目录或者说是打开目录的权限, 所以这个权限必须要有,当然目录文件自然也包括读写权限。 因此目录i文件的默认权限就是 0777
- 在这里的权限表示方式都为八进制
- 6 代表 rw-
- 7代表 rwx
- 0 标识 这是一个八进制数
上述的情况是在没有umask下文件的完整权限。
在大多数Linux系统上, 默认umask的八进制值显示为0022,而此
时我们所创建的文件的默认权限并不是0666而是0644,这是如何发生的呢?
umask值只是一个掩码, 它掩去你不希望文件在被创建时所拥有的
权限。
它的具体过程是, 在创建文件时, 文件的完整权限 减去 umask
码值 最后得到文件的默认权限
即:
文件默认权限 = 文件完整权限 - umask(权限掩码)
总结:
- umask - 用户文件创建掩码, 也可以叫做文件掩码, 权限掩码, 甚至掩码, 叫法很多 。
- 但是umasl值就是以三个八进制数分别表示着 属主, 属组, 其他 这三类文件访问者我们所不希望它们拥有的文件权限
- 也就是说 umask 替我们掩去了这三类用户不同的权限
- 文件默认权限 = 文件完整权限 - umask
补充说明:
- 这里的 - (减号) 实际上是掩盖, umask与文件默认权限相同的部分执行掩盖,不同的部分不执行掩盖操作。 所以如果单纯依靠计算数值来算文件新默认权限是不准确的
- 比如 文件的权限为 655 umask的值为 022
那么按照 文件默认权限 = 文件完整权限 - umask
是不是就是 655 - 022 = 633, 可实际上却是 644
655 — “rwxrw-rw-” , 022 — “----w–w-”
按照 umask的掩盖 “rwxrw-rw-” 被 “----w–w-” 掩盖后为 “rwxr–r–”
而 “rwxr–r–” 对应的八进制数位 644- 所以在这里, 要准确理解 umask的掩盖, 掩盖掉你不想文件创建时被用户所拥有的权限。
语法格式 | 效果 |
---|---|
umask [三位八进制数] | 将umask的值修改为指定值 |
补充:
例如 , umask 024 , 这是将umask值修改为了 024
注意, 不能超出范围 (000 - 777)
Linux为每个文件和目录都存储了3个额外的信息位
- set user id(SUID) : 当文件由用户执行时, 程序将在文件所有者的权限下运行
- set group id(SGID): 对于普通文件, 程序将在文件用户组的权限下运行。
- set group id(SGID): 对于目录文件, 目录中创建的新文件使用目录用户组作为默认用户组。
- 粘滞位: 进程结束后, 使得文件依旧保留(粘滞)在内存中
二进制 | 八进制 | 描述 |
---|---|---|
000 | 0 | 清空所有位 |
001 | 1 | 设置粘滞位 |
010 | 2 | 设置SGID位 |
011 | 3 | 设置SGID和粘滞位 |
100 | 4 | 设置SUID位 |
101 | 5 | 设置SUID位和粘滞位 |
110 | 6 | 设置SUID和SGID位 |
111 | 7 | 设置所有位 |
chmod命令允许修改文件和目录的权限
- 八进制命令格式如下:
- chmod [选项] [八进制权限] fileNam
示例 :
$ chmod 760 fileName // 设置该目录文件的权限为760
$ ll fileName
drwxrw---- 1 rich rich 0 sep 20 19:16 newfile- 符号命令格式:
- chmod [选项] [u或g或o或a] [+或-或=] [rwxXstugo…]fileName
- u — 文件所有者
- g — 文件所属组
- o — 其他用户
- a — 表示上述所有
- (+)—添加权限
- (-)— 减去权限
- (=) — 为已有权限赋值
- X — 用于指定执行权限, 仅当为目录文件或已经拥有执行权限时有效
- s – 用于设置正在执行的UID或GID
- t — 用于保存程序文本
- u — 用于将权限设置为所有者的权限
- g — 用于将权限设置为用户组的权限
- o — 用于将权限设置为其他人的权限
- 选项 -R
- 递归执行对文件权限的修改
示例:
chmod o+r file // 为文件file的其他用户添加读权限, o+r条目为其他用户添加了读取该文件的权限
chmod u-x file // 从文件file的所有者的权限中删除执行权限。
chown命令支持修改文件的所有者和文件的所属用户组
语法 | chown [选项] [属主名称][:属组名称] 文件名 |
---|---|
功能 | 修改文件的所有者和所属用户组 |
选项 | -R , 递归式修改文件属主和属组 |
示例:
chown dan file // 将file文件的所有者修改为 dan
chown dan.dan file // 将file文件的所有者和所属组均修改为 dan
chown .rich file // 将file文件的所属组修改为 rich
chown dan. file // 当且仅当文件属主和属组相同时, 该指令可同时修改属主和属组
注意: 普通用户在不具备权限的情况下, 无法更改文件的所属组, 所属主
可以搭配 sudo指令, 为其进行临时权限提升
chgrp命令仅可支持修改文件的所属用户组
语法 | chgrp [选项] [属组名称] 文件名 |
---|---|
功能 | 仅可以修改文件的默认所属用户组 |
选项 | -R, 以递归的方式修改文件属组 |
sudo是Linux系统中一种很常用的权限管理机制, 允许非root用户以特定的身份执行特定的命令。
sudo命令通过/etc/sudoers配置文件实现
sudo visudo
注意 : 不要直接编辑 /etc/sudoerrs文件, 因为这可能会导致配置文件错误,从而无法使用sudo命令
sudoers文件包含sudo命令所需的所有配置信息。 默认情况下, sudoers文件只能由root用户编辑并修改。 sudoers文件的默认位置是/etc/sudoers。
sudoers文件的内容格式如下:
[指定用户名] [指定ip] = [指定身份] [指定命令] // 具有该指定用户名且ip为指定ip的用户可以 以指定身份运行指定命令
// Jin_Nian 192.168.1.1 = root comman
// 用户名为瑾年, ip为192.168.1.1 的用户可以 以root的身份运行某个指令
User_Alias ALIAS_NAME = username1, username2, ... // User alias specification
Runas_Alias ALIAS_NAME = user1, user2, ... //Runas alias specification
Host_Alias ALIAS_NAME = ip1, ip2, ... // IP alias specification
Cmnd_Alias ALIAS_NAME = /bin/command1, /bin/command2, ... //Command alias specifition
- username : 表示用户名
- host : 表示主机名或ip地址
- runas : 表示以那个用户的身份运行命令, 默认为root
- command : 表示可执行的命令或命令程序, 通常为root身份下才可以执行。
默认情况下, sudo只能给单个用户授权, 但也可以为用户组或者别名授权。 具体操作如下:
sudo groupadd sudoers // 添加一个用户组
sudo usermod -aG sudoers username // 将用户添加至该用户组中
%sudoers ALL =(ALL) ALL // 修改sudoers配置文件, 编辑sudoers文件, 在文件末尾添加该内容。
sudo命令介绍:
语法 | sudo [选项] [命令] |
---|---|
功能 | 以指定身份执行某个指令 |
示例:
- sudo apt-get update // 以root身份执行 apt-get update命令
- sudo -s /bin/bash // 以root的身份切换至指定的shell 比如以root身份切换至 bash - shell
- sudo -l // 列出当前用户可用的sudo权限