权限
摘要:Unix或类Unix操作系统是多任务多用户系统。意味着多个用户可以在同一时间使用同一台计算机。那么,如何避免用户彼此之间的影响呢?权限,本章将介绍权限。
权限
本章将会介绍到以下命令:
- id - 显示用户身份号
- chmod - 更改文件模式
- umask - 设置默认的文件权限
- su - 以另一个用户的身份来运行shell
- sudo - 以另一个用户的身份来执行命令
- chown - 更改文件所有者
- chgrp - 更改文件所有权
- passwd - 更改用户密码
拥有者、组成员和其他人
用户拥有一个文件或目录时,用户对该文件或目录的访问权限拥有控制权。这个用户属于有一个或多个用户组成的用户组,这个用户可以授予该用户组该文件或目录的访问权限,也可以给其他人。
用id
命令,可以查看自己的身份信息:
xuxg@xuxg-ubuntu:~$ id
uid=1000(xuxg) gid=1000(xuxg) groups=1000(xuxg),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),116(lpadmin),126(sambashare)
以上是Ubuntu的输出结果,Ubuntu系统从1000开始进行普通用户的编号。uid是当前用户的id号,这个id号映射到一个用户名(xuxg);gid是系统给这个用户分配的原始组的id号,这个gid可能属于其他用户组。(在这里,属于groups这个大组)。
用户帐户定义在/etc/passwd 文件里面,用户组定义在/etc/group 文件里面。当用户帐户和用户组创建以后,这些文件随着文件/etc/shadow 的变动而修改,文件/etc/shadow 包含了关于用户密码的信息。对于每个用户帐号,文件/etc/passwd 定义了用户(登录)名、uid、gid、帐号的真实姓名、家目录和登录 shell。如果你查看一下文件/etc/passwd 和文件/etc/group 的内容,你会注意到除了普通用户帐号之外,还有超级用户(uid 0)帐号,和各种各样的系统用户。
现在的Linux 会创建一个独一无二的,只有一个成员的用户组,这个用户组与用户同名。这样使某种类型的权限分配更容易些。
读取、写入和执行
对于文件和目录的访问权力是根据读访问、写访问和执行访问来定义的。
xuxg@xuxg-ubuntu:~$ > foo.txt
xuxg@xuxg-ubuntu:~$ ls -l foo.txt
-rw-r--r-- 1 xuxg xuxg 0 Mar 14 08:40 foo.txt
列表的前十个字符是文件的属性。这十个字符的第一个字符表明文件类型。下表列出常见的文件类型:
属性 | 文件类型 |
---|---|
- | 一个普通文件 |
d | 一个目录 |
l | 一个符号链接。注意对于符号链接文件,剩余的文件属性总是”rwxrwxrwx”,而且都是虚拟值。真正的文件属性是指符号链接所指向的文件的属性。 |
c | 一个字符设备文件。这种文件类型是指按照字节流来处理数据的设备。比如说终端机或者调制解调器 |
b | 一个块设备文件。这种文件类型是指按照数据块来处理数据的设备。例如一个硬盘或者 CD-ROM 盘。 |
剩下的九个字符叫做文件模式,每三个字符一组,依次代表着文件所有者、文件组所有者和其他人的读、写和执行权限。当设置文件模式后,r、w 和 x 模式属性对文件和目录会产生以下影响:
属性 | 如果是 文件(-) | 如果是 目录(d) |
---|---|---|
r | 允许打开并读取文件内容。 | 允许列出目录中的内容,前提是目录必须设置了可执行属性(x)。 |
w | 允许写入文件内容或截断文件。但是不允许对文件进行重命名或删除,重命名或删除是由目录的属性决定的。 | 允许在目录下新建、删除或重命名文件,前提是目录必须设置了可执行属性(x)。 |
x | 允许将文件作为程序来执行,使用脚本语言编写的程序必须设置为可读才能被执行。 | 允许进入目录,例如:cd directory 。 |
chmod - 更改文件模式
利用chmod
命令可以更改文件或目录的模式(权限)。注意只有文件的所有者或者超级用户才能更改文件或目录的模式。
chmod
命令支持两种不同的方法来改变文件模式:八进制数字表示法或符号表示法。
-
八进制数字表示法
因为每个八进制数字代表了 3 个二进制数字,这种对应关系,正好映射到用来存储文件模式所使用的方案上。下表展示了我们所要表达的意思:
八进制 二进制 文件模式 0 000 — 1 001 –x 2 010 -w- 3 011 -wx 4 100 r– 5 101 r-x 6 110 rw- 7 111 rwx 这样,通过使用 3 个八进制数字,我们能够设置文件所有者、用户组和其他人的权限:
xuxg@xuxg-ubuntu:~$ ls -l foo.txt -rw-r--r-- 1 xuxg xuxg 0 Mar 14 08:40 foo.txt xuxg@xuxg-ubuntu:~$ chmod 600 foo.txt xuxg@xuxg-ubuntu:~$ ls -l foo.txt -rw------- 1 xuxg xuxg 0 Mar 14 08:40 foo.txt
-
符号表示法
符号表示法分为三部分:更改会影响谁,要执行哪个操作,要设置哪种权限。通过字符“u”、“g”、“o”和“a”的组合来指定要影响的对象,如下所示:
字符 意义 u ”user” 的简写,意思是文件或目录的所有者。 g 用户组 o ”others” 的简写,意思是其他所有的人。 a ”all” 的简写,是”u”, ”g” 和“o”三者的联合。 如果没有指定字符,则假定使用
all
。执行的操作可能是一个+
字符,表示加上一个权限;一个-
,表示删掉一个权限;或者是一个=
,表示只有指定的权限可用,其它所有的权限被删除。实例:实例 含义 u+x 为文件所有者添加可执行权限。 u-x 删除文件所有者的可执行权限。 +x 为文件所有者、用户组、其他人添加可执行权限。等价于 a+x。 o-rw 除了文件所有者和用户组,删除其他人的读权限和写权限。 go=rw 给文件所属的组和文件所属者/组以外的其他人读写权限(rw)。如果文件所属组或其他人已经拥有执行的权限(x),执行权限将被移除。 u+x,go=rw 给文件拥有者执行权限并给组和其他人读和执行的权限。多种设定可以用逗号分开。
当然,也可以通过图形界面来修改文件访问权限,右键就可以看到。
umask - 设置默认权限
当创建一个文件时,umask
命令控制着文件的默认权限。umask
命令使用八进制表示法来表达从文件模式属性中删除一个位掩码。
xuxg@xuxg-ubuntu:~$ rm -f foo.txt
xuxg@xuxg-ubuntu:~$ umask
0022
xuxg@xuxg-ubuntu:~$ > foo.txt
xuxg@xuxg-ubuntu:~$ ls -l foo.txt
-rw-r--r-- 1 xuxg xuxg 0 Mar 14 09:39 foo.txt
xuxg@xuxg-ubuntu:~$ rm foo.txt
xuxg@xuxg-ubuntu:~$ umask 0000
xuxg@xuxg-ubuntu:~$ > foo.txt
xuxg@xuxg-ubuntu:~$ ls -l foo.txt
-rw-rw-rw- 1 xuxg xuxg 0 Mar 14 09:41 foo.txt
在上边的例子中,我们先删除文件foo.txt
以重新开始。运行不带参数的umask
命令查看当前掩码值,为0022
,这个数值是掩码的八进制表示形式。然后,我们重新创建了文件foo.txt
,查看一下它的权限,发现文件所有者得到读写权限,而用户组和其他人只得到读权限。用户组和其他人没有得到写权限是由掩码值决定的。
接着,我们重复实验,这次自己设置掩码值为0000
,再查看一下权限,发现所有者、用户组和其他人都得到了读写权限。
为了弄明白这是咋回事,需要了解一下掩码的八进制形式的作用。我们把掩码值展开成二进制形式然后与文件的属性比较一下,看看什么区别:
原始文件模式(三者都有读写权限) | -rw-rw-rw- |
---|---|
掩码0022的二进制形式 | 000 000 010 010 |
结果 | -rw-r–r-- |
先忽略掉开头的三个0,我们可以发现,如果掩码中出现一个1,则删除原始文件模式中和这个1在相同位置的权限(在上表中是用户组和其他人的写权限),这就是掩码完成的任务。
掩码的二进制形式中,出现数字 1 的位置,相应地关掉一个文件模式属性。
更改身份
有三种方式,可以拥有多重身份:
- 注销系统并以其他用户身份重新登录系统。
- 使用
su
命令。 - 使用
sudo
命令。
su - 以其他用户身份和组 ID 运行一个 shell
su
命令用来以另一个用户的身份来启动 shell。这个命令语法看起来像这样:
su [-[l]] [user]
如果包含 -l
选项,那么会为指定用户启动一个需要登录的 shell。这意味着会加载此用户的 shell 环境,并且工作目录会更改到这个用户的家目录。
如果不指定用户,那么就假定是超级用户。注意,选项 -l
可以缩写为-
,这是经常用到的形式。启动超级用户的 shell,我们可以这样做:
xuxg@xuxg-ubuntu:~$ su -
Password:
root@xuxg-ubuntu:~# exit //输入exit回到原来的shell
logout
xuxg@xuxg-ubuntu:~$
sudo - 以另一个用户身份执行命令
su
和 sudo
之间的一个重要区别是 sudo
不会重新启动一个 shell,也不会加载另一个用户的 shell 运行环境。
sudo
命令不要求超级用户的密码,使用 sudo
命令时,用户使用他/她自己的密码来认证。
chown - 更改文件所有者和用户组
chown
命令被用来更改文件或目录的所有者和用户组。使用这个命令需要超级用户权限。语法如下:
chown [owner][:[group]] file...
chown
可以根据这个命令的第一个参数更改文件所有者和/或文件用户组。这里有一些例子:
参数 | 结果 |
---|---|
bob | 把文件所有者从当前属主更改为用户 bob。 |
bob:users | 把文件所有者改为用户 bob,文件用户组改为用户组 users。 |
:admins | 把文件用户组改为组 admins,文件所有者不变。 |
bob: | 文件所有者改为用户 bob,文件用户组改为用户 bob 登录系统时所属的用户组。 |
chgrp - 更改用户组所有权
除了限制多一点之外,chgrp
命令与 chown
命令使用起来很相似。
更改用户密码
passwd
命令用来设置或更改用户密码。
只要输入 passwd
命令,就能更改你的密码。shell 会提示你输入你的旧密码和你的新密码。
passwd
命令将会试着强迫你使用“强”密码。这意味着它会拒绝接受太短的密码、与先前相似的密码、字典中的单词作为密码或者是太容易猜到的密码。