在计算机还只属于科研设备的年代, 为了最大化利用资源, 往往需要一台计算机不断地为多人提供服务(类似目前服务器), 而用户操作计算机的窗口可以是仅拥有最简单输入输出设备的一个键盘和一台显示器. 在这样的背景下, 多用户、多任务系统的概念诞生了.
多用户系统可以在为不同用户提供服务的同时避免用户间彼此影响, 因此衍生出了"权限"的概念. 通俗来说, 权限可以理解为一个用户不能动其他的东西, 也不能够动计算机运行所需的核心文件以免出现系统崩溃.
这一设计理念一直延续至今, 在Linux中的权限管理便是很好地体现.
以下是Linux中常用的权限管理相关命令:
-
id – Display user identity
-
显示用户身份号
-
-
chmod – Change a file’s mode
-
更改文件模式
-
-
umask – Set the default file permissions
-
设置默认的文件权限
-
-
su – Run a shell as another user
-
以另一个用户的身份来运行 shell (切换用户)
-
-
sudo – Execute a command as another user
-
以另一个用户的身份来执行命令
-
-
chown – Change a file’s owner
-
更改文件所有者
-
-
passwd – Change a user’s password
-
更改用户密码
-
文件权限表示
在此前的实验中, 如果你调用过"ls -l"或"ll"命令, 可能会注意到输出的内容中有一段类似"-rwxr-xr-x"的文本. 其实这是Linux中表示文件权限的方式之一.
它的长度为10个字符, 规则如下: 1(文件类型) 2~4(所有者权限) 5~7(用户组权限) 8~10(其他用户权限)
所有者权限、用户组权限、其他用户权限均为3字符, 从左往右分别代表读取、写入、执行权限, 为r、w、x时代表具有该权限, 为-时代表没有该权限.
文件类型则使用-、d、l、c、b之一的字符表示, 分别代表普通文件、目录(文件夹)、符号链接、字符设备文件(传真机、网络设备)、设备文件(硬盘、光驱)
见下表:
属性 | 文件类型 |
---|---|
- | 一个普通文件 |
d | 一个目录 |
l | 一个符号链接。注意对于符号链接文件,剩余的文件属性总是"rwxrwxrwx",而且都是 虚拟值。真正的文件属性是指符号链接所指向的文件的属性。 |
c | 一个字符设备文件。这种文件类型是指按照字节流来处理数据的设备。 比如说终端机或者调制解调器 |
b | 一个块设备文件。这种文件类型是指按照数据块来处理数据的设备,例如一个硬盘或者 CD-ROM 盘。 |
属性 | 文件 | 目录 |
---|---|---|
r | 允许打开并读取文件内容。 | 允许列出目录中的内容,前提是目录必须设置了可执行属性(x)。 |
w | 允许写入文件内容或截断文件。但是不允许对文件进行重命名或删除,重命名或删除是由目录的属性决定的。 | 允许在目录下新建、删除或重命名文件,前提是目录必须设置了可执行属性(x)。 |
x | 允许将文件作为程序来执行,使用脚本语言编写的程序必须设置为可读才能被执行。 | 允许进入目录,例如:cd directory 。 |
例子:
文件属性 | 含义 |
---|---|
-rwx------ | 一个普通文件,对文件所有者来说可读、可写、可执行。其他人无法访问。 |
-rw------- | 一个普通文件,对文件所有者来说可读可写。其他人无法访问。 |
-rw-r--r-- | 一个普通文件,对文件所有者来说可读可写,文件所有者的组成员可以读该文件,其他所有人都可以读该文件。 |
-rwxr-xr-x | 一个普通文件,对文件所有者来说可读、可写、可执行。也可以被其他的所有人读取和执行。 |
-rw-rw---- | 一个普通文件,对文件所有者以及文件所有者的组成员来说可读可写。 |
lrwxrwxrwx | 一个符号链接,符号链接的权限都是虚拟的,真实的权限应该以符号链接指向的文件为准。 |
drwxrwx--- | 一个目录,文件所有者以及文件所有者的组成员可以访问该目录,并且可以在该目录下新建、重命名、删除文件。 |
drwxr-x--- | 一个目录,文件所有者可以访问该目录,并且可以在该目录下新建、重命名、删除文件,文件所有者的组成员可以访问该目录,但是不能新建、重命名、删除文件。 |
chmod
chmod命令源自"change mode"的简写, 它用于改变文件或目录的权限(mode); 但需要注意只有文件的所有者(拥有者)或者超级用户(root)才能更改文件或目录的权限.
chmod支持两种不同的权限表达法, 一种是上面提到的文字符号表达法, 还有一种是8进制表达法. 文字表达法此处不做赘述, 详细可以看后文的应用部分, 此处主要介绍8进制表达法.
由于Linux中的用户权限表示为读、写、执行三项权限, 并且每一项可以看做是一个开关, 因此可以映射到2进制的0(关)跟1(开)上.
文字符号表达法与8进制表达法与2进制的关系可以见下表:
八进制 | 二进制 | 文字符号表达法 |
0 | 000 | --- |
1 | 001 | --x |
2 | 010 | -w- |
3 | 011 | -wx |
4 | 100 | r-- |
5 | 101 | r-x |
6 | 110 | rw- |
7 | 111 | rwx |
这样, 我们就可以通过一个8进制数字表达一组用户权限了, 而Linux中一个文件或目录有3组用户权限(所有者, 组, 其他用户), 因此在chmod命令中总共需要使用3个8进制数字依次表达我们所需要设置的权限(实际上可以是4个, 但此处不做展开, 看下面umask).
示例如下:
此外, chmod还支持使用文字符号表达法, 但chmod使用的文字符号表达法与ll中所输出的格式略有不同. chmod需要使用的文字符号表达法包括三部分, 分别是 谁的权限 造成什么改变 改变什么权限.
谁的权限: 选择u、g、o、a进行表示, 可以同时是多个, 默认是a, 见表
u | "user"的简写,意思是文件或目录的拥有者。 |
g | "groups"的简写, 意思是用户组。 |
o | "others"的简写,意思是其他所有的人。 |
a | "all"的简写,是"u", "g"和“o”三者的联合。我们联合!(bushi |
造成什么改变: 选择+, -, =之一进行表示, 分别代表新增, 移除, 除制定的权限外其余全部删除.
改变什么权限: 与上文所介绍的文字符号表达法相同, r w x分别表示读权限、写权限、执行权限.
以下是示例:
u+x | 为文件所有者添加可执行权限。 |
u-x | 删除文件所有者的可执行权限。 |
+x | 为文件所有者,用户组,和其他所有人添加可执行权限。 等价于 a+x。 |
o-rw | 除了文件所有者和用户组,删除其他人的读权限和写权限。 |
go=rw | 给文件所属的组和文件所属者/组以外的人读写权限。如果文件所属组或其他人已经拥有执行的权限,执行权限将被移除。 |
u+x,go=rw | 给文件拥有者执行权限并给组和其他人读和执行的权限。多种设定可以用逗号分开。 |
umask
在新建一个文件时, 文件的默认权限可以通过umask命令设置, umask同样的使用8进制权限表示法.
截至目前, 0002与-rw-rw-r--的关系似乎不太明了, 接下来我们进行新的一轮尝试:
上图中, 我们将umask显式设置为了0022, 而我们创建文件时却得到了-rw-r--r--的权限;
为什么会这样? 其实答案就在umask的命令名字中, umask意为掩码, 而mask则是掩膜、蒙版的意思.
起这样的命令名字其实是有它存在的意义的; 在Linux中, 默认的文件权限为 "--- rw- rw- rw-", 即8进制的0666, 而创建时则会与umask的值进行一个逐位的异或(与非)运算, 相同得0, 不同得1. 拿umask=0002(000 000 000 010)为例:
原始文件权限 |
--- rw- rw- rw- 000 110 110 110 |
umask | 000 000 000 010 |
最终文件权限 |
--- rw- rw- r-- 000 110 110 100 |
再拿umask=0022(000 000 010 010)为例:
原始文件权限 |
--- rw- rw- rw- 000 110 110 110 |
umask | 000 000 010 010 |
最终文件权限 |
--- rw- r-- r-- 000 110 100 100 |
在大多数情况下, 我们不需要对umask进行修改, 但在高安全级别下请知悉我们能够控制umask的值.
在对各种权限表示方法有一定理解以后, 我们需要引入一个新的概念, 它解释了umask为什么使用4位八进制数表达权限而非3位(chmod也适用);
其实最高位的数据表达的其实是Linux中的特殊权限: 4=setuid, 2=setgid, 1=sticky; 他们分别具有不同的含义:
setuid
当程序执行时, 程序所拥有的权限是程序所有者的而非当前执行者的.
该权限对目录无效(无影响)
该权限仅可以设置在"u"(user)位
setgid
当程序执行时, 程序所拥有的权限是程序所在组的而非当前执行者的.
如果目标是一个目录, 那么所有在该目录中新建的文件都将归目录的组所有者所有.
该权限仅可以设置在"g"(groups)位
这两个特殊权限有可能会使程序可以访问当前用户无法访问的路径(如某程序所有者是root时, 在权限中声明了setuid权限, 那么程序就可以访问任何路径不受限制)
sticky
这是一个保护权限, 当声明了该权限时, 除了所有者和root用户以外的所有人都无法删除或重命名该文件或目录.
该权限仅可以设置在"o"(others)位
在文字符号表示法中, 同样可以表示这三个权限, 它们的表示位置位于程序执行权限处(x), 当程序执行权限为s或t时, 表示该用户拥有特殊权限(或限制). 具体看实例:
- rws rw- rw- | 具有setuid权限 |
- rw- rws rw- |
具有setgid权限 |
- rw- rw- rwt |
具有sticky保护 |
它们三者表示如下:
八进制最高位 | 含义 |
4 | setuid权限 |
2 | setgid权限 |
1 | sticky权限 |
6(2+4) | 同时具有setuid和setgid权限(能这么设置, 但是有没有用没试过) |
文字符号表达法(设置用) | 含义 |
u+s | 赋予setuid权限 |
g+s | 赋予setgid权限 |
o+t | 赋予sticky权限 |
u+s,g+s | 同时具有setuid和setgid权限(能这么设置, 但是有没有用没试过) |
试验完成后记得把umask改回0002
su
当我们需要切换用户时, 就需要使用su命令:
su root
这将使当前终端切换到root用户(当然这需要root用户的密码), 如果成功切换, 将来该终端所执行的所有命令都将以root的用户权限执行. 并且所有的运行环境也将是切换后用户(root)的.
sudo
sudo与su类似, 它们的区别之一在于sudo不会切换终端目前的登录用户, 而su会.
换言之sudo只生效于当前这一行命令, 而su则会持续到显式切换用户为止.
sudo pwd
上述代码将使用root用户的权限执行pwd命令. 但用户权限仅保持到这一行命令执行完成便会恢复原本登陆的用户权限.
并且在命令运行的过程中, 环境变量依旧保持为当前登录用户而非目标用户(root)
除此之外, sudo与su还有一个显著的区别, sudo命令调用时仅需要验证当前用户的密码就可以取得其他用户的权限(一般是root), 也就是说它保证了root(或其他)用户的密码只有其本人知道;
在Ubuntu系统的默认设置中, 更是不允许用户登录root账户(无法设置root密码因此无法登陆), 用户只能通过sudo命令取得root权限, 这在一定程度上保证了系统的稳定性以及安全性.
但请注意, sudo命令有一定的使用前提, 若未经授权的用户尝试使用sudo获取权限则会被拒绝.
chown
在上文中我们介绍了用于修改文件或目录权限的chmod命令, 而本节中所介绍的chown则是为修改文件或目录的所有者而提供的命令.
它的使用方法如下:
chown [owner][:[group]] file...
以下是参数实例:
参数 | 结果 |
---|---|
bob | 把文件所有者从当前属主更改为用户 bob。 |
bob:users | 把文件所有者改为用户 bob,文件用户组改为用户组 users。 |
:admins | 把文件用户组改为组 admins,文件所有者不变。 |
bob: | 文件所有者改为用户 bob,文件用户组改为用户 bob 登录系统时所属的用户组。 |
passwd
说起权限和用户就不得不提到密码这一话题, Linux为我们提供了passwd这一命令用于修改用户密码.
语法如下:
passwd [user]
如果不指定user那么将会修改当前登录账号的密码;
如果当前用户有root权限, 那么它将可以修改其他用户的密码, 否则将被拒绝.
并且passwd还提供了参数用于控制账号冻结, 密码失效等管理功能, 详细可以查看文档.
在使用passwd修改密码时, passwd 命令将会试着强迫你使用“强”密码。这意味着它会拒绝接受太短的密码、与先前相似的密码、 字典中的单词作为密码或者是太容易猜到的密码.
以上就是本章的全部内容, 此处还有一系列的命令行程序,可以用来创建和维护用户和用户组, 此处今予以罗列不做展开。更多信息,查看可以下命令的手册页:
-
adduser
-
useradd
-
groupadd