用户管理¶
本章将介绍如何管理用户。
**目标**: 在本章中,未来的 Linux 管理员将学习如何
添加、删除或修改一个 **组**;
添加、删除或修改一个 **用户**;
了解与用户和组相关的文件,并学习如何管理它们;
更改文件的 *所有者* 或 *组所有者*;
*保护* 用户帐户;
更改身份。
**用户**
**知识**:
**复杂度**:
**阅读时间**: 30 分钟
一般¶
每个用户必须有一个称为用户 **主组** 的组。
多个用户可以属于同一个组。
除主组以外的组称为用户的 **补充组**。
注意
每个用户都有一个主组,并且可以被邀请加入一个或多个补充组。
组和用户通过其唯一的数字标识符 `GID` 和 `UID` 进行管理。
- `UID`: *用户标识符*。唯一的用户 ID。
- `GID`: *组标识符*。唯一的组标识符。
内核识别 `UID` 和 `GID`,这意味着超级管理员不一定是 **root** 用户,只要 **uid=0** 用户是超级管理员即可。
与用户/组相关的文件是
- /etc/passwd
- /etc/shadow
- /etc/group
- /etc/gshadow
- /etc/skel/
- /etc/default/useradd
- /etc/login.defs
危险
您应该始终使用管理命令,而不是手动编辑文件。
注意
本章中的一些命令需要管理员权限。按照惯例,当命令需要使用管理员权限运行时,我们将指定命令 `sudo`。为了使示例正常工作,请确保您的帐户有权使用 `sudo` 命令。
组管理¶
修改后的文件,添加的行
/etc/group
/etc/gshadow
`groupadd` 命令¶
`groupadd` 命令将一个组添加到系统中。
groupadd [-f] [-g GID] group
示例
sudo groupadd -g 1012 GroupeB
选项 | 描述 |
---|---|
-g GID | 定义要创建的组的 `GID`。 |
-f | 如果由 `-g` 选项指定的 `GID` 已经存在,系统将选择一个 `GID`。 |
-r | 创建一个系统组,其 `GID` 在 `SYS_GID_MIN` 和 `SYS_GID_MAX` 之间。这两个变量在 ` /etc/login.defs` 中定义。 |
组命名规则
- 没有重音符号或特殊字符;
- 与现有用户或系统文件的名称不同。
注意
在 **Debian** 中,管理员应该使用 `addgroup` 和 `delgroup` 命令(除非在脚本中,该脚本旨在移植到所有 Linux 发行版),如 `man` 中所述
$ man addgroup
DESCRIPTION
adduser and addgroup add users and groups to the system according to command line options and configuration information
in /etc/adduser.conf. They are friendlier front ends to the low-level tools like useradd, groupadd and usermod programs,
by default, choosing Debian policy conformant UID and GID values, creating a home directory with skeletal configuration,
running a custom script, and other features.
命令 `groupmod` ¶
`groupmod` 命令允许您修改系统中现有的组。
groupmod [-g GID] [-n nom] group
示例
sudo groupmod -g 1016 GroupP
sudo groupmod -n GroupC GroupB
选项 | 描述 |
---|---|
-g GID | 要修改的组的新 `GID`。 |
-n name | 新名称。 |
可以同时更改组的名称、`GID` 或两者。
修改后,属于该组的文件将具有未知的 `GID`。必须将它们重新分配给新的 `GID`。
sudo find / -gid 1002 -exec chgrp 1016 {} \;
`groupdel` 命令¶
`groupdel` 命令删除系统中现有的组。
groupdel group
示例
sudo groupdel GroupC
技巧
删除组时,可能会出现两种情况
- 如果用户拥有唯一的初级组,并且您对该组发出
groupdel
命令,系统将提示您该组下有一个特定用户,无法删除。 - 如果用户属于辅助组(不是用户的初级组),并且该组不是系统中另一个用户的初级组,那么
groupdel
命令将删除该组,没有任何额外的提示。
示例
$ sudo useradd test
$ id test
uid=1000(test) gid=1000(test) group=1000(test)
$ sudo groupdel test
groupdel: cannot remove the primary group of user 'test'
$ sudo usermod -g users -G test test
$ id test
uid=1000(test) gid=100(users) group=100(users),1000(test)
$ sudo groupdel test
技巧
当您使用userdel -r
命令删除用户时,相应的初级组也会被删除。初级组名通常与用户名相同。
技巧
每个组都有一个唯一的GID
。多个用户可以使用一个组作为辅助组。按照惯例,超级管理员的 GID 为 0。为某些服务或进程保留的 GID 为 201-999,称为系统组或伪用户组。用户的 GID 通常大于或等于 1000。这些与/etc/login.defs有关,我们将在后面讨论。
# Comment line ignored
shell > cat /etc/login.defs
MAIL_DIR /var/spool/mail
UMASK 022
HOME_MODE 0700
PASS_MAX_DAYS 99999
PASS_MIN_DAYS 0
PASS_MIN_LEN 5
PASS_WARN_AGE 7
UID_MIN 1000
UID_MAX 60000
SYS_UID_MIN 201
SYS_UID_MAX 999
GID_MIN 1000
GID_MAX 60000
SYS_GID_MIN 201
SYS_GID_MAX 999
CREATE_HOME yes
USERGROUPS_ENAB yes
ENCRYPT_METHOD SHA512
技巧
由于用户必须属于某个组,因此最好在添加用户之前创建组。因此,组可能没有任何成员。
/etc/group
文件¶
该文件包含组信息(用:
分隔)。
$ sudo tail -1 /etc/group
GroupP:x:516:patrick
(1) (2)(3) (4)
- 1: 组的名称。
- 2: 组密码由
x
标识。组密码存储在/etc/gshadow
中。 - 3: GID。
- 4: 组中的辅助用户(不包括唯一的初级用户)。
注意
/etc/group
文件中的每一行对应一个组。初级用户信息存储在/etc/passwd
中。
/etc/gshadow
文件¶
该文件包含有关组的安全信息(用:
分隔)。
$ sudo grep GroupA /etc/gshadow
GroupA:$6$2,9,v...SBn160:alain:rockstar
(1) (2) (3) (4)
- 1: 组的名称。
- 2: 加密密码。
- 3: 组管理员的名称。
- 4: 组中的辅助用户(不包括唯一的初级用户)。
警告
/etc/group 和 /etc/gshadow 中的组名必须一一对应。也就是说,/etc/group 文件中的每一行都必须在 /etc/gshadow 文件中有一行对应。
密码中的!
表示它被锁定。因此,任何用户都不能使用密码访问该组(因为组成员不需要它)。
用户管理¶
定义¶
用户在/etc/passwd
文件中定义如下
- 1: 登录名;
- 2: 密码标识,
x
表示用户有密码,加密后的密码存储在/etc/shadow
的第二字段中; - 3: UID;
- 4: 初级组的 GID;
- 5: 注释;
- 6: 主目录;
- 7: Shell(
/bin/bash
、/bin/nologin
等)。
用户有三种类型
- root(uid=0): 系统管理员;
- 系统用户(uid 为 201~999 之一): 用于系统管理应用程序访问权限;
- 普通用户(uid>=1000): 其他帐户登录系统。
修改后的文件,添加的行
/etc/passwd
/etc/shadow
useradd
命令¶
useradd
命令添加用户。
useradd [-u UID] [-g GID] [-d directory] [-s shell] login
示例
sudo useradd -u 1000 -g 1013 -d /home/GroupC/carine carine
选项 | 描述 |
---|---|
-u UID | 要创建的用户的UID 。 |
-g GID | 初级组的GID 。此处的GID 也可以是组名 。 |
-G GID1,[GID2]... | 辅助组的GID 。此处的GID 也可以是组名 。可以指定多个辅助组,用逗号分隔。 |
-d 目录 | 创建主目录。 |
-s shell | 指定用户的 shell。 |
-c 注释 | 添加注释。 |
-U | 将用户添加到同时创建的同名组中。如果未指定,则在创建用户时会创建同名组。 |
-M | 不创建用户的 home 目录。 |
-r | 创建系统帐户。 |
创建时,帐户没有密码并被锁定。
用户必须分配密码才能解锁帐户。
在不带任何选项调用useradd
命令时,将为新用户设置以下默认设置
- 创建与用户名同名的 home 目录;
- 创建与用户名同名的初级组;
- 将指向
/bin/bash
的默认 shell 分配给用户; - 用户的 UID 和初级组 GID 值会自动推断。这通常是 1000 到 60,000 之间的唯一值。
注意
默认设置和值从以下配置文件获取
/etc/login.defs
和 /etc/default/useradd
$ sudo useradd test1
$ tail -n 1 /etc/passwd
test1:x:1000:1000::/home/test1:/bin/bash
$ tail -n 1 /etc/shadow
test1:!!:19253:0:99999:7:::
$ tail -n 1 /etc/group ; tail -n 1 /etc/gshadow
test1:x:1000:
test1:!::
帐户命名规则
- 允许使用小写字母、数字和下划线;其他特殊字符(如星号、百分号和全角符号)不被接受。
- 虽然您可以在 RockyLinux 中使用大写用户名,但我们不建议这样做;
- 不建议以数字和下划线开头,虽然您可能被允许这样做;
- 与现有组或系统文件的名称不同;
- 用户名最多可以包含 32 个字符。
警告
用户必须创建 home 目录,除了最后一个目录。
最后一个目录由useradd
命令创建,该命令会借此机会将/etc/skel
中的文件复制到其中。
用户除了其初级组外,还可以属于多个组。
示例
sudo useradd -u 1000 -g GroupA -G GroupP,GroupC albert
注意
在Debian中,您必须指定-m
选项以强制创建登录目录或在/etc/login.defs
文件中设置CREATE_HOME
变量。在所有情况下,管理员都应该使用adduser
和deluser
命令,如man
中所述,除了在打算移植到所有 Linux 发行版的脚本中
$ man useradd
DESCRIPTION
**useradd** is a low-level utility for adding users. On Debian, administrators should usually use **adduser(8)**
instead.
用户创建的默认值¶
修改/etc/default/useradd
文件。
useradd -D [-b directory] [-g group] [-s shell]
示例
sudo useradd -D -g 1000 -b /home -s /bin/bash
选项 | 描述 |
---|---|
-D | 设置用户创建的默认值。 |
-b base_directory | 定义用户 home 目录的基目录。如果您没有指定此选项,请使用/etc/default/useradd 文件或/home/ 中的HOME 变量。 |
-g group | 设置默认组。 |
-s shell | 设置默认 shell。 |
-f | 设置密码过期后禁用帐户的天数。 |
-e | 设置禁用帐户的日期。 |
usermod
命令¶
usermod
命令允许修改用户。
usermod [-u UID] [-g GID] [-d directory] [-m] login
示例
sudo usermod -u 1044 carine
与useradd
命令相同的选项。
选项 | 描述 |
---|---|
-m | 与-d 选项相关联。将旧登录目录的内容移动到新目录。如果旧的 home 目录不存在,则不会创建新的 home 目录;当它不存在时,会创建新的 home 目录。 |
-l login | 修改登录名。修改登录名后,还需要修改 home 目录的名称以使其匹配。 |
-e YYYY-MM-DD | 修改帐户过期日期。 |
-L | 永久锁定帐户。也就是说,在/etc/shadow 密码字段的开头添加一个! 。 |
-U | 解锁帐户。 |
-a | 追加用户的辅助组,必须与-G 选项一起使用。 |
-G | 修改用户的辅助组并覆盖之前的辅助组。 |
技巧
要修改,用户必须断开连接并且没有正在运行的进程。
更改标识符后,属于用户的文件将具有未知的UID
。它必须重新分配给新的UID
。
其中1000
是旧的UID
,1044
是新的UID
。示例如下
sudo find / -uid 1000 -exec chown 1044: {} \;
锁定和解锁用户帐户。示例如下
$ usermod -L test1
$ grep test1 /etc/shadow
test1:!$6$n.hxglA.X5r7X0ex$qCXeTx.kQVmqsPLeuvIQnNidnSHvFiD7bQTxU7PLUCmBOcPNd5meqX6AEKSQvCLtbkdNCn.re2ixYxOeGWVFI0:19259:0:99999:7:::
$ usermod -U test1
-aG
选项与-G
选项的区别可以用以下示例说明
$ sudo useradd test1
$ sudo passwd test1
$ sudo groupadd groupA ; sudo groupadd groupB ; sudo groupadd groupC ; sudo groupadd groupD
$ id test1
uid=1000(test1) gid=1000(test1) groups=1000(test1)
$ sudo gpasswd -a test1 groupA
$ id test1
uid=1000(test1) gid=1000(test1) groups=1000(test1),1002(groupA)
$ sudo usermod -G groupB,groupC test1
$ id test1
uid=1000(test1) gid=1000(test1) groups=1000(test1),1003(groupB),1004(groupC)
$ sudo usermod -aG groupD test1
$ id test1
uid=1000(test1) gid=1000(test1) groups=1000(test1),1003(groupB),1004(groupC),1005(groupD)
userdel
命令¶
userdel
命令允许您删除用户的帐户。
sudo userdel -r carine
选项 | 描述 |
---|---|
-r | 删除用户的 home 目录和位于/var/spool/mail/ 目录中的邮件文件 |
技巧
要删除,用户必须注销并且没有正在运行的进程。
userdel
命令会删除/etc/passwd
、/etc/shadow
、/etc/group
、/etc/gshadow
中的对应行。如上所述,userdel -r
还会删除用户对应的初级组。
/etc/passwd
文件¶
该文件包含用户信息(用:
分隔)。
$ sudo head -1 /etc/passwd
root:x:0:0:root:/root:/bin/bash
(1)(2)(3)(4)(5) (6) (7)
- 1: 登录名;
- 2: 密码标识,
x
表示用户有密码,加密后的密码存储在/etc/shadow
的第二字段中; - 3: UID;
- 4: 初级组的 GID;
- 5: 注释;
- 6: 主目录;
- 7: Shell(
/bin/bash
、/bin/nologin
等)。
/etc/shadow
文件¶
该文件包含用户的安全信息(用:
分隔)。
$ sudo tail -1 /etc/shadow
root:$6$...:15399:0:99999:7:::
(1) (2) (3) (4) (5) (6)(7,8,9)
- 1: 登录名。
- 2: 加密密码。使用 SHA512 加密算法,由
/etc/login.defs
的ENCRYPT_METHOD
定义。 - 3: 密码上次更改的时间,时间戳格式,以天为单位。所谓的时间戳是以 1970 年 1 月 1 日作为标准时间。每过一天,时间戳就会 +1。
- 4: 密码的最小有效期。也就是说,两次密码更改之间的时间间隔(与第三字段相关),以天为单位。由
/etc/login.defs
的PASS_MIN_DAYS
定义,默认为 0,也就是说,第二次更改密码时没有限制。但是,如果它为 5,则意味着不允许在 5 天内更改密码,只有 5 天后才能更改。 - 5: 密码的最大有效期。也就是说,密码的有效期(与第三字段相关)。由
/etc/login.defs
的PASS_MAX_DAYS
定义。 - 6: 密码过期前的警告天数(与第五字段相关)。默认值为 7 天,由
/etc/login.defs
的PASS_WARN_AGE
定义。 - 7: 密码过期后的宽限期(与第五字段相关)。
- 8: 帐户过期时间,时间戳格式,以天为单位。请注意,帐户过期不同于密码过期。如果帐户过期,则用户将不允许登录。如果密码过期,则用户不允许使用其密码登录。
- 9: 为将来使用保留。
危险
对于/etc/passwd
文件中的每一行,都必须在/etc/shadow
文件中有一行对应。
有关时间戳和日期转换,请参阅以下命令格式
# The timestamp is converted to a date, "17718" indicates the timestamp to be filled in.
$ date -d "1970-01-01 17718 days"
# The date is converted to a timestamp, "2018-07-06" indicates the date to be filled in.
$ echo $(($(date --date="2018-07-06" +%s)/86400+1))
文件所有者¶
危险
所有文件都必须属于一个用户和一个组。
默认情况下,创建文件的用户的初级组是拥有该文件的组。
修改命令¶
chown
命令¶
chown
命令允许您更改文件的拥有者。
chown [-R] [-v] login[:group] file
示例
sudo chown root myfile
sudo chown albert:GroupA myfile
选项 | 描述 |
---|---|
-R | 递归地更改目录及其所有子文件的所有者。 |
-v | 显示更改。 |
仅更改所有者用户
sudo chown albert file
仅修改所有者组
sudo chown :GroupA file
更改用户和所有者组
sudo chown albert:GroupA file
在以下示例中,分配的组将是指定用户的所属主组。
sudo chown albert: file
更改目录中所有文件的所有者和组
sudo chown -R albert:GroupA /dir1
chgrp
命令¶
chgrp
命令允许您更改文件的所属组。
chgrp [-R] [-v] group file
示例
sudo chgrp group1 file
选项 | 描述 |
---|---|
-R | 递归地更改目录及其所有子文件的所属组。 |
-v | 显示更改。 |
注意
可以将所有者和所属组应用于文件,方法是将另一个文件的所属者和所属组作为参考。
chown [options] --reference=RRFILE FILE
例如
chown --reference=/etc/groups /etc/passwd
访客管理¶
gpasswd
命令¶
gpasswd
命令允许您管理组。
gpasswd [option] group
示例
$ sudo gpasswd -A alain GroupA
[alain]$ gpasswd -a patrick GroupA
选项 | 描述 |
---|---|
-a USER | 将用户添加到组。对于添加的用户,此组是辅助组。 |
-A USER,... | 设置管理员用户列表。 |
-d USER | 从组中删除用户。 |
-M USER,... | 设置组成员列表。 |
gpasswd -M
命令充当修改操作,而不是添加操作。
# gpasswd GroupeA
New Password:
Re-enter new password:
注意
除了使用 gpasswd -a
将用户添加到组之外,您还可以使用前面提到的 usermod -G
或 usermod -aG
命令。
id
命令¶
id
命令显示用户的组名。
id USER
示例
$ sudo id alain
uid=1000(alain) gid=1000(GroupA) groupes=1000(GroupA),1016(GroupP)
newgrp
命令¶
newgrp
命令可以从用户的辅助组中选择一个组作为用户的新的**临时**主组。每次切换用户的主组时,newgrp
命令都会创建一个新的**子 shell**(子进程)。注意!**子 shell** 和**子 shell** 是不同的。
newgrp [secondarygroups]
示例
$ sudo useradd test1
$ sudo passwd test1
$ sudo groupadd groupA ; sudo groupadd groupB
$ sudo usermod -G groupA,groupB test1
$ id test1
uid=1000(test1) gid=1000(test1) groups=1000(test1),1001(groupA),1002(groupB)
$ echo $SHLVL ; echo $BASH_SUBSHELL
1
0
$ su - test1
$ touch a.txt
$ ll
-rw-rw-r-- 1 test1 test1 0 10月 7 14:02 a.txt
$ echo $SHLVL ; echo $BASH_SUBSHELL
1
0
# Generate a new child shell
$ newgrp groupA
$ touch b.txt
$ ll
-rw-rw-r-- 1 test1 test1 0 10月 7 14:02 a.txt
-rw-r--r-- 1 test1 groupA 0 10月 7 14:02 b.txt
$ echo $SHLVL ; echo $BASH_SUBSHELL
2
0
# You can exit the child shell using the `exit` command
$ exit
$ logout
$ whoami
root
安全性¶
passwd
命令¶
passwd
命令管理密码。
passwd [-d] [-l] [-S] [-u] [login]
示例
sudo passwd -l albert
sudo passwd -n 60 -x 90 -w 80 -i 10 patrick
选项 | 描述 |
---|---|
-d | 永久删除密码。仅供 root(uid=0)使用。 |
-l | 永久锁定用户帐户。仅供 root(uid=0)使用。 |
-S | 显示帐户状态。仅供 root(uid=0)使用。 |
-u | 永久解锁用户帐户。仅供 root(uid=0)使用。 |
-e | 永久过期密码。仅供 root(uid=0)使用。 |
-n DAYS | 定义密码的最小有效期。永久性更改。仅供 root(uid=0)使用。 |
-x DAYS | 定义密码的最大有效期。永久性更改。仅供 root(uid=0)使用。 |
-w DAYS | 定义过期前的警告时间。永久性更改。仅供 root(uid=0)使用。 |
-i DAYS | 定义密码过期后到停用的延迟时间。永久性更改。仅供 root(uid=0)使用。 |
使用 password -l
,即将“!!”添加到与 /etc/shadow
对应的用户密码字段的开头。
示例
- Alain 更改了他的密码
[alain]$ passwd
- root 更改了 Alain 的密码
sudo passwd alain
注意
登录到系统的用户可以使用 passwd
命令更改其密码(此过程需要请求用户的旧密码)。root(uid=0)用户可以更改任何用户的密码。
更改密码需要遵守规定的安全策略,这涉及到PAM(可插拔身份验证模块)知识。
当通过 shell 脚本管理用户帐户时,在创建用户后设置默认密码可能很有用。
这可以通过将密码传递给 passwd
命令来完成。
示例
sudo echo "azerty,1" | passwd --stdin philippe
警告
密码以明文形式输入,passwd
命令会对其进行加密。
chage
命令¶
chage
命令用于更改用户密码过期信息。
chage [-d date] [-E date] [-I days] [-l] [-m days] [-M days] [-W days] [login]
示例
sudo chage -m 60 -M 90 -W 80 -I 10 alain
选项 | 描述 |
---|---|
-I DAYS | 定义密码过期后的停用延迟天数。永久性更改。 |
-l | 显示策略详细信息。 |
-m DAYS | 定义密码的最小有效期。永久性更改。 |
-M DAYS | 定义密码的最大有效期。永久性更改。 |
-d LAST_DAY | 定义自上次更改密码以来的天数。您可以使用天数时间戳格式或 YYYY-MM-DD 格式。永久性更改。 |
-E EXPIRE_DATE | 定义帐户过期日期。您可以使用天数时间戳格式或 YYYY-MM-DD 格式。永久性更改。 |
-W WARN_DAYS | 定义过期前的警告时间天数。永久性更改。 |
示例
# The `chage` command also offers an interactive mode.
$ sudo chage philippe
# The `-d` option changes the password when logging in.
$ sudo chage -d 0 philippe
高级管理¶
配置文件
/etc/default/useradd
/etc/login.defs
/etc/skel
注意
使用 useradd
命令编辑 /etc/default/useradd
文件。
其他文件需要使用文本编辑器修改。
/etc/default/useradd
文件¶
此文件包含默认数据设置。
技巧
如果在创建用户时没有指定选项,系统将使用 /etc/default/useradd
文件中定义的默认值。
此文件可以通过 useradd -D
命令修改(useradd -D
命令在没有其他选项的情况下输入将显示 /etc/default/useradd
文件的内容)。
Shell > grep -v ^# /etc/default/useradd
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
参数 | 注释 |
---|---|
GROUP | 定义默认主组 GID。 |
HOME | 定义普通用户主目录的上级目录路径。 |
INACTIVE | 定义密码过期后的宽限期天数。对应于 /etc/shadow 文件的第 7 个字段。-1 值表示停用宽限期功能。 |
EXPIRE | 定义帐户过期日期。对应于 /etc/shadow 文件的第 8 个字段。 |
SHELL | 定义命令解释器。 |
SKEL | 定义登录目录的骨架目录。 |
CREATE_MAIL_SPOOL | 定义 /var/spool/mail/ 中的邮箱创建。 |
如果您在创建用户时不需要同名主组,可以这样做
Shell > useradd -N test2
Shell > id test2
uid=1001(test2) gid=100(users) groups=100(users)
注意
GNU/Linux 具有两种组机制
- 公共组,其主组为 GID=100
- 私有组,即在添加用户时,将创建一个与其同名的组作为其主组。这种组机制通常由 RHEL 及其下游发行版使用。
/etc/login.defs
文件¶
# Comment line ignored
shell > cat /etc/login.defs
MAIL_DIR /var/spool/mail
UMASK 022
HOME_MODE 0700
PASS_MAX_DAYS 99999
PASS_MIN_DAYS 0
PASS_MIN_LEN 5
PASS_WARN_AGE 7
UID_MIN 1000
UID_MAX 60000
SYS_UID_MIN 201
SYS_UID_MAX 999
GID_MIN 1000
GID_MAX 60000
SYS_GID_MIN 201
SYS_GID_MAX 999
CREATE_HOME yes
USERGROUPS_ENAB yes
ENCRYPT_METHOD SHA512
UMASK 022
:这意味着创建文件的权限为 755(rwxr-xr-x)。但是,出于安全原因,GNU/Linux 不会为新创建的文件授予**x** 权限。此限制适用于 root(uid=0)和普通用户(uid>=1000)。例如
Shell > touch a.txt
Shell > ll
-rw-r--r-- 1 root root 0 Oct 8 13:00 a.txt
HOME_MODE 0700
:普通用户主目录的权限。不适用于 root 的主目录。
Shell > ll -d /root
dr-xr-x---. 10 root root 4096 Oct 8 13:12 /root
Shell > ls -ld /home/test1/
drwx------ 2 test1 test1 4096 Oct 8 13:10 /home/test1/
USERGROUPS_ENAB yes
:“当您使用 userdel -r
命令删除用户时,相应的所属主组也会被删除。”原因是什么?这就是原因。
/etc/skel
目录¶
创建用户时,会创建其主目录和环境文件。您可以将 /etc/skel/
目录中的文件视为创建用户所需的模板文件。
这些文件会自动从 /etc/skel
目录中复制。
.bash_logout
.bash_profile
.bashrc
此目录中放置的所有文件和目录在创建用户时都会复制到用户树中。
身份更改¶
su
命令¶
su
命令允许您更改已连接用户的身份。
su [-] [-c command] [login]
示例
$ sudo su - alain
[albert]$ su - root -c "passwd alain"
选项 | 描述 |
---|---|
- | 加载用户的完整环境。 |
-c 命令 | 以用户的身份执行命令。 |
如果没有指定登录名,则为 root
。
标准用户需要输入新身份的密码。
技巧
您可以使用 exit
/logout
命令退出已切换的用户。需要注意的是,切换用户后,不会创建新的 子 shell
或 子 shell
,例如
$ whoami
root
$ echo $SHLVL ; echo $BASH_SUBSHELL
1
0
$ su - test1
$ echo $SHLVL ; echo $BASH_SUBSHELL
1
0
请注意!su
和 su -
是不同的,如以下示例所示
$ whoami
test1
$ su root
$ pwd
/home/test1
$ env
...
USER=test1
PWD=/home/test1
HOME=/root
MAIL=/var/spool/mail/test1
LOGNAME=test1
...
$ whoami
test1
$ su - root
$ pwd
/root
$ env
...
USER=root
PWD=/root
HOME=/root
MAIL=/var/spool/mail/root
LOGNAME=root
...
因此,当您想要切换用户时,请记住不要丢失 -
。由于没有加载必要的环境变量文件,因此运行某些程序可能会出现问题。