权限

摘要: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命令支持两种不同的方法来改变文件模式:八进制数字表示法或符号表示法。

  1. 八进制数字表示法

    因为每个八进制数字代表了 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
    
  2. 符号表示法

    符号表示法分为三部分:更改会影响谁,要执行哪个操作,要设置哪种权限。通过字符“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 的位置,相应地关掉一个文件模式属性。

更改身份

有三种方式,可以拥有多重身份:

  1. 注销系统并以其他用户身份重新登录系统。
  2. 使用 su 命令。
  3. 使用 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 - 以另一个用户身份执行命令

susudo 之间的一个重要区别是 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命令将会试着强迫你使用“强”密码。这意味着它会拒绝接受太短的密码、与先前相似的密码、字典中的单词作为密码或者是太容易猜到的密码。

全部评论

相关推荐

vegetable_more_exercise:1-1.5万,没错啊,最少是1人民币,在区间内
点赞 评论 收藏
分享
11-06 10:58
已编辑
门头沟学院 嵌入式工程师
双非25想找富婆不想打工:哦,这该死的伦敦腔,我敢打赌,你简直是个天才,如果我有offer的话,我一定用offer狠狠的打在你的脸上
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务