目录
[55. shell命令--useradd](#55. shell命令--useradd)
55. shell命令--useradd
功能说明
useradd 命令是 Linux 和 Unix 系统上用于创建新用户的工具。它是 shadow-utils 包的一部分,这个包还包括了管理用户密码、组和其他账户信息的工具。使用 useradd 可以创建新的用户账户,并可以指定多种选项来配置新账户的各种属性,如用户组、家目录、登录shell等。
useradd 命令用于 Linux 中创建的新的系统用户。useradd 可用来建立用户帐号。帐号建好之后,再用 passwd 设定帐号的密码.而可用 userdel 删除帐号。使用 useradd 指令所建立的帐号,实际上是保存在 /etc/passwd 文本文件中。
在 Slackware 中,adduser 指令是个 script 程序,利用交谈的方式取得输入的用户帐号资料,然后再交由真正建立帐号的useradd 命令建立新用户,如此可方便管理员建立用户帐号。在 Red Hat Linux 中, adduser 命令则是 useradd 命令的符号连接,两者实际上是同一个指令。
语法格式
bash
SYNOPSIS
useradd [options] LOGIN
useradd -D
useradd -D [options]
选项说明
选项
bash
-b, --base-dir BASE_DIR:如果未指定 -d HOME_DIR,则系统的默认基本目录。如果未指定此选项,useradd 将使用 /etc/default/useradd 中的 HOME 变量指定的基本目录,或默认使用 /home。
-c, --comment COMMENT:加上备注文字。任何文本字符串。它通常是对登录名的简短描述,目前用作用户全名的字段。这个信息通常可以通过 finger 命令查看。
-d, --home-dir HOME_DIR:将使用 HOME_DIR 作为用户登录目录的值来创建新用户。如果不指定,将使用 /home/LOGIN 作为家目录,其中 LOGIN 是用户名。
-D, --defaults:变更预设值。
-e, --expiredate EXPIRE_DATE:用户帐户将被禁用的日期。 日期以 YYYY-MM-DD 格式指定。
-f, --inactive INACTIVE:密码过期后到帐户被永久禁用的天数。
-g, --gid GROUP:用户初始登录组的组名或编号。组名必须存在。组号必须引用已经存在的组。如果不指定,系统将使用默认组或新创建的组(如果 -G 选项也未指定)。
-G, --groups GROUP1[,GROUP2,...[,GROUPN]]]:用户也是其成员的补充组列表。每个组用逗号隔开,中间没有空格。
-h, --help:显示帮助信息并退出。
-k, --skel SKEL_DIR:骨架目录,其中包含要在用户的主目录中复制的文件和目录,当主目录由 useradd 创建时。
-K, --key KEY=VALUE:覆盖 /etc/login.defs 默认值(UID_MIN、UID_MAX、UMASK、PASS_MAX_DAYS 等)。
-l, --no-log-init:不要将用户添加到 lastlog 和 faillog 数据库。
-m, --create-home:为新用户创建家目录。如果家目录已存在,则不会覆盖。如果用户的主目录不存在,则创建它。
-M:不要创建用户的主目录,即使 /etc/login.defs (CREATE_HOME) 中的系统范围设置设置为 yes。
-N, --no-user-group:不要创建与用户同名的组,而是将用户添加到由 -g 选项或 /etc/default/useradd 中的 GROUP 变量指定的组中。
-o, --non-unique:允许创建具有重复(非唯一)UID 的用户帐户。 此选项仅在与 -o 选项结合使用时有效。
-p, --password PASSWORD:crypt(3) 返回的加密密码。 默认是禁用密码。
-r, --system:创建一个系统帐户。
-R:设置根目录
-s, --shell SHELL:用户登录 shell 的名称。如果不指定,将使用 /bin/bash。
-u, --uid UID:用户 ID 的数值。(UID)
-U, --user-group:创建一个与用户同名的组,并将用户添加到该组。
-Z, --selinux-user SEUSER:用户登录的 SELinux 用户。 默认情况下将此字段留空,这会导致系统选择默认的 SELinux 用户。
# 更改默认值
# 当仅使用 -D 选项调用时,useradd 将显示当前默认值。 当使用 -D 和其他选项调用时,useradd 将更新指定选项的默认值。 有效的默认更改选项是:
退出值
bash
0 成功
1 无法更新密码文件
2 无效的命令语法
3 选项的无效参数
4 UID 已经在使用(并且没有 -o)
6 指定的组不存在
9 用户名已被使用
10 无法更新组文件
12 无法创建主目录
13 无法创建邮件假脱机
14 无法更新 SELinux 用户映射
相关文件
bash
/etc/passwd # 用户帐户信息。
/etc/shadow # 保护用户帐户信息。
/etc/group # 组帐户信息。
/etc/gshadow # 保护组帐户信息。
/etc/default/useradd # 帐户创建的默认值。
/etc/skel/ # 包含默认文件的目录。
/etc/login.defs # 影子密码套件配置。
/etc/passwd
bash
[root@MineGi ~]# head -1 /etc/passwd
root:x:0:0:root:/root:/bin/bash
#第1字段:用户账户名
#第2字段:密码占用符(密码保存到了影子文件)
#第3字段:uid编号
#第4字段:gid编号
#第5字段:用户备注信息(用户全名)
#第6字段:用户属主目录(家目录)
#第7字段:登录时分配到的shell解释器(若shell类型为/sbin/nologin,则不能登录)
/etc/shadow
bash
[root@MineGi ~]# head -1 /etc/shadow
root:$6$lkz5C3wAIJXy.XL3$Axv54rjknCBT0n/N5CXRB4ead4sg3o2XOdXAlClRfCCNBgxMGwPWeBIXLsaDPiDXw6gx9KavaAxsxztZYt4k3/::0:99999:7:::
#第1字段:用户账号名
#第2字段:加密的密码,!!表示密码被锁定,不能使用
#第3字段:上次修改密码的时间,距 1970-01-01 过去多少天
#第4字段:密码最短有效期(距上次密码修改起多少天内不能再次修改密码)单位"天"。"0"表示随时可修改密码。
#第5字段:密码最长有效期(在修改密码后的多少天必须重新修改密码。99999 表示永久可以使用。)
#第6字段:提前多少天警告用户口令将过期(7 表示在密码过期前7天开始警告。)
#第7字段:在密码过期之后多少天禁用此用户。
#第8字段:密码过期日期,若设置则显示为过期日期距 1970 年1月1日多少天。
#第9字段:保留字段(未使用)。
/etc/group
bash
[root@MineGi ~]# head -1 /etc/group
root:x:0:
#第1个字段:组名
#第2个字段:密码占位符
#第3个字段:GID
#第4个字段:组内的成员信息
/etc/gshadow
bash
[root@MineGi ~]# head -1 /etc/gshadow
root:::
/etc/skel/
bash
[root@MineGi ~]# ls -lA /etc/skel/
total 12
-rw-r--r--. 1 root root 18 Apr 11 2018 .bash_logout
-rw-r--r--. 1 root root 193 Apr 11 2018 .bash_profile
-rw-r--r--. 1 root root 231 Apr 11 2018 .bashrc
/etc/login.defs
bash
[root@MineGi ~]# grep -Ev "^$|^#" /etc/login.defs
MAIL_DIR /var/spool/mail #用户邮件存放目录
PASS_MAX_DAYS 99999 #密码默认最长有效期
PASS_MIN_DAYS 0 #密码默认最短有效期
PASS_MIN_LEN 5 #密码默认长度
PASS_WARN_AGE 7 #密码过期警告时间
UID_MIN 1000 #普通用户起始UID范围
UID_MAX 60000 #普通用户结束UID范围
SYS_UID_MIN 201 #系统用户起始UID范围
SYS_UID_MAX 999 #系统用户结束UID范围
GID_MIN 1000 #普通组起始GID范围
GID_MAX 60000 #普通组结束GID范围
SYS_GID_MIN 201 #系统组起始GID范围
SYS_GID_MAX 999 #系统组结束GID范围
CREATE_HOME yes #是否创建用户宿主目录
UMASK 077 #用户宿主目录默认权限
USERGROUPS_ENAB yes #表示userdel删除用户时,如果该用户用户组如果没有成员存在,则会删除该用户组
ENCRYPT_METHOD SHA512 #表示用户密码加密方式,此处表示用MD5加密密码
/etc/default/useradd
bash
[root@MineGi ~]# grep -Ev "^$|^#" /etc/default/useradd
GROUP=100
HOME=/home #把用户的主目录建在/home中
INACTIVE=-1 #是否启用帐号过期停权,-1表示不启用
EXPIRE= #帐号终止日期,不设置表示不启用;
SHELL=/bin/bash #所用SHELL的类型;
SKEL=/etc/skel #默认添加用户的目录默认文件存放位置;也就是说,当我们用adduser添加用户时,用户家目录下的文件,都是从这个目录中复制过去的
/lib64/security/pam_cracklib.so #控制密码复杂度的关键文件,Redhat公司专门开发了cracklib这个安装包来判断密码的复杂度。
[root@MineGi ~]# man pam_cracklib
retry=N #改变输入密码的次数,默认值是1。就是说,如果用户输入的密码强度不够就退出。可以使用这个选项设置输入的次数,以免一切都从头再来
minlen=N #新密码最低可接受的长度
difok=N #默认值为10。这个参数设置允许的新、旧密码相同字符的个数。不过,如果新密码中1/2的字符和旧密码不同,则新密码被接受
dcredit=N #限制新密码中至少有多少个数字
ucredit=N #限制新密码中至少有多少个大写字符。
lcredit=N #限制新密码中至少有多少个小写字符。
实践操作
bash
1. 创建一个新用户 username1 使用默认的家目录和 shell
grep username1 /etc/passwd
ls -ld /home/username1
useradd username1
grep username1 /etc/passwd
ls -ld /home/username1
ls -lA /home/username1
2. 创建一个新用户 username2 指定家目录和登录 shell
useradd -d /opt/username2 -s /bin/sh username2
grep username2 /etc/passwd
ls -ld /home/username2
ls -ld /opt/username2
ls -lA /opt/username2
3. 创建一个新用户 username3 但不创建家目录,亦不让登录系统
useradd -M -s /sbin/nologin username3
grep username3 /etc/passwd
ls -ld /home/username3
4. 创建一个新用户 username4 并自定义 UID 值
tail -3 /etc/passwd
useradd -u 6688 username4
tail -4 /etc/passwd
5. 创建一个新用户 username5 并追加指定组为该用户的扩展组
grep username5 /etc/group
useradd -G root username5
grep username5 /etc/group
tail -5 /etc/group
6. 创建一个新用户 username6 并指定过期时间
useradd -e "3000-01-01" username6
grep username6 /etc/passwd
grep username6 /etc/shadow
tail -6 /etc/shadow
7. 创建一个新用户 username7 用于系统账户
useradd -r username7
grep username7 /etc/passwd
ls -ld /home/username7
#使用 -r 参数时,useradd 命令会:
#创建一个 UID 小于 UID_MIN 的账户(通常在 /etc/login.defs 中定义)
#不创建家目录(除非明确指定)将登录 shell 设置为 /sbin/nologin(在大多数系统上)
# -r 的主要目的是创建系统账户,阻止登录是它的副作用。
# 如果你只是想阻止普通用户账户登录,使用 -s /sbin/nologin 可能更直接和明确。
#在某些系统上,-r 可能不会自动设置 /sbin/nologin 作为 shell,所以显式使用 -s 参数更可靠。
注意事项
- 在创建用户时,如果指定了 -m 选项但家目录已存在,并且该目录的所有者不是 root 或与指定的 UID 不匹配,则 useradd 命令可能会失败。
- 创建用户后,通常需要设置用户密码,这可以通过 passwd 命令完成:passwd 用户名。
- 使用 useradd 时,请确保你有足够的权限(通常是 root 权限)来创建用户。
- 在使用 useradd 命令时,务必谨慎指定 UID 和 GID,确保它们不与现有的用户或组冲突。
- 对于需要特定环境或配置的用户,可以通过 --skel 选项预先准备好一个包含必要文件和配置的目录,并在创建用户时指定该目录。
- 创建系统账户时,通常不需要设置登录shell和家目录,因为这些账户主要用于后台服务,不需要交互式登录。
- 在多用户环境中,合理使用用户组和权限控制是维护系统安全的关键。通过 useradd 的 -G 选项将用户添加到适当的组中,可以方便地进行权限管理。
- 定期审查和更新用户账户是良好的安全管理实践。这包括检查用户的过期日期、登录活动、组成员身份等,以及及时删除不再需要的账户。