linux 教程 用户和权限
用户身份与能力
Linux 系统的管理员之所以是 root,并不是因为它的名字叫 root,而是因为该用户的身份号码即 UID(User IDentification)的数值为 0。
管理员 UID 为 0:系统的管理员用户。
系统用户 UID 为 1~999:Linux 系统为了避免因某个服务程序出现漏洞而被黑客提权至整台服务器,默认服务程序会由独立的系统用户负责运行,进而有效控制被破坏范围。
普通用户 UID 从 1000 开始:是由管理员创建的用于日常工作的用户。
需要注意的是,UID 是不能冲突的,而且管理员创建的普通用户的 UID 默认是从 1000 开始的(即使前面有闲置的号码)。
为了方便管理属于同一组的用户,Linux 系统中还引入了用户组的概念。通过使用用户组号码(GID,Group IDentification),可以把多个用户加入到同一个组中,从而方便为组中的用户统一规划权限或指定任务。假设一个公司中有多个部门,每个部门中又有很多员工,如果只想让员工访问本部门内的资源,则可以针对部门而非具体的员工来设置权限。例如,通过对技术部门设置权限,使得只有技术部门的员工可以访问公司的数据库信息等。
另外,在 Linux 系统中创建每个用户时,将自动创建一个与其同名的基本用户组,而且这个基本用户组只有该用户一个人。如果该用户以后被归纳到其他用户组,则这个其他用户组称之为扩展用户组。一个用户只有一个基本用户组,但是可以有多个扩展用户组,从而满足日常的工作需要。
1. id 命令
id 命令用于显示用户的详细信息,语法格式为 “id 用户名”。
这个 id 命令是一个在创建用户前需要仔细学习的命令,它能够简单轻松地查看用户的基本信息,例如用户 ID、基本组与扩展组 GID。
1 | ~$ id linuxprobe |
2. useradd 命令
useradd 命令用于创建新的用户账户,语法格式为 “useradd [参数] 用户名”。
可以使用 useradd 命令创建用户账户。使用该命令创建用户账户时,默认的用户家目录会被存放在 /home 目录中,默认的 Shell 解释器为 /bin/bash,而且默认会创建一个与该用户同名的基本用户组。这些默认设置可以根据表 5-1 中的 useradd 命令参数自行修改。
下面使用 useradd 命令创建一个名称为 linuxprobe 的用户:useradd linuxprobe
下面我们提高难度,创建一个普通用户并指定家目录的路径、用户的 UID 以及 Shell 解释器。在下面的命令中,请注意/sbin/nologin,它是终端解释器中的一员,与 Bash 解释器有着天壤之别。一旦用户的解释器被设置为 nologin,则代表该用户不能登录到系统中:
1 | useradd -d /home/linux -u 8888 -s /sbin/nologin linuxdown |
3. groupadd 命令
groupadd 命令用于创建新的用户组,语法格式为 “groupadd [参数] 群组名”。
为了能够更加高效地指派系统中各个用户的权限,在工作中常常会把几个用户加入到同一个组里面,这样便可以针对一类用户统一安排权限。例如在工作中成立一个部门组,当有新的同事加入时就把他的账号添加到这个部门组中,这样新同事的权限就自动跟其他同事一模一样了,从而省去了一系列烦琐的操作。
创建用户组的步骤非常简单,例如使用如下命令创建一个用户组 ronny: groupadd ronny
4. usermod 命令
usermod 命令用于修改用户的属性,英文全称为 “user modify”,语法格式为 “usermod [参数] 用户名”。
前文曾反复强调,Linux 系统中的一切都是文件,因此在系统中创建用户也就是修改配置文件的过程。用户的信息保存在/etc/passwd 文件中,可以直接用文本编辑器来修改其中的用户参数项目,也可以用 usermod 命令修改已经创建的用户信息,比如用户的 UID、基本/扩展用户组、默认终端等。usermod 命令的参数以及作用如表所示。
参数 | 作用 |
---|---|
-c | 填写用户账户的备注信息 |
-d -m | 参数 -m 与参数 -d 连用,可重新指定用户的家目录并自动把旧的数据转移过去 |
-e | 账户的到期时间,格式为 YYYY-MM-DD |
-g | 变更所属用户组 |
-G | 变更扩展用户组 |
-L | 锁定用户禁止其登录系统 |
-U | 解锁用户,允许其登录系统 |
-s | 变更默认终端 |
-u | 修改用户的 UID |
然后将用户 linuxprobe 加入到 root 用户组中,这样扩展组列表中则会出现 root 用户组的字样,而基本组不会受到影响:
usermod -G root linuxprobe
再来试试用 -u 参数修改 linuxprobe 用户的 UID 号码值:
usermod -u 3366 linuxprobe
把用户的解释器终端由默认的 /bin/bash 修改为 /sbin/nologin
usermod -s /sbin/nologin linuxprobe
改回 /bin/bash
usermod -s /bin/bash linuxprobe
5. passwd 命令
passwd 命令用于修改用户的密码、过期时间等信息,英文全称为 “password”,语法格式为“passwd [参数] 用户名”。
普通用户只能使用 passwd 命令修改自己的系统密码,而 root 管理员则有权限修改其他所有人的密码。更酷的是,root 管理员在 Linux 系统中修改自己或他人的密码时不需要验证旧密码,这一点特别方便。既然 root 管理员能够修改其他用户的密码,就表示其完全拥有该用户的管理权限。passwd 命令中的参数以及作用如表所示。
参数 | 作用 |
---|---|
-l | 锁定用户,禁止其登录 |
-u | 解除锁定,允许用户登录 |
–stdin | 允许通过标准输入修改用户密码,如 echo “NewPassWord” | passwd --stdin Username |
-d | 使该用户可用空密码登录系统 |
-e | 强制用户在下次登录时修改密码 |
-S | 显示用户的密码是否被锁定,以及密码所采用的加密算法名称 |
6. userdel 命令
userdel 命令用于删除已有的用户账户,英文全称为 “user delete”,语法格式为 “userdel [参数] 用户名”。
如果确认某位用户后续不会再登录到系统中,则可以通过 userdel 命令删除该用户的所有信息。在执行删除操作时,该用户的家目录默认会保留下来,此时可以使用-r 参数将其删除。userdel 命令的参数以及作用如表所示。
参数 | 作用 |
---|---|
-f | 强制删除用户 |
-r | 同时删除用户及用户家目录 |
在删除一个用户时,一般会建议保留他的家目录数据,以免有重要的数据被误删除。所以在使用 userdel 命令时可以不加参数,写清要删除的用户名称就行:userdel linuxprobe
文件权限与归属
在 Linux 系统中,每个文件都有归属的所有者和所属组,并且规定了文件的所有者、所属组以及其他人对文件所拥有的可读(r)、可写(w)、可执行(x)等权限。对于一般文件来说,权限比较容易理解:“可读”表示能够读取文件的实际内容;“可写”表示能够编辑、新增、修改、删除文件的实际内容;“可执行”则表示能够运行一个脚本程序。但是,对于目录文件来说,理解其权限设置就不那么容易了。很多资深 Linux 用户其实也没有真正搞明白。对于目录文件来说,“可读”表示能够读取目录内的文件列表;“可写”表示能够在目录内新增、删除、重命名文件;而“可执行”则表示能够进入该目录。
文件的可读、可写、可执行权限的英文全称分别是 read、write、execute,可以简写为 r、w、x,亦可分别用数字 4、2、1 来表示,文件所有者、文件所属组及其他用户权限之间无关联。
通过 ls 命令查看到的文件属性信息
在图中,包含了文件的类型、访问权限、所有者(属主)、所属组(属组)、占用的磁盘大小、最后修改时间和文件名称等信息。通过分析可知,该文件的类型为普通文件,所有者权限为可读、可写(rw-),所属组权限为可读(r–),除此以外的其他人也只有可读权限(r–),文件的磁盘占用大小是 34298 字节,最近一次的修改时间为 4 月 2 日的 0:23,文件的名称为 install.log。
排在权限前面的减号(-)是文件类型(减号表示普通文件),新手经常会把它跟“无权限”混淆。尽管在 Linux 系统中一切都是文件,但是不同的文件由于作用不同,因此类型也不尽相同(有一点像 Windows 系统的后缀名)。常见的文件类型包括普通文件(-)、目录文件(d)、链接文件(l)、管道文件(p)、块设备文件(b)以及字符设备文件(c)。
普通文件的范围特别广泛,比如纯文本信息、服务配置信息、日志信息以及 Shell 脚本等,都属于普通文件。几乎在每个目录下都能看到普通文件(-)和目录文件(d)的身影。块设备文件(b)和字符设备文件(c)一般是指硬件设备,比如鼠标、键盘、光驱、硬盘等,在/dev/目录中最为常见。应该很少有人会对鼠标、键盘进行硬件级别的管理吧。
文件的特殊权限
文件的隐藏属性
文件访问控制列表
su 命令与 sudo 服务
su 命令可以解决切换用户身份的需求,使得当前用户在不退出登录的情况下,顺畅地切换到其他用户,比如从 root 管理员切换至普通用户:su - linuxprobe
sudo 命令用于给普通用户提供额外的权限,语法格式为“sudo [参数] 用户名”。
参数 | 作用 |
---|---|
-h | 列出帮助信息 |
-l | 列出当前用户可执行的命令 |
-u 用户名或 UID 值 | 以指定的用户身份执行命令 |
-k | 清空密码的有效时间,下次执行 sudo 时需要再次进行密码验证 |
-b | 在后台执行指定的命令 |
-p | 更改询问密码的提示语 |
参考
第 5 章 用户身份与文件权限 | 《Linux 就该这么学》
https://www.linuxprobe.com/basic-learning-05.html