用户与用户组

我们为什么需要一个用户?

在操作系统中,用户的含义并不是指 坐在电脑前的人,而更像是一个抽象的身份标识。更具体的说,用户是操作系统去进行权限分配资源分配的基本单位

在服务器环境中,「用户」的概念是明确的:服务器的管理员可以为不同的使用者创建用户,分配不同的权限,保障系统的正常运行;也可以为网络服务创建用户(此时,用户就不再是一个有血有肉的人),通过权限限制,以减小服务被攻击时对系统安全的破坏。

而对于个人用户来说,他们的设备不会有第二个人在使用。此时,现代操作系统一般区分使用者的用户与「系统用户」,并且划分权限,以尽可能保证系统的完整性不会因为用户的误操作或恶意程序而遭到破坏。

Linux下的用户简介

在 Linux 中,我们可以关注 /etc/passwd 文件来获得系统中用户的配置信息

Note

以下是一个例子

root:x:0:0:root:/root:/bin/bash  
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin  
bin:x:2:2:bin:/bin:/usr/sbin/nologin  
(中间内容省略)  
sshd:x:110:65534::/run/sshd:/usr/sbin/nologin  
ustc:x:1000:1000:ustc:/home/ustc:/bin/bash  
lxd:x:998:100::/var/snap/lxd/common/lxd:/bin/false  
mysql:x:111:116:MySQL Server,,,:/nonexistent:/bin/false

在此文件中,每一行都代表一个用户,每行中用户信息由冒号 : 隔开,存储着包括用户名、用户编号 (UID, User ID)、家目录位置等信息。更多介绍,可以通过 man 5 passwd 查阅。

在Linux中,用户通常分为三类:

用户类型UID范围描述
超级用户(Root)0拥有最高的权限
系统用户(System)1-999非人类用户,专门给后台服务运行而使用的身份
普通用户(Normal)1000+供真实人类登录的账号

根用户

在之前的文章中我们介绍过,在安装软件的时候,我们需要在前面加上 sudo,这可以使我们以根用户(root)的身份安装软件

在Linux中,根用户的UID一般为0,同时拥有操作系统中最高的权限,根用户几乎可以不受限制的进行任何操作与命令的执行,root用户的用户数据储存在 /root

在我们使用 sudo 的时候,输入自己的密码并且验证正确之后,sudo就会以 root 用户的身份执行我们后面希望执行的程序

Danger

第一次使用sudo的时候会有提示:

We trust you have received the usual lecture from the local System Administrator. It usually boils down to these three things:
 
#1) Respect the privacy of others.  
#2) Think before you type.  
#3) With great power comes great responsibility.

这提示我们,root用户可以对系统做出极其危险的操作,当我们使用 sudo 执行命令的时候,一定要小心、谨慎,理解命令的含义之后再按下回车请不要复制网络上所谓的「Linux 优化命令」等以 root 权限执行,否则可能会带来灾难性的后果

以下是一些会对系统带来毁灭性破坏的例子。再重复一遍,不要执行下面的命令!

  • rm -rf /(删除系统中的所有可以删除的文件,包括被挂载的其他分区即使不以 root 权限执行,也可以删掉自己的所有文件。
  • mkfs.ext4 /dev/sda(将系统的第一块硬盘直接格式化为 ext4 文件系统。这会破坏其上所有的文件。)
  • dd if=/dev/urandom of=/dev/sda(对系统的第一块硬盘直接写入伪随机数。这会破坏其上所有的文件,并且找回文件的可能性降低。)
  • :(){ :|: & };:(被称为「Fork 炸弹」,会消耗系统所有的资源。在未对进程资源作限制的情况下,只能通过重启系统解决,所有未保存的数据会丢失。)

系统用户

除了你,root和其他再用这个电脑/服务器的人之外,在Linux中还有很多的用户,比如 no-body,www-data等,他们都是由系统或者相关程序创建的,用于执行系统服务等

一般来说,一般系统用户是禁止使用密码登录的

普通用户

普通用户可以登录系统并且对家目录下的文件进行操作,所有普通用户的 家目录都在 /home/

普通用户无法直接修改系统配置,也无法为系统安装或者卸载软件

用户组

简单来说,用户组就是对所有具有相同权限需求的用户集合,和用户一致,用户组也有属于自己的ID叫 GID,这些信息存储在 /etc/grup文件中

在 Linux 中,一个用户与组的关系通常分为两种:

  • 初始组 (Primary Group): 用户登录时默认所属的组(通常与用户名同名)。用户创建新文件时,该文件的所属组默认就是这个初始组。
  • 附加组 (Secondary/Supplementary Groups): 用户可以同时属于多个其他的组。例如,你(用户 user)可以同时在 wheel 组(获得 sudo 权限)和 docker 组(无需 root 操作容器)中。

用户组的出现解决了对于同样权限需求用户的管理问题,当我们需要给一个50人公司设置权限的时候就不用在一个一个加权限了,只需要创建一个用户组然后把这50个人丢进去,再对这个用户组设权即可

切换用户

sudo

sudo不加参数的方法我们在上面已经介绍过了,这是其最常见的用途。如果想以其他身份执行命令,我们可以加上参数 -u 用户名 来进行

14:49:20 with imicola in ~ is 📦 None
 sudo -u postgres id
[sudo] password for imicola:
uid=970(postgres) gid=970(postgres) groups=970(postgres)

这个示例就表示了我们用 postger 这个用户身份执行了 id 命令

su

su命令用于直接切换用户,命令格式是 su [用户名],当用户名参数为空时,则切换到 root 用户

如果你是Ubuntu用户,当你尝试使用 su 登录 root 时候,你可以会遇到下面的情况:

$ su
Password:
su: Authentication failure

这是因为,如 Ubuntu 等 Linux 发行版默认禁止了 root 用户的密码登录,只允许通过 sudo 提高权限。但是,我们可以用 sudo 运行 su,来得到一个为 root 用户权限的 shell。

$ sudo su
Password:
# id
uid=0(root) gid=0(root) groups=0(root)
# exit
$

命令行配置用户

passwd

可以使用这个命令修改密码,格式为 passwd [用户名]

adduser

Tip

根据发行版的不同,对账户管理的命令会略有不同

以下用表格列出常见发行版的命令以及其说明描述

命令适用发行版说明描述
adduserDebian / Ubuntu推荐方式。这是一个交互式 Perl 脚本,会自动创建家目录、设置密码、要求填写用户资料(Room Number 等),非常友好。
useraddDebian / Ubuntu底层命令。属于低级原语,默认不会创建家目录,也不会提示设置密码,通常用于脚本自动化。
adduserRHEL / CentOS / Fedora在这些系统中,adduser 通常只是 useradd 的一个软链接(Symbolic Link),两者行为完全一致。
useraddRHEL / CentOS / Fedora标准命令。会根据 /etc/login.defs 的配置自动处理,通常会默认创建家目录,但仍需手动运行 passwd 设置密码。
useraddArch Linux / 通用标准二进制工具。默认不创建家目录,通常需要加上 -m 参数(如 useradd -m username)来强制创建。

文件权限

在linux中每个文件和目录都有自己的权限,可以使用 ls -l查看,有关输出的具体解释可以在 ls -l 中参考

  • 如果想要修改文件权限,可以使用 chmod 修改
  • 如果想要修改文件所有者,可以使用 chown 修改