原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。任何不保留此声明的转载都是抄袭。
《调教命令行01》选Linux发行版,就像挑女朋友
《调教命令行02》准备一个冰清玉洁的Linux系统
《调教命令行03》认识一下,感觉不是说来就来的
《调教命令行04》触碰Linux的每个角落(长文)
《调教命令行05》对文件的基本操作
《调教命令行06》条条大道通罗马,罗马罗马你在哪(学习技巧)
《调教命令行07》压缩解压(有64KB彩蛋)
随着年龄的增加,我的经验越来越丰富,而记忆力却越来越差。为了应付繁重的日常事务,我不得不准备了长长的任务清单。每一条事项的背后,都在不断的提醒我:无论生活中充满什么惊喜,还是逃离不了它平庸的本质。
而我对时间,会更加的敏感。每次一次敲击键盘,都会调动骨关节的扭动,留下一洗不可撤回的痕迹:windows的超级用户,名字叫做Administrator
。这个单词太长了,我总也记不住。相对来说,linux的超级用户叫做root,只有四个字母。它的耗能值,比前者要低的多。
我们在第三小节,刚接触命令行的时候,就使用chmod
命令,给普通文本文件,赋予了执行权限。本小节将看一下用户权限
和文件权限
这两个息息相关的概念,
1、添加用户
到现在为止,我们的系统中,还孤零零的只有这一个用户,是时候学学女娲,捏几个小泥人了。
首先创建两个用户:张三(zhang3)、李四(li4)。
[root@localhost ~]# useradd zhang3
复制代码
查看下面命令的三个输出结果。
# 系统中多了一个叫做zhang3的组,group文件保存了系统的组信息
[root@localhost ~]# tail -n1 /etc/group
zhang3:x:1000:
# 系统中多了一个叫做zhang3的用户,shadow文件保存了它们的密码。很多安全渗透就是为了拿到它进行暴力破解
[root@localhost ~]# tail -n1 /etc/shadow
zhang3:!!:18207:0:99999:7:::
# home目录中,多了一个叫做zhang3的目录
[root@localhost ~]# ll /home --full-time
total 0
drwx------. 2 zhang3 zhang3 83 2019-11-06 22:09:33.357165082 -0500 zhang3
复制代码
接下来,给我们刚刚建立的用户,使用passwd
设置一个密码。密码需要输入两次进行确认。如果想要更改密码,可以使用chpasswd
命令。
[root@localhost ~]# passwd zhang3
Changing password for user zhang3.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
复制代码
那么如何删除一个现有的用户呢?这是通过userdel
命令实现的。加上参数f
,会在其他用户使用系统的时候,强制退出。
userdel -f zhang3
复制代码
2、文件权限说明
从上面的命令执行结果中,我们发现了有两件非常有意思的东西。添加用户后,除了在密码文件shadow
中增加了一些内容,同时还在group
文件中添加了信息。这涉及到用户的两个属性:用户名,组名。
一个用户只有一个名称代号,但是可以有多个组。下面命令创建一个密码为123的用户li4
,并给它追加一个叫做zhang3
的组。可以看到/etc/group
文件中的信息变更。
[root@localhost ~]# useradd -G zhang3 -p 123 li4
[root@localhost ~]# tail -n 2 /etc/group
zhang3:x:1000:li4
li4:x:1001:
复制代码
好啦,接下来切换到我们的文件权限上面。为了进行下面命令的验证,我们首先创建一个名字叫confirm777.sh
的脚本文件。为了让脚本对所有用户可见,我们把它创建在/tmp目录下。
cat > /tmp/confirm777.sh <<EOF
echo $USER
id
EOF
复制代码
使用ll
命令查看文件信息。
[root@localhost ~]# ll /tmp/confirm777.sh --full-time
-rw-r--r--. 1 root root 13 2019-11-07 04:25:55.418254935 -0500 confirm777.sh
复制代码
从ll
的命令可以看出,文件的所有者是root用户,文件所属的组,也是root组,它的权限是rw-r--r--
。文件权限分为三部分。
-
所有者权限
,缩写为u
。文件的所有者所拥有的权限。也就是root用户的权限,是rw-
-
组用户权限
,缩写为g
。文件所属组内所有用户的权限。因为root组内只有root一个用户,所以组用户权限是r--
。 -
其他用户权限
,缩写为o
。其他不相关用户的权限,比如我们刚创建的zhang3、li4用户,对文件的权限就是r--
。 -
全部
,缩写为a
,表示对上面三类用户集体操作。
那rw-这些东西是什么意思呢?
-
r
表示可读权限。read。 -
w
表示可写权限。write。 -
x
表示可执行权限。execute。 -
-
权限占位符,表示没有当前权限。
注意:一个用户拥有文件的w权限,并不代表就可以删除文件。w仅仅针对于文件内容来说的。
一个文件,有3类用户,每类用户,有3种权限。使用简单的小学乘法,我们能够得出,一个文件的权限位,需要3x3=9
个标志位表示。
我们的文件名称,叫做confirm777.sh,这个名字是随便起的么?当然不是,777
在linux代表特殊的含义,它代表文件对所有用户具有可读、可写、可执行的权限。可以想象,如果每个文件都有这样的权限,系统将无安全可言。那这一串数字是怎么来的呢?可以看下面的对照表。
-
r
4
读 -
w
2
写 -
x
1
执行
对以上三个属性进行任意组合,可以得到:
-
4
r--
4+0+0 -
6
rw-
4+2+0 -
5
r-x
4+0+1 -
2
-w-
0+2+0 -
3
-wx
0+2+1 -
1
--x
0+0+1 -
7
rwx
4+2+1
3、文件权限更改
下面介绍三个文件权限相关的命令。一般常用的,就是chown和chmod。
chown
更改文件的所有者。
chgrp
更改文件的组。
chmod
更改文件权限。
接下来,我们把confirm777.sh
的所有者和组,修改成刚刚创建的用户zhang3
。
cd /tmp
[root@localhost tmp]# chown zhang3:zhang3 confirm777.sh
[root@localhost tmp]# ll confirm777.sh
-rw-r--r--. 1 zhang3 zhang3 13 Nov 7 04:25 confirm777.sh
复制代码
给文件所有者增加执行权限。然后分别切换到zhang3
,li4
用户执行一下。
通过
su
命令,可以切换到其他用户,一般使用su -
进行环境变量的清理;而命令id
,能够看到当前正在执行的用户信息。
[root@localhost tmp]# chmod u+x confirm777.sh
[root@localhost tmp]# su li4
[li4@localhost tmp]$ ./confirm777.sh
bash: ./confirm777.sh: Permission denied
[li4@localhost tmp]$ exit
exit
[root@localhost tmp]# su zhang3
[zhang3@localhost tmp]$ ./confirm777.sh
root
uid=1000(zhang3) gid=1000(zhang3) groups=1000(zhang3) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
复制代码
可以看到,文件所有者zhang3可以执行文件,但不相关的li4,提示没有权限。接下来,我们验证用户组相关的权限位。
# 去掉zhang3的执行权限
root@localhost tmp]# chmod u-x confirm777.sh
[root@localhost tmp]# ll confirm777.sh
-rw-r--r--. 1 zhang3 zhang3 13 Nov 7 04:25 confirm777.sh
# 增加zhang3组的执行权限,由于li4在zhang3组里,它拥有权限
[root@localhost tmp]# chmod g+x confirm777.sh
[root@localhost tmp]# ll confirm777.sh
-rw-r-xr--. 1 zhang3 zhang3 13 Nov 7 04:25 confirm777.sh
# 切换到zhang3进行执行
[root@localhost tmp]# su - zhang3
[zhang3@localhost tmp]$ ./confirm777.sh
bash: ./confirm777.sh: Permission denied
[zhang3@localhost tmp]$ exit
exit
# 切换到li4进行执行
[root@localhost tmp]# su - li4
[li4@localhost tmp]$ ./confirm777.sh
root
uid=1001(li4) gid=1001(li4) groups=1001(li4),1000(zhang3) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
复制代码
从命令的执行结果可以看出。这次,li4能够执行文件,相反的,zhang3却不能。
我们使用chmod命令来修改文件权限,使用的是类似于a+x
这样的英文字母。拿个脚本来说,初始的权限是rw-r--r--
,也就是644
,在这种情况下,下面的两个脚本等效。
chmod u+x confirm777.sh
chmod 744 confirm777.sh
复制代码
可以看到,第二个命令,使用的是数字样式的权限位,多了一步人脑转换过程。这在日常的使用中,是非常不方便的。所以,使用符号法的表示方式,能够更加直观,非常推荐。
为了更直观的表现这个过程,我专门制作了一张图。
4、目录权限
这里有一个非常有意思的地方。把文件设置成可执行,可以把普通文件变成脚本,目录文件的可执行权限是什么鬼?有什么意义?对文件夹来说:
-
r
表示允许读取目录中的文件名,但不能进入该目录 -
w
表示允许用户修改目录,可以创建、迁移、删除、更名目录下的文件 -
x
可以获得目录下文件的列表,以及进入目录,执行cd命令
关于r和x的区别,可以看下面的命令结果,仔细感受一下它们的区别。一般的,几乎所有的目录,都拥有执行
权限,不要随意对其进行设置。
[root@localhost tmp]# su - li4
[li4@localhost ~]$ cd /tmp
[li4@localhost tmp]$ mkdir nox
[li4@localhost tmp]$ touch nox/{a,b,c,d}
[li4@localhost tmp]$ chmod a-x nox
[li4@localhost tmp]$ ls nox
ls: cannot access nox/a: Permission denied
ls: cannot access nox/b: Permission denied
ls: cannot access nox/c: Permission denied
ls: cannot access nox/d: Permission denied
a b c d
[li4@localhost tmp]$ cat nox/a
cat: nox/a: Permission denied
[li4@localhost tmp]$ chmod a+x nox
[li4@localhost tmp]$ chmod a-r nox
[li4@localhost tmp]$ ls nox
ls: cannot open directory nox: Permission denied
复制代码
5、sticky bit
接下来,我们介绍一个比较烧脑的粘贴位。
假如你要删除一个文件,你可以没有这个文件的写权限,但是你必须要拥有这个文件上级目录的写权限。如何创建一个目录,可以让任何人些人文件,但是又不能删除其他用户的文件?这就是stick bit的作用。粘贴位一般只用于目录上,对文件来说并没有什么用处。粘贴位一般使用t
表示。
我们可以看一个典型的目录/tmp
[root@localhost tmp]# ls -dl /tmp
drwxrwxrwt. 9 root root 4096 Nov 7 06:27 /tmp
复制代码
可以看到,后一位,显示的是t,而不是x,意思是普通用户不能删除其他用户的文件。所有用户在/tmp目录中,都可以随意创建文件,但是却删除不了其他人的文件,即使文件的权限是777
。
[root@localhost tmp]# touch /tmp/stick
[root@localhost tmp]# chown li4:li4 /tmp/stick
[root@localhost tmp]# chmod 777 /tmp/stick
[root@localhost tmp]# su - zhang3
[zhang3@localhost ~]$ rm /tmp/stick
rm: cannot remove ‘/tmp/stick’: Operation not permitted
复制代码
6、小结
本小节创建了两个用户zhang3和li4,并拿它们测试了chown和chmod命令,后介绍了粘贴位。linux比较安全的原因,就是因为有比较详尽的权限划分。但权限是枚双刃剑,超权用户一个命令就可以搞垮系统,许多隐藏的木马,通过提权运行在不为人知的地方。
权限相关的几个命令会经常被使用,下面举几个例子。
# 设置/var/lib/mysql的用户和组为mysql
chown -R mysql:mysql /var/lib/mysql
# 设置目录可读可写,能够上传文件
chmod 777 /var/www/uploads
# 增加本目录下所有sh的执行权限
chomd a+x *.sh
# 变更file为可读可写可执行
chmod u=rwx,g=rwx,o=rwx file
复制代码
7、思考&扩展
1、下面这个命令,执行以后,会发生什么情况?警告:不要执行,哪怕把000改成其他数字。
# R遍历子目录的意思
chmod -R 000 /
复制代码
2、有一天,我看到一个命令chmod u+s file
,文中并没有介绍s
是什么意思,这是什么意思?
3、如何删除一个用户的组?
End
Linux系统的命令是十分枯燥的。本系列不知不觉已经持续了8个周。和预想的一样,它并未取得广泛的欢迎,从它和其他文章迥然的阅读量就可以看出--标题就让人失去了点击的欲望。
技术类文章完全不同于扯淡型的天马行空,耗费的精力也是巨大的,尤其对我一个对正确性有强迫症的人来说。有时候,我会产生迷茫。不知道这依靠兴趣支撑的输出,能够持续多久。
能够翻到结尾,翻到这里的朋友,xjjdog非常感谢。还有几篇就要结束了,加上以前关于Linux的一些文章,已经可以成为一个体系了。如果你跟踪至此,至少已经可以在平常的工作中游刃有余了。
xjjdog
接下来会找一些让人欢迎的主题,而不是这么枯燥的知识点。毕竟,有的时候,人家毕竟还是个可爱的女孩纸嘛。
作者简介:小姐姐味道 (xjjdog),一个不允许程序员走弯路的公众号。聚焦基础架构和Linux。十年架构,日百亿流量,与你探讨高并发世界,给你不一样的味道。我的个人微信xjjdog0,欢迎添加好友,进一步交流。