小土豆Linux学习随笔
—— 清听凌雪慕忆
Hi,大家好!
我是小土豆,一名Lad、IT搬砖工人。
深受周围IT牛的影响哈, 作者也坚定学习方向、自律,步履不停,永无休止。Linux运维、Python等的学习过程中,不断实操完善学习笔记,如有错误烦请各位大牛指正。同时,帮助更多的爱好者入门,共同进步!
在Linux系统中,每个文件都有归属的所有者和所属组,并且规定了文件的所有者、所属组以及其他人对文件所拥有的可读(r)、可写(w)、可执行(x)等权限。
可读 :表示能够读取文件的实际内容;
可写:表示能够编辑、新增、修改、删除文件的实际内容;
可执行:表示能够运行一个脚本程序。
可读、可写、可执行权限对应的命令在文件和目录上是有区别的 ,具体如下所示:
权限 | 文件 | 目录 |
---|---|---|
读取(r) | cat | ls |
写入(w) | vim | touch |
执行(x) | ./script | cd |
文件的可读、可写、可执行权限的英文全称分别是read、write、execute,可以简写为r、w、x,亦可分别用数字4、2、1来表示,文件所有者、文件所属组及其他用户权限之间无关联 。
- 若某个文件的权限为7,则代表可读、可写、可执行(4+2+1);若权限为6,则代表可读、可写(4+2)。
- 现在一个文件,其所有者拥有可读、可写、可执行的权限,其文件所属组拥有可读、可写的权限;其他人只有可读的权限。那么,这个文件的权限就是rwxrw-r–,数字法表示即为764。
减号是占位符,代表这里没有权限,在数字表示法中用0表示。
以上可见,rw-转换后是420,r-x转换后是401,-w-转换后是020。然后,将这3组数字之间的每组数字进行相加,得出652,这便是转换后的数字表示权限。
一定要心中牢记 ,文件的所有者、所属组和其他用户的权限之间无关联。
需求: 根据上面阐述,请分析Demo.txt文件信息 。
- 上图所示:包含了文件的类型、访问权限、所有者(属主)、所属组(属组)、占用的磁盘大小、最后修改时间和文件名称等信息。
【文件分析】
- 文件的类型:普通文件;
- 所有者权限:可读、可写(rw-);
- 所属组权限:可读(r–);
- 其他人也有权限:可读(r–);
- 文件的磁盘占用大小:19字节;
- 最近一次的修改时间为6月27日的22:21;
- 文件的名称:Demo.txt。
排在权限前面的减号(-)是文件类型(减号表示普通文件),经常会把它跟“无权限”混淆。
【拓展】:ls、ls -a、ls -l、ls -al、ll、ll -a区别
- ls:仅罗列出当前文件名或目录名 ;
- ls -a:罗列出目录下的所有文件,包括以 . 开头的隐含文件,相当于 ll -a;
- ls -l:列出文件的详细信息,相当于 ll ;
- ls -al:显示当前目录下的所有文件及文件夹包括隐藏的.和…等的详细信息 。
普通文件的范围特别广泛,比如纯文本信息、服务配置信息、日志信息以及Shell脚本等,都属于普通文件。几乎在每个目录下都能看到普通文件(-)和目录文件(d)的身影。
块设备文件(b)和字符设备文件(c)一般是指硬件设备,比如鼠标、键盘、光驱、硬盘等,在/dev/目录中最为常见。应该很少有人会对鼠标、键盘进行硬件级别的管理吧。
在一些应用中,rwx权限无法满足功能需求, Linux中除了rwx权限外,另外还有三种特殊权限:SUID、SGID、SBIT 。此时可以对文件权限进行设置的特殊功能,可以与一般权限同时使用。
SUID, SGID,SBIT显示为小写字母 s,s,t, 在数字权限上与rwx类似,对应三位数的二进制,有权限的位置上为1,无权限的位置上为0。SUID,SGID,SBIT分别表示4,2,1。并且需要在最前面增加一位。
SUID是一种对二进制程序进行设置的特殊权限,能够让二进制程序的执行者临时拥有所有者的权限(仅对拥有执行权限的二进制程序有效)。
- 用户密码保存在/etc/shadow文件中 , 发现它的默认权限是000 , 也就是说除root管理员以外,所有用户都没有查看或编辑该文件的权限。
- 查看passwd命令属性时发现:
(1)普通用户仅有读取权限;
(2)所有者的权限由rwx变成了rws,其中x改变成s也就是该文件被赋予了SUID权限。
- 如果原先权限位上没有x执行权限,那么被赋予特殊权限后将变成大写的S。
综上所述:
当s这个标志出现在文件所有者的x权限上时,此时就被称为Set UID,简称SUID。
【作用】
- SUID权限仅对 二进制可执行文件,对目录无效 ;
- 执行者对于该可执行文件需要具有x权限;
- 在执行过程中,调用者会暂时获得该文件的拥有者权限;
- 该权限只在程序执行的过程中有效, 执行完毕不再拥有所有者权限;
[root@localhost ~]# useradd lvbaoyuan
[root@localhost ~]# passwd lvbaoyuan
更改用户 lvbaoyuan 的密码 。
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[root@localhost ~]# ll /bin/passwd # 查看passwd命令权限
-rwsr-xr-x. 1 root root 27856 4月 1 2020 /bin/passwd
[root@localhost ~]# su lvbaoyuan # 切换到lvbaoyuan
[lvbaoyuan@localhost root]$ pwd
/root
[lvbaoyuan@localhost root]$ passwd # 修改密码
更改用户 lvbaoyuan 的密码 。
为 lvbaoyuan 更改 STRESS 密码。
(当前)UNIX 密码:
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。 # 成功修改密码
[lvbaoyuan@localhost root]$ exit
exit
[root@localhost ~]# chmod u-s /bin/passwd # 修改passwd的权限,去掉suid权限
[root@localhost ~]# ll /bin/passwd
-rwxr-xr-x. 1 root root 964536 4月 1 2020 /bin/passwd # 发现s变成了x
[root@localhost ~]# su lvbaoyuan # 切换到lvbaoyuan
[lvbaoyuan@localhost root]$ passwd
更改用户 lvbaoyuan 的密码 。
为 lvbaoyuan 更改 STRESS 密码。
(当前)UNIX 密码:
passwd: 鉴定令牌操作错误 # 密码无法进行修改
[lvbaoyuan@localhost root]$
**Question:**如果普通用户在使用passwd命令时,是以root用户身份去执行的话,那普通用户是不是可以修改其它用户的密码?
**答:**是不可以的,因为在passwd命令中,存在一种判断,此判断会在执行passwd命令时去判断执行的用户时是root还是普通用户,如果是普通用户,那么只能使用passwd命令,后面不可加上参数,如果是root用户,后面才可加上其它参数(参数就是用户)。那么普通用户就无法进行修改其它用户的密码。
chmod命令(全称:change mode)其用于改变文件或目录权限的命令。默认只有文件的所有者和管理员可以设置文件权限,普通用户只能管理自己文件的权限属性。
【授权方式】
chmod u+s filename
chmod 4xxx filename
[lvbaoyuan@localhost root]$ su root
密码:
[root@localhost ~]# cd /opt
[root@localhost opt]# touch testfile # 创建一个名为testfile的文件
[root@localhost opt]# ll # 查看详细信息
总用量 0
drwxr-xr-x. 2 root root 6 10月 31 2018 rh
-rw-r--r--. 1 root root 0 6月 29 22:08 testfile # 没有属主权限位没有执行权限
[root@localhost opt]# chmod u+s testfile # 在属主权限位上加上s
[root@localhost opt]# ll # 查看详细信息
总用量 0
drwxr-xr-x. 2 root root 6 10月 31 2018 rh
-rwSr--r--. 1 root root 0 6月 29 22:08 testfile # 没有执行权限,所以就显示(大写)S
[root@localhost opt]# chmod u+x testfile # 再添加执行权限
[root@localhost opt]# ll # 查看详细信息
总用量 0
drwxr-xr-x. 2 root root 6 10月 31 2018 rh
-rwsr--r--. 1 root root 0 6月 29 22:08 testfile # 大写S变为小写s,增加了执行权限
[root@localhost opt]# touch testfile2 # 创建一个名为testfile2的文件
[root@localhost opt]# ll # 查看详细信息
总用量 0
-rwsr--r--. 1 root root 0 5月 16 23:40 filename
-rw-r--r--. 1 root root 0 5月 16 23:46 filename2 # 正常创建的权限:644
[root@localhost opt]# chmod 4764 testfile2 # 增加SUID权限,并且增加属主的执行权限,并赋予写入权限
[root@localhost opt]# ll
总用量 0
drwxr-xr-x. 2 root root 6 10月 31 2018 rh
-rwsr--r--. 1 root root 0 6月 29 22:08 testfile
-rwsrw-r--. 1 root root 0 6月 29 22:09 testfile2 # 属主中变成小写s
[root@localhost opt]#
设置给目录使用的,主要目的就是为了使用户无法删除其它用户所创建的文件或目录。
如果该属组权限位上有执行权限,则会显示(小写)s。
如果该属组权限位上没有执行权限,则会显示(大写)S。
当s出现在文件的所属组x权限位置时,表示所属组有SGID的权限。
【作用】
- 既可以作用于目录,也可以作用于可执行文件;
- 只要父目录有SGID权限,所有的子目录都会递归继承;
- 执行者对于该可执行文件需要具有x权限;
- 在执行过程中,调用者会暂时获得该文件的所属组权限;
####【示例1】
[root@localhost opt]# mkdir test_folder # 创建test_folder目录
[root@localhost opt]# ll
总用量 0
drwxr-xr-x. 2 root root 6 10月 31 2018 rh
-rwsr--r--. 1 root root 0 6月 29 22:08 testfile
-rwsrw-r--. 1 root root 0 6月 29 22:09 testfile2
drwxr-xr-x. 2 root root 6 6月 29 22:40 test_folder # 查看权限
[root@localhost opt]# chmod 777 test_folder # 查看权限为777
[root@localhost opt]# ll -d test_folder
drwxrwxrwx. 2 root root 6 6月 29 22:40 test_folder # 权限已修改
[root@localhost opt]# cd test_folder # 切换到test_folder目录
[root@localhost test_folder]# touch test_file3
[root@localhost test_folder]# ll
总用量 0
-rw-r--r--. 1 root root 0 6月 29 22:43 test_file3
[root@localhost test_folder]# mkdir demo1 # 创建demo1目录
[root@localhost test_folder]# ll
总用量 0
drwxr-xr-x. 2 root root 6 6月 29 22:44 demo1 # demo1文件的属主和说数组都是root
-rw-r--r--. 1 root root 0 6月 29 22:43 test_file3
[root@localhost test_folder]# su lvbaoyuan # 切换lvbaoyuan用户
[lvbaoyuan@localhost test_folder]$ cd .. # 返回上一级
[lvbaoyuan@localhost opt]$ cd test_folder # 切换到test_folder目录
[lvbaoyuan@localhost test_folder]$ mkdir demo2 # 创建demo2目录
[lvbaoyuan@localhost test_folder]$ ll
总用量 0
drwxr-xr-x. 2 root root 6 6月 29 22:44 demo1
drwxrwxr-x. 2 lvbaoyuan lvbaoyuan 6 6月 29 22:47 demo2 # demo2文件的属主和属组都是lvbaoyuan用户
-rw-r--r--. 1 root root 0 6月 29 22:43 test_file3
[lvbaoyuan@localhost test_folder]$ exit # 返回root用户
exit
[root@localhost test_folder]# cd ..
[root@localhost opt]# chmod g+s test_folder # 将test_folder目录增加sgid权限
[root@localhost opt]# ll -d test_folder
drwxrwsrwx. 4 root root 50 6月 29 22:47 test_folder # drwxrwsrwx. : 属组的权限已增加了s
[root@localhost opt]# su lvbaoyuan # 切换lvbaoyuan用户
[lvbaoyuan@localhost opt]$ cd test_folder
[lvbaoyuan@localhost test_folder]$ mkdir demo3 # 创建demo3目录
[lvbaoyuan@localhost test_folder]$ ll
总用量 0
drwxr-xr-x. 2 root root 6 6月 29 22:44 demo1
drwxrwxr-x. 2 lvbaoyuan lvbaoyuan 6 6月 29 22:47 demo2
drwxrwsr-x. 2 lvbaoyuan root 6 6月 29 22:49 demo3 #demo3的所属组用户已变为跟test_folder目录一致的用户
-rw-r--r--. 1 root root 0 6月 29 22:43 test_file3
[lvbaoyuan@localhost test_folder]$
【授权方式】
chmod g+s filename # 取消授权则为g-s
chmod 2xxx filename
SBIT全称sticky bit,沾滞位的意思。
如果该其它用户权限位上有执行权限,则会显示(小写)t。
如果该其它用户权限位上没有执行权限,则会显示(大写)T。
当t出现在其他组的x权限位置时,表示其他组具有SBIT的权限。
【作用】
和SUID,SGID不同的是,只能用于目录;
使用者在该目录下,仅自己与root才有权力删除新建的目录或文件 。
最具有代表的就是/tmp目录,任何人都可以在/tmp内增加、修改文件(因为权限全是rwx),但仅有该文件/目录建立者与 root能够删除自己的目录或文件。
只作用在目录上,当一个目录的没有设置sticky bit权限时,并且该目录对所有用户都有读、写、执行权限时,普通用户在该目录下所创建的文件或目录都会被其它用户删除。
[root@localhost opt]# mkdir demo_folder
[root@localhost opt]# ll -d demo_folder
drwxr-xr-x. 2 root root 6 6月 29 23:16 demo_folder
[root@localhost opt]# chmod 777 demo_folder
[root@localhost opt]# ll -d demo_folder
drwxrwxrwx. 2 root root 6 6月 29 23:16 demo_folder
[root@localhost opt]# cd demo_folder
[root@localhost demo_folder]# ll
总用量 0
[root@localhost demo_folder]# mkdir demo_1
[root@localhost demo_folder]# su lvbaoyuan
[lvbaoyuan@localhost demo_folder]$ touch demo.py # 新建文件
[lvbaoyuan@localhost demo_folder]$ ll
总用量 0
drwxr-xr-x. 2 root root 6 6月 29 23:18 demo_1
-rw-rw-r--. 1 lvbaoyuan lvbaoyuan 0 6月 29 23:20 demo.py
[lvbaoyuan@localhost demo_folder]$ exit
exit
[root@localhost /]# useradd lad
[root@localhost /]# pwd
/
[root@localhost /]# cd opt
[root@localhost opt]# su lad # 创建新用户lad
[lad@localhost opt]$ ll
总用量 0
drwxrwxrwx. 3 root root 35 6月 29 23:20 demo_folder
drwxr-xr-x. 2 root root 6 10月 31 2018 rh
-rwsr--r--. 1 root root 0 6月 29 22:08 testfile
-rwsrw-r--. 1 root root 0 6月 29 22:09 testfile2
drwxrwsrwx. 5 root root 63 6月 29 22:49 test_folder
[lad@localhost opt]$ cd demo_folder
[lad@localhost demo_folder]$ ll
总用量 0
drwxr-xr-x. 2 root root 6 6月 29 23:18 demo_1
-rw-rw-r--. 1 lvbaoyuan lvbaoyuan 0 6月 29 23:20 demo.py #可以看到lvbaoyuan用户所创建文件demo.py
[lad@localhost demo_folder]$ rm -rf demo.py
[lad@localhost demo_folder]$ ll
总用量 0
drwxr-xr-x. 2 root root 6 6月 29 23:18 demo_1 #demo.py文件已被删除
[lad@localhost demo_folder]$
【授权方式】
chmod o+t filename # 取消授权则为g-s
chmod 1xxx filename
当一个目录设置了sticky bit权限时,普通用户在该目录下所创建的文件或目录,只能被该文件或目录的属主用户或root用户删除,其它用户无法删除别的用户所创建的目录或文件。
[root@localhost opt]# ll
总用量 0
drwxrwxrwx. 3 root root 20 6月 29 23:23 demo_folder # 权限为777
drwxr-xr-x. 2 root root 6 10月 31 2018 rh
-rwsr--r--. 1 root root 0 6月 29 22:08 testfile
-rwsrw-r--. 1 root root 0 6月 29 22:09 testfile2
drwxrwsrwx. 5 root root 63 6月 29 22:49 test_folder
[root@localhost opt]# chmod o+t demo_folder # 增加sticky bit权限
[root@localhost opt]# ll -d demo_folder # 查看demo_folder目录详细信息
drwxrwxrwt. 3 root root 20 6月 29 23:23 demo_folder # 其它用户上权限多了sticky bit权限
[root@localhost opt]# cd demo_folder
[root@localhost demo_folder]# touch demo1.py # 创建一个文件
[root@localhost demo_folder]# ll
总用量 0
drwxr-xr-x. 2 root root 6 6月 29 23:18 demo_1
-rw-r--r--. 1 root root 0 6月 29 23:31 demo1.py
[root@localhost demo_folder]# exit
exit
[lvbaoyuan@localhost root]$ su lvbaoyuan
密码:
su: 鉴定故障
[lvbaoyuan@localhost root]$ cd /opt/demo_folder
[lvbaoyuan@localhost demo_folder]$ touch demo2.py # 创建一个文件
[lvbaoyuan@localhost demo_folder]$ ll
总用量 0
drwxr-xr-x. 2 root root 6 6月 29 23:18 demo_1
-rw-r--r--. 1 root root 0 6月 29 23:31 demo1.py
-rw-rw-r--. 1 lvbaoyuan lvbaoyuan 0 6月 29 23:32 demo2.py
[lvbaoyuan@localhost demo_folder]$ exit
exit
[root@localhost ~]# passwd lad 对新建的lad用户设置密码
更改用户 lad 的密码 。
新的 密码:
无效的密码: 密码未通过字典检查 - 过于简单化/系统化
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[root@localhost ~]# su lad # 切换到lad用户
[lad@localhost root]$ cd /opt/demo_folder # 进入demo_folder目录
[lad@localhost demo_folder]$ ll
总用量 0
drwxr-xr-x. 2 root root 6 6月 29 23:18 demo_1
-rw-r--r--. 1 root root 0 6月 29 23:31 demo1.py # 可以查看到root用户创建的文件
-rw-rw-r--. 1 lvbaoyuan lvbaoyuan 0 6月 29 23:32 demo2.py # 可以查看到lvbaoyuan用户创建的文件
[lad@localhost demo_folder]$ rm -rf *.py # 对目录下的.py格式文件进行删除
rm: 无法删除"demo1.py": 不允许的操作
rm: 无法删除"demo2.py": 不允许的操作 # 无法进行删除
[lad@localhost demo_folder]$
SUID、SGID、SBIT特殊权限的设置参数
参数 | 作用 |
---|---|
u+s | 设置SUID权限 |
u-s | 取消SUID权限 |
g+s | 设置SGID权限 |
g-s | 取消SGID权限 |
o+t | 设置SBIT权限 |
o-t | 取消SBIT权限 |
【拓展】:Linux目录权限整合
SUID、SGID、SBIT对应的数字表示法,分别为4、2、1。这样777还不是最大权限,最大权限应该是7777,其中第1个数字代表的是特殊权限位。Linux目录权限数字表示法是由“特殊权限+一般权限”构成的。
如:rwxr-xr-t权限
最后一位是t,这说明该文件的一般权限为rwxr-xr-x,并带有SBIT特殊权限。对于可读(r)、可写(w)、可执行(x)权限的数字计算方法大家应该很熟悉了—rwxr-xr-x即755,而SBIT特殊权限位是1,则合并后的结果为1755。
下面就以数字权限6764和5537来形象化的了解数字与字符权限之间的转换。