用户与组管理

2024/6/23 Linux

Linux有两种类型的用户:人类用户和系统用户。

每位用户都有一个唯一的标识号(Unique Identity,简称 UID),以及至少一个组标识号(Group Identification,简称 GID)。

所有用户都有一个主组,而且可以是多个组的成员。

每位人类用户都有一个自己的主目录,用于保存个人文件。用户主目录位于/home,并以所有者命名

用户可以属于多个组,这些额外的组称为补充组(附加组)。

组中的用户拥有该组的所有权限。权限可以控制文件和命令的访问,是系统安全的基础。

系统用户代表系统服务和进程。系统用户需要用户账号来控制它们的权限,但这些账号不能用来登录,/home中也没有系统用户的目录。

人类用户又分为两类:管理员(root,又称超级用户)和普通用户(又称非特权用户)。

普通用户的权限只够管理自己的文件和运行允许普通用户使用的命令。

普通用户也可以被赋予有限的或完整的root权限。

在Linux系统中,/etc/passwd文件包含了系统上所有用户的信息。该文件的每一行代表一个用户,行的内容遵循如下格式:

用户名:密码占位符:用户ID:组ID:用户描述:用户主目录:登录shell
1

例如,一个/etc/passwd文件中的实际行可能看起来像这样:

root:x:0:0:root:/root:/bin/bash
1
  • root:表示用户名。
  • x:密码占位符。密码并不在这里显示,而是在另一个影子文件(/etc/shadow)中。
  • 0:UID,用户ID号。0表示管理员,1~499表示系统用户,500~65535表示一般用户。
  • 0:GID,组ID号。此处用来判断用户的初始组。
  • root:注释性描述。可以没有。
  • /root:用户的家目录。用户一登录系统所处的文件夹。一般来说,用户对自己的家目录有完全(读、写、执行)权限,其他用户对此目录的访问权限根据具体情况设置。
  • /bin/bash:登录shell。常用的有两种:/bin/bash和/sbin/nologin,前一种表示用户可以登录到系统,后一种则不能。

在Linux系统中,/etc/group文件包含了系统上所有用户组的信息。该文件的每一行代表一个用户组,并包含了用户组的相关信息,行的内容遵循如下格式:

组名:x:组ID:用户列表(多个用户用逗号分隔)
1

x 是占位符,表示密码不可用,因为用户组密码存储在/etc/gshadow

# 用户管理

# 查看用户
cat /etc/passwd
cat /etc/passwd | grep username

# 打印出指定用户名的用户和组信息
id username
1
2
3
4
5
6

# useradd

基本语法:useradd [options] username。

常用参数:

  • -c comment:为账户添加备注,备注文字保存在passwd的备注栏中。
  • -d home:指定用户登录时的起始目录。
  • -s shell:指定用户登录后使用的shell。默认值为/bin/bash。
  • -m:自动建立用户的登录目录。如果不加此参数,系统不会自动创建家目录。
  • -g group:指定用户所属的初始群组。
  • -G group:指定用户所属的其他附加群组。
  • -u uid:指定用户的UID号。
  • -r:创建系统账号,通常这是创建没有家目录的用户(如系统服务)时使用的选项。
# 创建用户账号。使用 useradd 指令创建的账号,保存在 /etc/passwd 文本文件中
useradd username

# -d 指定用户登入时的起始目录
useradd -d /home/username username

# -g 指定用户的主组。每个用户只能有一个主组。主组是用户登录系统时的默认组。创建新用户时,如果没有明确指定主组,系统会默认创建一个与用户名相同的组作为主组。用户的主组不能被删除,如果用户被删除,且其主组没有其他用户,该主组也会被自动删除。
useradd -g groupname username

# -G 指定用户的附加组。用户可以属于多个附加组。附加组允许用户共享文件和目录。附加组可以直接被删除,无需关心是否还有其他用户属于该组。用户被删除时,其所属的附加组不会受到影响。
useradd -G groupname username
1
2
3
4
5
6
7
8
9
10
11

# userdel

# -r 删除用户登入目录以及目录中所有文件
userdel -r username
1
2

# usermod

# -l 修改用户账号名称
usermod -l new_username old_username

# -L 锁定用户密码,使密码无效
usermod -L username

# -d 修改用户登入时的起始目录
usermod -d /home/username username

# -g 修改用户的主组
usermod -g groupname username

# -G 修改用户的附加组
usermod -G groupname username
# -a 将用户添加到补充组。仅与-G选项一起使用。
usermod -a -G groupname username
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# passwd

# 修改当前用户密码
passwd

# 设置指定用户密码
passwd username

# 锁定用户,用户不能登录
passwd -l username

# 解锁用户
passwd -u username

# 删除用户密码
passwd -d username
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 组管理

# 查看用户组
cat /etc/group
cat /etc/group | grep groupname
1
2
3

# groupadd

# 创建用户组。使用 groupadd 指令创建的组,保存在 /etc/group 文本文件中
groupadd groupname
1
2

# groupdel

# 删除用户组
groupdel groupname
1
2

# groupmod

# 重命名用户组
groupmod -n new_groupname old_groupname
1
2

# 权限控制

# chown

Linux chown(英文全拼:change owner)命令用于设置文件所有者和文件关联组的命令。

语法:

chown [-R] 用户名:组名 文件名 # -R 表示递归
1

chown 需要超级用户 root 的权限才能执行此命令。

# 把 /var/run/httpd.pid 的所有者设置 root
chown root /var/run/httpd.pid

# 将文件 file1.txt 的拥有者设为 runoob,群体的使用者 runoobgroup
chown runoob:runoobgroup file1.txt
1
2
3
4
5

# chmod

chmod, change mode的缩写,即更改模式。

权限的符号表示及八进制表示

模式 符号表示 八进制表示
读取(read) r 4
写入(write) w 2
执行(execute) x 1
没有权限 - 0

权限实际意义与操作命令:

文件 文件夹
r 查看内容,如:cat/more/less/head/tail 列出文件夹内容,如:ls
w 追加或修改内容,如:echo/vi 对文件夹内的文件个数做新增或减少,如:mkdir/touch/rm/cp/mv
x 编译执行 进入文件夹,如:cd

所有者的符号表示

模式 表示
u 用户(user)
g 组(group)
o 其他人(other)
a 所有人(all)

运算符表示

运算符 表示
+ 添加权限
- 删除现有权限
= 添加新权限,并删除任何未指定的权限位

chmod [ugo][+-=][rwx] 文件或目录
# r=4 w=2 x=1
chmod 777 文件或目录

# 修改文件拥有者,只有root有权限
chown [选项] 用户或组 文件

# 将文件 file1.txt 设为所有人皆可读取
chmod ugo+r file1.txt
chmod a+r file1.txt
chmod 222 file1.txt

# 将文件 file1.txt,file2.txt 设为所有者及所属组可写,其他人不可写
chmod ug+w,o-w file1.txt file2.txt
chmod 440 file1.txt file2.txt

# 为 ex1.py 文件拥有者增加可执行权限
chmod u+x ex1.py
chmod 100 ex1.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# su/sudo

Linux su(英文全拼:switch user)命令用于变更为其他使用者的身份,除 root 外,需要键入该使用者的密码。

# 切换用户的同时切换目标用户的工作环境
su - username
1
2

Linux sudo命令以系统管理者的身份执行指令,也就是说,经由 sudo 所执行的指令就好像是 root 亲自执行。

使用权限:在 /etc/sudoers 中有出现的使用者。

# login/logout

Linux logout命令用于退出系统。

logout指令让用户退出系统,其功能和login指令相互对应。