1. 用户的权限的概念
在Linux下,多个用户可以同时登录一台主机。
在这样的条件下,为了对各个用户的权限进行精细化管理,每个文件都将访问其的用户分为三类角色来进行权限区分:
拥有者:文件和文件目录的所有者:u---User
所属组:文件和文件目录的所有者所在的组的用户:g---Group
**other:其它用户:o---Others **
用ls -l指令可以看到如下的文件属性:
这些文件属性表示的含义如下图:
所属用户即拥有者,所属用户组即所属组。
例如上图中,所有文件的拥有者和所属组都是root。
除了这两种人以外的所有用户都是other,所以不需要记录other。
而文件属性最前面的这一串字符串中,第一位表示该文件的类型:
d:文件夹 -:普通文件 l:软链接(类似Windows的快捷方式) b:块设备文件(例如硬盘、光驱等) p:管道文件 c:字符设备文件(例如屏幕等串口设备) s:套接口文件
后面每三位表示一类人的权限(依次为拥有者,所属组,other)。
每类人的三位权限分别为:
第一位(r/-) :该类用户可以读取文件内容(目录:可以查看目录中的文件)。
第二位(w/-) :该类用户可以修改文件内容(目录:可在该目录下删除/新建文件)。
第三位(x/-) :该类用户可以运行该文件(目录:可以进入到该目录下)。
例如上面图中的test.c的文件属性中的字符串解释为:
普通文件---拥有者可读/可写/不可运行---所属组可读/不可写/不可运行---other不允许任何行为
每个文件对不同用户的角色判定与对不同角色的权限开放程度,就构成了各个用户的权限。
当然,这一说法并不适用于root,root的权限就是一切皆可,可以执行任何操作。
除此之外我们可以看到,只要是目录,任何用户默认都可以运行,这里运行指的是进入该目录。
2. 用户的切换
su指令
用户之间的切换可以使用su指令来做到:
su 目标用户 // 切换到目标用户
su -或su root // 切换到root
root作为超级用户(管理员),在切换成其他用户时无需输入密码。
而普通用户无论是切换到root还是切换到其他普通用户,都需要输入对应用户的密码。
sudo修饰指令
将sudo加到指令前,就表示以管理员(root)的身份执行该指令。
这样的指令在首次执行时,会要求用户输入自己的密码:
输入自己的密码就可以以管理员的身份执行指令,那岂不是每个人都是管理员?还要root来干嘛?
事情肯定不会这么简单,当我们输完密码后会显示这样的报错:
"shishen"用户不在"sudoers"这个文件中, 该次事件将会被报告。
sudoers白名单
"sudoers"这个文件相当于是root为普通用户列的白名单,只有用户被添加到该名单中才可以使用sudo来执行指令。
其中,"/etc/sudoers"就是我们要找的白名单,打开并进入其中(这里要用root账号进行操作,普通用户对该文件没有任何权限,既不可以读也不可以写更不可以执行):
找到这一行,这里就显示了可以使用sudo的用户:
默认情况下只有root,我们可以把shishen也添加进来,除了用户名以外照抄即可:
这下,我们的shishen用户就可以使用sudo,以管理员身份运行指令了:
可以看到,shishen使用管理员身份创建的文件也是属于管理员的。
也就是说,sudo只是给予了某用户临时使用root账号的权力,权限本质上还是root的,该用户的权限本质上也没有提高。
在Windows和树莓派等操作系统中,默认的用户不是管理员,但是在管理员的白名单中,也就是像shishen一样。
3. 文件访问权限的相关设置方法
chmod指令
设置文件的访问权限:
chmod [参数] 权限 文件名
常用选项:
-R:递归修改目录文件的权限
说明:只有文件的拥有者和root才可以改变文件的权限
这里的权限用"用户表示符+/-=权限字符"表示:
+:向权限范围增加权限代号所表示的权限
-:向权限范围取消权限代号所表示的权限
=:向权限范围赋予权限代号所表示的权限
用户表示符:
u:拥有者
g:拥有者同组用
o:其它用户
a:所有用户
八进制表示权限
权限符号(读写运行)二进制八进制--x0011-w-0102r--1004-wx0113r-x1015rw-1106rwx1117---0000
基于上表,我们用三位的八进制数来表示权限,从高到低依次表示拥有者,所属组,other的权限。例如:
666 等价于 u=rw g=rw o=rw
777 等价于 u=rwx g=rwx o=rwx
chown指令
修改文件的拥有者:
chown [参数] 用户名 文件名 // 修改拥有者
chown [参数] 用户名:用户名 // 修改拥有者和所属组
同样具有"-R"选项。
chgrp指令
修改文件的所属组:
chgrp [参数] 用户组名 文件名
同样具有"-R"选项。 这里就不作演示了。
4. umask
Linux中,文件的默认权限是0666,而目录的默认权限是0777(不用在意开头一位0)。
umask则是用于定义新创建文件或目录的默认权限。
它通过一个权限掩码来决定新创建的文件或目录应该具有哪些权限,即通过掩码的方式来遮盖(或取消)对应的权限位。
Umask的工作原理是通过从文件或目录的默认权限中去除特定的权限,从而确定最终的文件或目录权限:
实际默认权限 = 默认权限 & (~umask掩码)
使用umask指令可以查看或修改umask掩码:
umask // 查看掩码
umask 四位八进制数 // 设置掩码
5. 粘滞位
要实现多用户共享文件的话,我们可以用root账户(根目录的拥有者是root,只有root由权限在根目录创建目录)在根目录下新建一个将所有权限放开的目录。
这样,所有用户都可以在该目录下进行协作。
但问题是,将共享目录的w权限向所有人放开,意味着所有用户不仅能在该目录下创建文件,而且可以删除该目录下的任意文件,无论该文件的拥有者是否是删除者。
这很明显不是我们想要的,安全的协作环境,难免有人会因为各种各样的原因想要删掉你在共享目录下创建的文件。
为了解决这个问题,我们引入了粘滞位的概念。
粘滞位,即除了"rwx"以外的额外的"t"标记,被"t"标记的目录中,other只能新建文件而不能删除。
chmod +t 共享目录
粘滞位不需要指明为"o+t",直接"+t"即可,"t"会覆盖other权限的x。
粘滞位是因共享文件而产生的,而共享文件必定创建在根目录下,其拥有者和所属组都是root,因此只需要限制other即可(反正root想限制也限制不了)。
版权归原作者 大筒木老辈子 所有, 如有侵权,请联系我们删除。