The Linux Command Line——10. 权限

• id      –显示用户身份号
• chmod    –更改文件模式
• umask    –设置默认的文件权限
• su      –以另一个用户的身份来运行 shell
• sudo     –以另一个用户的身份来执行命令
• chown      –更改文件所有者
• chgrp      –更改文件组所有权
• passwd   –更改用户密码

当我们试图查看一个像/etc/shadow 那样的文件的时候,我们会遇到一个问题。

产生这种错误信息的原因是,作为一个普通用户,我们没有权限来读取这个文件。

在 Unix 安全模型中,一个用户可能拥有文件和目录。当一个用户拥有一个文件或目录时, 用户对这个文件或目录的访问权限拥有控制权。用户反过来又属于一个由一个或多个用户组成的用户组,用户组成员由文件和目录的所有者授予对文件和目录的访问权限。除了对一个用户组授予权限之外,文件所有者可能会给每个人一些权限,在 Unix 术语中,每个人是指整个世界

 

可以用 id 命令,来找到关于你自己身份的信息:

当用户创建帐户之后,系统会给用户分配一个号码,叫做用户 ID或者 uid,然后,为了符合人类的习惯,这个 ID 映射到一个用户名。系统又会给这个用户分配一个原始的组 ID 或者是 gid,这个 gid 可能属于另外的组。

那么这些信息来源于哪里呢?像 Linux 系统中的许多东西一样,来自一系列的文本文件。用户帐户定义在/etc/passwd 文件里面,用户组定义在/etc/group 文件里面。当用户帐户和用户组创建以后,这些文件随着文件/etc/shadow 的变动而修改,文件/etc/shadow 包含了关于用户密码的信息。对于每个用户帐号,文件/etc/passwd 定义了用户(登录)名、uid、gid、帐号的真实姓名、家目录和登录 shell。如果你查看一下文件/etc/passwd 和文件/etc/group 的内容,你会注意到除了普通用户帐号之外,还有超级用户(uid 0)帐号,和各种各样的系统用户

 

读取、写入和执行:

列表的前十个字符是文件的属性。这十个字符的第一个字符表明文件类型。下表是你可能经常看到的文件类型。

剩下的九个字符叫做文件模式,代表着文件所有者、文件组所有者和其他人的读、写和执行权限。

 

chmod -更改文件模式:

更改文件或目录的模式(权限),可以利用 chmod 命令。注意只有文件的所有者或者超级用户才能更改文件或目录的模式。chmod 命令支持两种不同的方法来改变文件模式:八进制数字表示法符号表示法

如果没有指定字符,则假定使用 “all”。执行的操作可能是一个“+”字符,表示加上一个权限,一个“-”,表示删掉一个权限,或者是一个“=”,表示只有指定的权限可用,其它所有的权限被删除。

 

umask -设置默认权限:

当创建一个文件时,umask 命令控制着文件的默认权限。umask 命令使用八进制表示法来表达从文件模式属性中删除一个位掩码。

此刻先忽略掉开头的三个零(我们一会儿再讨论),注意掩码中若出现一个数字 1,则删除文件模式中和这个 1 在相同位置的属性,在这是指其他人的写权限。这就是掩码要完成的任务。掩码的二进制形式中,出现数字 1 的位置,相应地关掉一个文件模式属性。

看一下掩码0022 的作用:

 当你实验完成之后,要记得清理现场:

大多数情况下,你不必修改掩码值,系统提供的默认掩码值就很好了。

 

更改身份:

su 命令用来以另一个用户的身份来启动 shell。

如果不指定用户,那么就假定是超级用户。注意(不可思议地),选项 “-l” 可以缩写为”-”,这是经常用到的形式。

当工作完成后,输入 “exit”,则返回到原来的 shell:

 

sudo -以另一个用户身份执行命令

sudo 命令在很多方面都相似于 su 命令,但是 sudo 还有一些非常重要的功能。管理员能够配置 sudo 命令,从而允许一个普通用户以不同的身份(通常是超级用户),通过一种非常可控的方式来执行命令。

 

chown -更改文件所有者和用户组

chown 命令被用来更改文件或目录的所有者和用户组。使用这个命令需要超级用户权限。chown 命令的语法看起来像这样:

我们有两个用户,janet 拥有超级用户访问权限,而 tony 没有。用户 janet 想要从她的家目录复制一个文件到用户 tony 的家目录。因为用户 janet 想要 tony 能够编辑这个文件,janet 把这个文件的所有者更改为 tony:

我们看到用户 janet 把文件从她的目录复制到 tony 的家目录。下一步,janet 把文件所有者从 root(使用 sudo 命令的原因)改到 tony。通过在第一个参数中使用末尾的 “:” 字符,janet 同时把文件用户组改为 tony 登录系统时,所属的用户组,碰巧是用户组 tony。

 

练习使用权限

假想我们有两个用户,他们分别是 “bill” 和 “karen”。他们都有音乐 CD 收藏品,也愿意设置一个共享目录,在这个共享目录中,他们分别以 Ogg Vorbis 或 MP3 的格式来存储他们的音乐文件。通过 sudo 命令,用户 bill 具有超级用户访问权限。

bill 创建了存储音乐文件的目录:

 

因为 bill 正在他的家目录之外操作文件,所以需要超级用户权限。这个目录创建之后,它具有以下所有权和权限:

 

正如我们所见到的,这个目录由 root 用户拥有,并且具有权限 755。为了使这个目录共享,允许(用户 karen)写入,bill 需要更改目录用户组所有权和权限:

 

 那么这是什么意思呢?它的意思是,现在我们拥有一个目录,/usr/local/share/Music,这个目录由 root 用户拥有,并且允许用户组 music 读取和写入。用户组 music 有两个成员 bill 和karen,这样 bill 和 karen 能够在目录 /usr/local/share/Music 中创建文件。其他用户能够列出目录中的内容,但是不能在其中创建文件。

但是我们仍然会遇到问题。通过我们目前所拥有的权限,在 Music 目录中创建的文件,只 具有用户 bill 和 karen 的普通权限:

 

实际上,存在两个问题。第一个,系统中默认的掩码值是 0022,这会禁止用户组成员编辑属于同组成员的文件。第二个问题是,用户组成员创建的文件和目录的用户组,将会设置为用户的主要组,而不是用户组 music。

通过设置此目录的 setgid 位来解决这个问题:

 

 现在测试一下,看看是否新的权限解决了这个问题。bill 把他的掩码值设为 0002,删除先前的测试文件,并创建了一个新的测试文件和目录:

 

现在,创建的文件和目录都具有正确的权限,允许用户组 music 的所有成员在目录 Music中创建文件和目录。

更改用户密码

使用 passwd 命令,来设置或更改用户密码。

 

只要输入 passwd 命令,就能更改你的密码。shell 会提示你输入你的旧密码和你的新密码:

posted @ 2021-04-19 22:36  北漂的尘埃  阅读(77)  评论(0编辑  收藏  举报