账号管理之新增用户useradd,useradd,chage,userdel

* useradd

[root@study ~]# useradd [-u UID] [-g 初始群组] [-G 次要群组] [-mM]\
>	[-c 说明栏] [-d 家目录绝对路径] [-s shell] 使用者账号名
选项与参数:
-u :后面接的是 UID ,是一组数字。直接指定一个特定的 UID 给这个账号;
-g :后面接的那个组名就是我们上面提到的 initial group 啦~
该群组的 GID 会被放置到 /etc/passwd 的第四个字段内。
-G
:后面接的组名则是这个账号还可以加入的群组。
这个选项与参数会修改 /etc/group 内的相关资料喔!
-M :强制!不要建立用户家目录!(系统账号默认值)
-m :强制!要建立用户家目录!(一般账号默认值)
-c :这个就是 /etc/passwd 的第五栏的说明内容啦~可以随便我们设定的啦~
-d :指定某个目录成为家目录,而不要使用默认值。务必使用绝对路径!
-r :建立一个系统的账号,这个账号的 UID 会有限制 (参考 /etc/login.defs)
-s :后面接一个 shell ,若没有指定则预设是 /bin/bash 的啦~
-e :后面接一个日期,格式为『YYYY-MM-DD』此项目可写入 shadow 第八字段,
亦即账号失效日的设定项目啰;
-f
:后面接 shadow 的第七字段项目,指定密码是否会失效。0 为立刻失效,
-1 为永远不失效(密码只会过期而强制于登入时重新设定而已。)

默认值建立一个用户

范例一:完全参考默认值建立一个用户,名称为 vbird1
[root@study ~]# useradd vbird1
[root@study ~]# ll -d /home/vbird1
drwx------. 3 vbird1 vbird1 74 Jul 20 21:50 /home/vbird1
# 默认会建立用户家目录,且权限为 700 !这是重点!
[root@study ~]# grep vbird1 /etc/passwd /etc/shadow /etc/group
/etc/passwd:vbird1:x:1003:1004::/home/vbird1:/bin/bash
/etc/shadow:vbird1:!!:16636:0:99999:7:::
/etc/group:vbird1:x:1004:
<==预设会建立一个与账号一模一样的群组名

默认值主要会帮我们处理几个项目

  • 在 /etc/passwd 里面建立一行与账号相关的数据,包括建立 UID/GID/家目录等;
  • 在 /etc/shadow 里面将此账号的密码相关参数填入,但是尚未有密码;
  • 在 /etc/group 里面加入一个与账号名称一模一样的组名;
  • 在 /home 底下建立一个与账号同名的目录作为用户家目录,且权限为 700

users 为初始群组,以及 uid 为 1500 来建立一个名为 vbird2 的账号

范例二:假设我已知道我的系统当中有个组名为 users ,且 UID 1500 并不存在,
请用 users 为初始群组,以及 uid 为 1500 来建立一个名为 vbird2 的账号
[root@study ~]# useradd -u 1500 -g users vbird2
[root@study ~]# ll -d /home/vbird2
drwx------. 3 vbird2 users 74 Jul 20 21:52 /home/vbird2
[root@study ~]# grep vbird2 /etc/passwd /etc/shadow /etc/group
/etc/passwd:vbird2:x:1500:100::/home/vbird2:/bin/bash
/etc/shadow:vbird2:!!:16636:0:99999:7:::
# 看一下,UID 与 initial group 确实改变成我们需要的了!

系统账号


范例三:建立一个系统账号,名称为 vbird3
[root@study ~]# useradd -r vbird3
[root@study ~]# ll -d /home/vbird3
ls: cannot access /home/vbird3: No such file or directorya
<==不会主动建立家目录
[root@study ~]# grep vbird3 /etc/passwd /etc/shadow /etc/group
/etc/passwd:vbird3:x:699:699::/home/vbird3:/bin/bash
/etc/shadow:vbird3:!!:16636::::::
/etc/group:vbird3:x:699:

由于系统账号主要是用来进行运作系统所需服务的权限设定, 所以系统账号默认都不会主动建立家目录的!
使用 useradd 建立使用者账号时,其实会更改不少地方,至少我们就
知道底下几个文件:

  • 用户账号与密码参数方面的文件:/etc/passwd, /etc/shadow
  • 使用者群组相关方面的文件:/etc/group, /etc/gshadow
  • 用户的家目录:/home/账号名称

useradd 参考档/etc/default/useradd

这个数据其实是由 /etc/default/useradd 呼叫出来的!你可以自行用 vim 去观察该文件的内容。搭配上头刚刚谈过的范例一的运作结果,上面这些设定项目所造成的行为分别是:

[root@study ~]# useradd -D
GROUP=100<==预设的群组
HOME=/home <==默认的家目录所在目录
INACTIVE=-1 <==密码失效日,在 shadow 内的第 7EXPIRE= <==账号失效日,在 shadow 内的第 8SHELL=/bin/bash <==预设的 shell
SKEL=/etc/skel <==用户家目录的内容数据参考目录
CREATE_MAIL_SPOOL=yes<==是否主动帮使用者建立邮件信箱(mailbox)
  • GROUP=100:新建账号的初始群组使用 GID 为 100 者
    此设定项目指的就是让新设使用者账号的初始群组为 users 这一个的意思。 但是我们知道 CentOS 上面并不是这样的,在 CentOS 上面预设的
    群组为与账号名相同的群组。

这是因
为针对群组的角度有两种不同的机制所致, 这两种机制分别是:

私有群组机制:
系统会建立一个与账号一样的群组给使用者作为初始群组。 这种群组的设定机制会比较有保密性,这是因为使用者都有自己的群组,而且家目录权限将会设定为 700 (仅有自己可进入自己的家目录)之故。使用这种机制将不会参考 GROUP=100 这个设定值。代表性的 distributions 有 RHEL,Fedora, CentOS 等;

公共群组机制:就是以 GROUP=100 这个设定值作为新建账号的初始群组,因此每个账号都属于 users 这个群组,且默认家目录通常的权限会是『 drwxr-xr-x … username users … 』,由于每个账号都属于 users 群组,因此大家都可以互相分享家目录内的数据之故。代表 distributions 如 SuSE 等。由于我们的 CentOS 使用私有群组机制,因此这个设定项目是不会生效的!不要太紧张啊!

  • HOME=/home:用户家目录的基准目录(basedir)
  • INACTIVE=-1:密码过期后是否会失效的设定值
  • EXPIRE=:账号失效的日期
  • SHELL=/bin/bash:默认使用的 shell 程序文件名
  • SKEL=/etc/skel:用户家目录参考基准目录

vbird1 家目录/home/vbird1 内的各项数据,都是由 /etc/skel 所复制过去的~所以呢未来如果我想要让新增使用者时,该用户的环境变量 ~/.bashrc 就设定妥当的话,您可以到 /etc/skel/.bashrc 去编辑一下,也可以建立 /etc/skel/www 这个目录,那么未来新增使用者后,在他的家目录下就会有 www 那个目录了!

  • CREATE_MAIL_SPOOL=yes:建立使用者的 mailbox

除了这些基本的账号设定值之外, UID/GID 还有密码参数又是在哪里参考的呢?那就得要看一下/etc/login.defs 啦!

/etc/login.defs

MAIL_DIR /var/spool/mail		<==用户默认邮件信箱放置目录
PASS_MAX_DAYS 99999				<==/etc/shadow 内的第 5 栏,多久需变更密码日数
PASS_MIN_DAYS 0 				<==/etc/shadow 内的第 4 栏,多久不可重新设定密码日数
PASS_MIN_LEN 5 					<==密码最短的字符长度,已被 pam 模块取代,失去效用!
PASS_WARN_AGE 7 				<==/etc/shadow 内的第 6 栏,过期前会警告的日数
UID_MIN 1000					<==使用者最小的 UID,意即小于 1000UID 为系统保留
UID_MAX 60000					<==使用者能够用的最大 UID

SYS_UID_MIN 201 				<==保留给用户自行设定的系统账号最小值 UID
SYS_UID_MAX 999 				<==保留给用户自行设定的系统账号最大值 UID
GID_MIN 1000					<==使用者自定义组的最小 GID,小于 1000 为系统保留
GID_MAX 60000					<==使用者自定义组的最大 GID
SYS_GID_MIN 201 				<==保留给用户自行设定的系统账号最小值 GID
SYS_GID_MAX 999 				<==保留给用户自行设定的系统账号最大值 GID
CREATE_HOME yes 				<==在不加 -M 及 -m 时,是否主动建立用户家目录?
UMASK 077 						<==用户家目录建立的 umask ,因此权限会是 700
USERGROUPS_ENAB yes 			<==使用 userdel 删除时,是否会删除初始群组
ENCRYPT_METHOD SHA512 			<==密码加密的机制使用的是 sha512 这一个机制!

Linux 核心支持的账号可高达 2^32 这么多个

要注意的是,系统给予一个账号 UID 时,他是 (1)先参考 UID_MIN 设定值取得最小数值; (2)由/etc/passwd 搜寻最大的 UID 数值, 将 (1) 与 (2) 相比,找出最大的那个再加一就是新账号的 UID 了.我们上面已经作出 UID 为 1500 的 vbird2 , 如果再使用『 useradd vbird4 』时,你猜 vbird4 的 UID 会是多少?答案是: 1501 。 所以中间的 1004~1499 的号码就空下来啦!而如果我是想要建立系统用的账号,所以使用 useradd -r sysaccount 这个 -r 的选项时,就会找『比 201 大但比 1000 小的最大的 UID 』就是了。 _

用『USERGROUPS_ENAB yes』这个设定值的功能是: 如果使用 userdel 去删除一个账号时,且该账号所属的初始群组已经没有人隶属于该群组了, 那么就删除掉该群组

使用 useradd 这支程序在建立 Linux 上的账号时至少会参考:

  • /etc/default/useradd
  • /etc/login.defs
  • /etc/skel/*

这些文件,不过,最重要的其实是建立 /etc/passwd, /etc/shadow, /etc/group, /etc/gshadow 还有用户家目录就是了~所以,如果你了解整个系统运作的状态,也是可以手动直接修改这几个文件就是了

useradd

[root@study ~]# passwd [--stdin] [账号名称]
<==所有人均可使用来改自己的密码
[root@study ~]# passwd [-l] [-u] [--stdin] [-S] \
>
[-n 日数] [-x 日数] [-w 日数] [-i 日期] 账号 <==root 功能
选项与参数:
--stdin :可以透过来自前一个管线的数据,作为密码输入,对 shell script 有帮助!
-l :是 Lock 的意思,会将 /etc/shadow 第二栏最前面加上 ! 使密码失效;
-u :与 -l 相对,是 Unlock 的意思!
-S :列出密码相关参数,亦即 shadow 文件内的大部分信息。
-n :后面接天数,shadow 的第 4 字段,多久不可修改密码天数
-x :后面接天数,shadow 的第 5 字段,多久内必须要更动密码
-w :后面接天数,shadow 的第 6 字段,密码过期前的警告天数
-i :后面接『日期』,shadow 的第 7 字段,密码失效日期
范例一:请 root 给予 vbird2 密码
[root@study ~]# passwd vbird2
Changing password for user vbird2.
New UNIX password: <==这里直接输入新的密码,屏幕不会有任何反应
BAD PASSWORD: The password is shorter than 8 characters <==密码太简单或过短的错误!
Retype new UNIX password:<==再输入一次同样的密码

新的 distributions 是使用较严格的 PAM 模块来管理密码,这个管理的机制写在 /etc/pam.d/passwd,该文件与密码有关的测试模块就是使用:
pam_cracklib.so,这个模块会检验密码相关的信息, 并且取代 /etc/login.defs 内的 PASS_MIN_LEN的设定

范例二:用 vbird2 登入后,修改 vbird2 自己的密码

范例二:用 vbird2 登入后,修改 vbird2 自己的密码
[vbird2@study ~]$ passwd
<==后面没有加账号,就是改自己的密码!
Changing password for user vbird2.
Changing password for vbird2
(current) UNIX password: <==这里输入『原有的旧密码』
New UNIX password: <==这里输入新密码
BAD PASSWORD: The password is shorter than 8 characters <==密码太短!不可以设定!重新想
New password:
<==这里输入新想的密码
BAD PASSWORD: The password fails the dictionary check - it is based on a dictionary word
# 同样的,密码设定在字典里面找的到该字符串,所以也是不建议!无法通过,再想新的!
New UNIX password: <==这里再想个新的密码来输入吧
Retype new UNIX password: <==通过密码验证!所以重复这个密码的输入
passwd: all authentication tokens updated successfully. <==有无成功看关键词

例三:使用 standard input 建立用户的密码

例三:使用 standard input 建立用户的密码
[root@study ~]# echo "abc543CC" | passwd --stdin vbird2
Changing password for user vbird2.
passwd: all authentication tokens updated successfully.

要注意的是,这个选项并不存在所有 distributions 版本中, 请使用 man passwd 确认你的 distribution 是否有支持此选项喔!

范例四:管理 vbird2 的密码使具有 60 天变更、密码过期 10 天后账号失效的设定

范例四:管理 vbird2 的密码使具有 60 天变更、密码过期 10 天后账号失效的设定
[root@study ~]# passwd -S vbird2
vbird2 PS 2015-07-20 0 99999 7 -1 (Password set, SHA512 crypt.)
# 上面说明密码建立时间 (2015-07-20)、0 最小天数、99999 变更天数、7 警告日数与密码不会失效 (-1)
[root@study ~]# passwd -x 60 -i 10 vbird2
[root@study ~]# passwd -S vbird2
vbird2 PS 2015-07-20 0 60 7 10 (Password set, SHA512 crypt.)

范例五:让 vbird2 的账号失效,观察完毕后再让她失效

范例五:让 vbird2 的账号失效,观察完毕后再让她失效
[root@study ~]# passwd -l vbird2
[root@study ~]# passwd -S vbird2
vbird2 LK 2015-07-20 0 60 7 10 (Password locked.)
# 嘿嘿!状态变成『 LK, Lock 』了啦!无法登入喔!
[root@study ~]# grep vbird2 /etc/shadow
vbird2:!!$6$iWWO6T46$uYStdkB7QjcUpJaCLB.OOp...:16636:0:60:7:10::
# 其实只是在这里加上 !! 而已!
[root@study ~]# passwd -u vbird2
[root@study ~]# grep vbird2 /etc/shadow
vbird2:$6$iWWO6T46$uYStdkB7QjcUpJaCLB.OOp...:16636:0:60:7:10::
# 密码字段恢复正常!

chage

[root@study ~]# chage [-ldEImMW] 账号名
选项与参数:
-l :列出该账号的详细密码参数;
-d :后面接日期,修改 shadow 第三字段(最近一次更改密码的日期),格式 YYYY-MM-DD
-E :后面接日期,修改 shadow 第八字段(账号失效日),格式 YYYY-MM-DD
-I :后面接天数,修改 shadow 第七字段(密码失效日期)
-m :后面接天数,修改 shadow 第四字段(密码最短保留天数)
-M :后面接天数,修改 shadow 第五字段(密码多久需要进行变更)
-W :后面接天数,修改 shadow 第六字段(密码过期前警告日期)
范例一:列出 vbird2 的详细密码参数
[root@study ~]# chage -l vbird2
Last password change : Jul 20, 2015
Password expires : Sep 18, 2015
Password inactive : Sep 28, 2015
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 60
Number of days of warning before password expires : 7

范例二:建立一个名为 agetest 的账号,该账号第一次登入后使用默认密码,但必须要更改过密码后,

范例二:建立一个名为 agetest 的账号,该账号第一次登入后使用默认密码,但必须要更改过密码后,使用新密码才能够登入系统使用 bash 环境
[root@study ~]# useradd agetest
[root@study ~]# echo "agetest" | passwd --stdin agetest
[root@study ~]# chage -d 0 agetest
[root@study ~]# chage -l agetest | head -n 3
Last password change : password must be changed
Password expires : password must be changed
Password inactive : password must be changed
# 此时此账号的密码建立时间会被改为 1970/1/1 ,所以会有问题!
范例三:尝试以 agetest 登入的情况
You are required to change your password immediately (root enforced)
WARNING: Your password has expired.
You must change your password now and login again!
Changing password for user agetest.
Changing password for agetest
(current) UNIX password:
<==这个账号被强制要求必须要改密码!

usermod

在使用 useradd 后,发现某些地方还可以进行细部修改。 此时,当然我们可以直接到 /etc/passwd 或 /etc/shadow 去修改相对应字段的数据, 不过,Linux 也有提供相关的指令让大家来进行账号相关数据的微调呢那就是 usermod 啰~

[root@study ~]# usermod [-cdegGlsuLU] username
选项与参数:
-c :后面接账号的说明,即 /etc/passwd 第五栏的说明栏,可以加入一些账号的说明。
-d :后面接账号的家目录,即修改 /etc/passwd 的第六栏;
-e :后面接日期,格式是 YYYY-MM-DD 也就是在 /etc/shadow 内的第八个字段数据啦!
-f :后面接天数,为 shadow 的第七字段。
-g :后面接初始群组,修改 /etc/passwd 的第四个字段,亦即是 GID 的字段!
-G :后面接次要群组,修改这个使用者能够支持的群组,修改的是 /etc/group 啰~
-a :与 -G 合用,可『增加次要群组的支持』而非『设定』喔!
-l :后面接账号名称。亦即是修改账号名称, /etc/passwd 的第一栏!
-s :后面接 Shell 的实际文件,例如 /bin/bash 或 /bin/csh 等等。
-u :后面接 UID 数字啦!即 /etc/passwd 第三栏的资料;
-L :暂时将用户的密码冻结,让他无法登入。其实仅改 /etc/shadow 的密码栏。
-U :将 /etc/shadow 密码栏的 ! 拿掉,解冻啦!

范例一:修改使用者 vbird2 的说明栏,加上『VBird’s test』的说明。

范例一:修改使用者 vbird2 的说明栏,加上『VBirds test』的说明。
[root@study ~]# usermod -c "VBird's test" vbird2
[root@study ~]# grep vbird2 /etc/passwd
vbird2:x:1500:100:VBird's test:/home/vbird2:/bin/bash
范例二:使用者 vbird2 这个账号在 2015/12/31 失效。
[root@study ~]# usermod -e "2015-12-31" vbird2
[root@study ~]# chage -l vbird2 | grep 'Account expires'
Account expires
: Dec 31, 2015
范例三:我们建立 vbird3 这个系统账号时并没有给予家目录,请建立他的家目录
[root@study ~]# ll -d ~vbird3
ls: cannot access /home/vbird3: No such file or directory
<==确认一下,确实没有家目录的存在!
[root@study ~]# cp -a /etc/skel /home/vbird3
[root@study ~]# chown -R vbird3:vbird3 /home/vbird3
[root@study ~]# chmod 700 /home/vbird3
[root@study ~]# ll -a ~vbird3
drwx------.
3 vbird3 vbird3
drwxr-xr-x. 10 root
root
74 May
4 17:51 .
<==用户家目录权限
4096 Jul 20 22:51 ..
-rw-r--r--. 1 vbird3 vbird3 18 Mar 6 06:06 .bash_logout
-rw-r--r--. 1 vbird3 vbird3 193 Mar 6 06:06 .bash_profile
-rw-r--r--. 1 vbird3 vbird3 231 Mar 6 06:06 .bashrc
drwxr-xr-x. 4 vbird3 vbird3 37 May 4 17:51 .mozilla
# 使用 chown -R 是为了连同家目录底下的用户/群组属性都一起变更的意思;
# 使用 chmod 没有 -R ,是因为我们仅要修改目录的权限而非内部文件的权限!

userdel

这个功能就太简单了,目的在删除用户的相关数据,而用户的数据有:

  • 用户账号/密码相关参数:/etc/passwd, /etc/shadow
  • 使用者群组相关参数:/etc/group, /etc/gshadow
  • 用户个人文件数据: /home/username, /var/spool/mail/username…
[root@study ~]# userdel [-r] username
选项与参数:
-r		:连同用户的家目录也一起删除
范例一:删除 vbird2 ,连同家目录一起删除
[root@study ~]# userdel -r vbird2

般而言,如果该账号只是『暂时不启用』的话,那么将/etc/shadow 里头账号失效日期 (第八字段) 设定为 0 就可以让该账号无法使用,但是所有跟该账号相关的数据都会留下来! 使用 userdel 的时机通常是『你真的确定不要让该用户在主机上面使用任何数据了!』
另外,其实用户如果在系统上面操作过一阵子了,那么该用户其实在系统内可能会含有其他文件的。举例来说,他的邮件信箱 (mailbox) 或者是例行性工作排程 (crontab, 十五章) 之类的文件。 所以,如果想要完整的将某个账号完整的移除,最好可以在下达 userdel -r username 之前, 先以『 find / -user username 』查出整个系统内属于 username 的文件,然后再加以删除吧!

おすすめ

転載: blog.csdn.net/qq_52835624/article/details/119153279
おすすめ