一、文件访问者的类型
1.两种用户:超级用户(root)、普通用户
-
超级用户:可以再linux系统下做任何事情,不受限制;命令提示符是“#”
-
普通用户:在linux下做有限的事情;命令提示符是“$”
命令: su [用户名]功能:切换用户。例如,要从root用户切换到普通用户user,则使用 su user。 要从普通用户user切换到root用户则使用 su root(root可以省略),此时系统会提示输入root用户的密码
2.文件访问者分为3类:
- 文件所有者(user)
- 群组(group)
- 其他人(others)
二、文件类型和权限
文件的属性信息中包括文件的权限,process_bar的权限为-rwxrwxr-x,而process的权限为-rw-rw-r--,一共10位,第1位为文件类型
1.linux文件类型
- d:文件夹
- -:普通文件
- l:软链接(类似Windows的快捷方式)
- b:块设备文件(例如硬盘、光驱等)
- p:管道文件
- c:字符设备文件(例如屏幕等串口设备)
- s:套接口文件
2.权限
第2-4位、5-7位、8-10位分别为文件所有者、群组、其他人的权限,其中每3位代表r(read)、w(write)、x(execute),-代表没有该权限
- read:对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限(目录的状态信息、文件列表)
- write:对文件而言,具有修改文件内容的权限;对目录来说具有删除、创建目录内文件的权限
- execute:对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限
ps:如果没有对目录的x权限,那么对目录内文件和子目录的rwx权限全是无效的,因为根本无法进入目录,也就无法操作其中的文件和子目录
上面这种用10个字符表示文件权限的方法为字符表示方法,除此之外,我们还可以用8进制数值表示方法来表示文件的权限
| 权限符号 | 二进制 | 八进制 |
|---|---|---|
| --- | 000 | 0 |
| --x | 001 | 1 |
| -w- | 010 | 2 |
| -wx | 011 | 3 |
| r-- | 100 | 4 |
| r-x | 101 | 5 |
| rw- | 110 | 6 |
| rwx | 111 | 7 |
例如上面的process_bar文件:
0开头表示八进制,775对应rwx、rwx、r-x
三、设置文件权限
1.chmod:设置文件的访问权限
说明:只有文件的拥有者和root才可以改变文件的权限
命令格式: chmod [参数] 权限 文件名
常用选项:-R:递归修改目录文件的权限
设置权限值的格式:
(1)用u、g、o、a代表user、group、others、all(所有用户),用+、-、=代表赋予、剥夺、等于某权限
eg:
chmod u+w filename
chmod u=rwx,go=rx filename
(2)用3位8进制数值设置权限
chmod 777 filename
2.chown:改变文件的拥有用户
格式: chown [参数] 用户名 文件名
3.chgrp:改变文件所在的群组
格式:chgrp [参数] 用户组名 文件名
4.umask:(改变)文件掩码
文件和目录在创建时有默认的权限,文件为0666(因为文件默认不能执行),目录为0777(目录默认能够进入)。
但这还不是最终的默认权限,比如我们不想让others有修改我的文件、目录的权限,这时候umask文件掩码就上场了,我们可以让umask为0002,代表去掉others的w权限,那么
最终的默认权限 = 原始的默认权限 - umask
因此文件的最终默认权限为0664,文件夹的最终默认权限为0775
- umask:查看当前umask的值
- umask -S:按字符模式显示去掉当前umask权限后的默认权限
- umask 值:把umask设置为指定值
eg:
但是在关闭shell或者重启后,umaks又恢复到了原来的值,如果想让umask的设置值一直保留下去, 那么需要将该命令写入~/.bashrc文件中。root的umask会拿掉比较多的属性,root的umask默认是0022, 这是基于安全的考虑. 至于一般用户,默认的umask为0002,即保留用户群组的写入权限! 其实,关于默认umask的设置可以参考/etc/bashrc文件,不过,不建议修改该文件。
四、file命令:辨识文件类型
由于Linux系统并不是像Windows系统那样通过扩展名来定义文件类型的,因此用户无法直接通过文件名来进行区别。file命令可以通过分析文件头部信息中的标识信息来显示文件类型,使用很方便。
1.语法
file [选项] 文件或目录
2.常用选项
- -b 列出辨识结果时,不显示文件名称。
- -c 详细显示指令执行过程,便于排错或分析程序执行的情形。
- -f<名称文件> 指定名称文件,其内容有一个或多个文件名称时,让file依序辨识这些文件,格式为每列一个文件名称。
- -L 直接显示符号连接所指向的文件的类别。
- -m<魔法数字文件> 指定魔法数字文件。
- -v 显示版本信息。
- -z 尝试去解读压缩文件的内容。
- [文件或目录...] 要确定类型的文件列表,多个文件之间使用空格分开,可以使用shell通配符匹配多个文件。
五、sudo
1.sudo命令与su命令
(1)sudo命令
Linux是多用户多任务的操作系统, 共享该系统的用户往往不只一个。出于安全性考虑, 有必要通过useradd创建一些非root用户, 只让它们拥有不完全的权限; 如有必要,再来提升权限执行。
sudo就是来解决这个需求的: 这些非root用户不需要知道root的密码,就可以提权到root,执行一些root才能执行的命令。
执行sudo -u <用户名> <命令>, 将允许当前用户,提权到<用户名>的身份,再执行后面的<命令>, 即使<命令>原本需要root权限。提权到<用户名>身份时,是以<用户名>的身份来执行命令的,因此创建的文件默认属于<用户名>用户。如果不带-u, 则默认使用root用户。需要注意的是: 执行sudo时输入的密码是当前用户的密码, 并非<用户名>的密码。
(2)su命令
su [选项] [用户名]
su 命令是 Unix-like 操作系统中的一个命令,用于切换用户身份。su 是 "Switch User" 的缩写
[选项]是一些可选的参数,用于修改su命令的行为,比如-c参数用于执行指定的命令。[用户名]是要切换到的目标用户的用户名。如果不指定用户名,默认会切换到超级用户(root)。
当你运行 su 命令时,系统通常会要求你输入目标用户的密码。如果密码输入正确,你将会以目标用户的身份登录系统。此时你可以执行该用户所允许的操作。
sudo -u <用户名>和su - <用户名>相比:
sudo -u <用户名> :需要输入当前用户的密码,提权到<用户名>身份执行命令后返回当前用户;
su - <用户名>: 则是输入目标用户的密码,切换到目标用户。
2.sudoers文件
(1)sudoers文件用途
sudoers 文件是 Unix-like 操作系统中用于配置 sudo 命令的文件。它定义了哪些用户或用户组有权利执行哪些特定的命令,以及这些命令是否需要密码认证等规则。sudoers 文件的配置允许系统管理员精确地控制系统上的特权操作,以提高系统的安全性。
sudoers 文件的格式相对复杂,它使用了特定的语法规则。通常不推荐直接编辑这个文件,而是使用 visudo 命令,因为它能够在编辑过程中进行语法检查,避免可能引起系统问题的错误。
执行sudo时,系统会主动寻找/etc/sudoers文件,判断该用户是否有执行sudo的权限
确认用户具有可执行sudo的权限后,让用户输入用户自己的密码确认
若密码输入成功,则开始执行sudo后续的命令
(2)sudoers文件格式
对/etc/sudoers文件进行编辑的代码公式可以概括为:
授权用户/组 主机=[(切换到哪些用户或组)] [是否需要输入密码验证] 命令1,命令2,...
eg:
lighthouse ALL=(ALL) NOPASSWD: ALL
%sudo ALL=(ALL:ALL) ALL
我们把用户/组、主机、切换到的用户/组、是否需要密码、命令分为5个字段
"字段1" 不以%号开头的表示"将要授权的用户", 比如例子中的root;以%号开头的表示"将要授权的组", 比如例子中的%wheel组 和 %sudo组。
"字段2" 表示允许登录的主机, ALL表示所有; 如果该字段不为ALL,表示授权用户只能在某些机器上登录本服务器来执行sudo命令
"字段3" 如果省略, 相当于(root:root),表示可以通过sudo提权到root; 如果为(ALL)或者(ALL:ALL), 表示能够提权到(任意用户:任意用户组)。请注意,"字段3"如果没省略,必须使用( )双括号包含起来。这样才能区分是省略了"字段3"还是省略了"字段4"。
"字段4" 的可能取值是NOPASSWD:。请注意NOPASSWD后面带有冒号:。表示执行sudo时可以不需要输入密码。
"字段5" 是使用逗号分开一系列命令,这些命令就是授权给用户的操作; ALL表示允许所有操作。
命令都是使用绝对路径, 这是为了避免目录下有同名命令被执行,从而造成安全隐患。比如你有一个名为useradd的程序,你给一个user用sudo执行该程序的权限,如果使用的是相对路径的话,那user也拥有了添加用户的权限,造成危险。
(3)编辑sudoers文件
在sudoers文件的开头,系统推荐了编辑sudoers的稳妥做法:
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
即我们必须使用visudo命令来编辑sudoers,因为通过visudo修改,如果配置出错,会有提示。
系统文档推荐的做法,不是直接修改/etc/sudoers文件,而是将修改写在/etc/sudoers.d/目录下的文件中。如果使用这种方式修改sudoers,需要在/etc/sudoers文件的最后行,加上#includedir /etc/sudoers.d一行(默认已有)
注意了,这里的指令#includedir是一个整体, 前面的#号不能丢,并非注释,也不能在#号后有空格。任何在/etc/sudoers.d/目录下,不以~号结尾的文件和不包含.号的文件,都会被解析成/etc/sudoers的内容
sudoers.d/README文档如下:
#
# The default /etc/sudoers file created on installation of the
# sudo package now includes the directive:
#
# @includedir /etc/sudoers.d
#
# This will cause sudo to read and parse any files in the /etc/sudoers.d
# directory that do not end in '~' or contain a '.' character.
#
# Note that there must be at least one file in the sudoers.d directory (this
# one will do).
#
# Note also, that because sudoers contents can vary widely, no attempt is
# made to add this directive to existing sudoers files on upgrade. Feel free
# to add the above directive to the end of your /etc/sudoers file to enable
# this functionality for existing installations if you wish! Sudo
# versions older than the one in Debian 11 (bullseye) require the
# directive will only support the old syntax #includedir, and the current
# sudo will happily accept both @includedir and #includedir
#
# Finally, please note that using the visudo command is the recommended way
# to update sudoers content, since it protects against many failure modes.
# See the man page for visudo and sudoers for more information.
#
六、粘滞位
回顾一下目录的权限:
- r:允许用户列出目录中的文件和子目录
- w:允许用户在目录中删除、新建文件和子目录
- x:允许用户进入该目录
思考:如果用户b拥有文件夹dir的w权限,dir中有个用户a的的文件a.txt,a.txt的权限是不允许others写入的,也就不允许others删除该文件。但由于b有了dir的w权限,从而b可以删除a.txt,演示如下:
可以看到,只给了一条提示:
rm: remove write-protected regular empty file 'ubuntu_dir/ubuntu.txt'?就可以允许用户lighthouse删除ubuntu用户的ubuntu.txt文件了
为了解决这个问题,我们引入一个粘滞位t
使用chmod +t dir命令可以设置粘滞位
可以看到others的x权限变成了't',此时others即使有dir的w权限,也无法更改/删除dir中属于其他用户并且others没有w权限的文件了。
使用chmod -t dir可以去掉dir的粘滞位,由于粘滞位成立的前提是others要有dir的x权限,因此规定others没有dir的x权限时,粘滞位显示'T',此时粘滞位无效,相当于权限为‘-’
粘滞位对文件无效