## 13.2 帐号管理
好啦!既然要管理帐号,当然是由新增与移除使用者开始的啰~下面我们就分别来谈一谈如何新增、 移除与更改使用者的相关信息吧~
### 13.2.1 新增与移除使用者: useradd, 相关配置文件, passwd, usermod, userdel
要如何在 Linux 的系统新增一个使用者啊?呵呵~真是太简单了~我们登陆系统时会输入 (1)帐号与 (2)密码, 所以创建一个可用的帐号同样的也需要这两个数据。那帐号可以使用 useradd 来新建使用者,密码的给予则使用 passwd 这个指令!这两个指令下达方法如下:
* 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: <==默认会创建一个与帐号一模一样的群组名
```
其实系统已经帮我们规定好非常多的默认值了,所以我们可以简单的使用“ useradd 帐号 ”来创建使用者即可。 CentOS 这些默认值主要会帮我们处理几个项目:
* 在 /etc/passwd 里面创建一行与帐号相关的数据,包括创建 UID/GID/主文件夹等;
* 在 /etc/shadow 里面将此帐号的密码相关参数填入,但是尚未有密码;
* 在 /etc/group 里面加入一个与帐号名称一模一样的群组名称;
* 在 /home 下面创建一个与帐号同名的目录作为使用者主文件夹,且权限为 700
由于在 /etc/shadow 内仅会有密码参数而不会有加密过的密码数据,因此我们在创建使用者帐号时, 还需要使用“ passwd 帐号 ”来给予密码才算是完成了使用者创建的流程。如果由于特殊需求而需要改变使用者相关参数时, 就得要通过上述表格中的选项来进行创建了,参考下面的案例:
```
范例二:假设我已知道我的系统当中有个群组名称为 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 确实改变成我们需要的了!
```
在这个范例中,我们创建的是指定一个已经存在的群组作为使用者的初始群组,因为群组已经存在, 所以在 /etc/group 里面就不会主动的创建与帐号同名的群组了! 此外,我们也指定了特殊的 UID 来作为使用者的专属 UID 喔!了解了一般帐号后,我们来瞧瞧那啥是系统帐号 (system account) 吧!
```
范例三:创建一个系统帐号,名称为 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:
```
我们在谈到 UID 的时候曾经说过一般帐号应该是 1000 号以后,那使用者自己创建的系统帐号则一般是小于 1000 号以下的。 所以在这里我们加上 -r 这个选项以后,系统就会主动将帐号与帐号同名群组的 UID/GID 都指定小于 1000 以下, 在本案例中则是使用 699(UID) 与 699(GID) 啰!此外,由于系统帐号主要是用来进行运行系统所需服务的权限设置, 所以系统帐号默认都不会主动创建主文件夹的!
由这几个范例我们也会知道,使用 useradd 创建使用者帐号时,其实会更改不少地方,至少我们就知道下面几个文件:
* 使用者帐号与密码参数方面的文件:/etc/passwd, /etc/shadow
* 使用者群组相关方面的文件:/etc/group, /etc/gshadow
* 使用者的主文件夹:/home/帐号名称
那请教一下,你有没有想过,为何“ useradd vbird1 ”会主动在 /home/vbird1 创建起使用者的主文件夹?主文件夹内有什么数据且来自哪里?为何默认使用的是 /bin/bash 这个 shell ?为何密码字段已经都规范好了 (0:99999:7 那一串)?呵呵!这就得要说明一下 useradd 所使用的参考文件啰!
* useradd 参考档
其实 useradd 的默认值可以使用下面的方法调用出来:
```
[root@study ~]# useradd -D
GROUP=100 <==默认的群组
HOME=/home <==默认的主文件夹所在目录
INACTIVE=-1 <==密码失效日,在 shadow 内的第 7 栏
EXPIRE= <==帐号失效日,在 shadow 内的第 8 栏
SHELL=/bin/bash <==默认的 shell
SKEL=/etc/skel <==使用者主文件夹的内容数据参考目录
CREATE_MAIL_SPOOL=yes <==是否主动帮使用者创建邮件信箱(mailbox)
```
这个数据其实是由 /etc/default/useradd 调用出来的!你可以自行用 vim 去观察该文件的内容。搭配上头刚刚谈过的范例一的运行结果,上面这些设置项目所造成的行为分别是:
* GROUP=100:新建帐号的初始群组使用 GID 为 100 者
系统上面 GID 为 100 者即是 users 这个群组,此设置项目指的就是让新设使用者帐号的初始群组为 users 这一个的意思。 但是我们知道 CentOS 上面并不是这样的,在 CentOS 上面默认的群组为与帐号名相同的群组。 举例来说, vbird1 的初始群组为 vbird1 。怎么会这样啊?这是因为针对群组的角度有两种不同的机制所致, 这两种机制分别是:
* 私有群组机制:
系统会创建一个与帐号一样的群组给使用者作为初始群组。 这种群组的设置机制会比较有保密性,这是因为使用者都有自己的群组,而且主文件夹权限将会设置为 700 (仅有自己可进入自己的主文件夹) 之故。使用这种机制将不会参考 GROUP=100 这个设置值。代表性的 distributions 有 RHEL, Fedora, CentOS 等;
* 公共群组机制:
就是以 GROUP=100 这个设置值作为新建帐号的初始群组,因此每个帐号都属于 users 这个群组, 且默认主文件夹通常的权限会是“ drwxr-xr-x ... username users ... ”,由于每个帐号都属于 users 群组,因此大家都可以互相分享主文件夹内的数据之故。代表 distributions 如 SuSE等。
由于我们的 CentOS 使用私有群组机制,因此这个设置项目是不会生效的!不要太紧张啊!
* HOME=/home:使用者主文件夹的基准目录(basedir)
使用者的主文件夹通常是与帐号同名的目录,这个目录将会摆放在此设置值的目录后。所以 vbird1 的主文件夹就会在 /home/vbird1/ 了!很容易理解吧!
* INACTIVE=-1:密码过期后是否会失效的设置值
我们在 [shadow](../Text/index.html#shadow_file) 文件结构当中谈过,第七个字段的设置值将会影响到密码过期后, 在多久时间内还可使用旧密码登陆。这个项目就是在指定该日数啦!如果是 0 代表密码过期立刻失效, 如果是 -1 则是代表密码永远不会失效,如果是数字,如 30 ,则代表过期 30 天后才失效。
* EXPIRE=:帐号失效的日期
就是 [shadow](../Text/index.html#shadow_file) 内的第八字段,你可以直接设置帐号在哪个日期后就直接失效,而不理会密码的问题。 通常不会设置此项目,但如果是付费的会员制系统,或许这个字段可以设置喔!
* SHELL=/bin/bash:默认使用的 shell 程序文件名
系统默认的 shell 就写在这里。假如你的系统为 mail server ,你希望每个帐号都只能使用 email 的收发信件功能, 而不许使用者登陆系统取得 shell ,那么可以将这里设置为 /sbin/nologin ,如此一来,新建的使用者默认就无法登陆! 也免去后续使用 [usermod](../Text/index.html#usermod) 进行修改的手续!
* SKEL=/etc/skel:使用者主文件夹参考基准目录
这个咚咚就是指定使用者主文件夹的参考基准目录啰~举我们的范例一为例, vbird1 主文件夹 /home/vbird1 内的各项数据,都是由 /etc/skel 所复制过去的~所以呢,未来如果我想要让新增使用者时,该使用者的环境变量 ~/.bashrc 就设置妥当的话,您可以到 /etc/skel/.bashrc 去编辑一下,也可以创建 /etc/skel/www 这个目录,那么未来新增使用者后,在他的主文件夹下就会有 www 那个目录了!这样瞭呼?
* CREATE_MAIL_SPOOL=yes:创建使用者的 mailbox
你可以使用“ ll /var/spool/mail/vbird1 ”看一下,会发现有这个文件的存在喔!这就是使用者的邮件信箱!
除了这些基本的帐号设置值之外, UID/GID 还有密码参数又是在哪里参考的呢?那就得要看一下 /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,意即小于 1000 的 UID 为系统保留
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 这一个机制!
```
这个文件规范的数据则是如下所示:
* mailbox 所在目录:
使用者的默认 mailbox 文件放置的目录在 /var/spool/mail,所以 vbird1 的 mailbox 就是在 /var/spool/mail/vbird1 啰!
* shadow 密码第 4, 5, 6 字段内容:
通过 PASS_MAX_DAYS 等等设置值来指定的!所以你知道为何默认的 /etc/shadow 内每一行都会有“ 0:99999:7 ”的存在了吗?^_^!不过要注意的是,由于目前我们登陆时改用 PAM 模块来进行密码检验,所以那个 PASS_MIN_LEN 是失效的!
* UID/GID 指定数值:
虽然 Linux 核心支持的帐号可高达 232 这么多个,不过一部主机要作出这么多帐号在管理上也是很麻烦的! 所以在这里就针对 UID/GID 的范围进行规范就是了。上表中的 UID_MIN 指的就是可登陆系统的一般帐号的最小 UID ,至于 UID_MAX 则是最大 UID 之意。
要注意的是,系统给予一个帐号 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 ”就是了。 ^_^
* 使用者主文件夹设置值:
为何我们系统默认会帮使用者创建主文件夹?就是这个“CREATE_HOME = yes”的设置值啦!这个设置值会让你在使用 useradd 时, 主动加入“ -m ”这个产生主文件夹的选项啊!如果不想要创建使用者主文件夹,就只能强制加上“ -M ”的选项在 useradd 指令执行时啦!至于创建主文件夹的权限设置呢?就通过 [umask](../Text/index.html#umask) 这个设置值啊!因为是 077 的默认设置,因此使用者主文件夹默认权限才会是“ drwx------ ”哩!
* 使用者删除与密码设置值:
使用“USERGROUPS_ENAB yes”这个设置值的功能是: 如果使用 userdel 去删除一个帐号时,且该帐号所属的初始群组已经没有人隶属于该群组了, 那么就删除掉该群组,举例来说,我们刚刚有创建 vbird4 这个帐号,他会主动创建 vbird4 这个群组。 若 vbird4 这个群组并没有其他帐号将他加入支持的情况下,若使用 userdel vbird4 时,该群组也会被删除的意思。 至于“ENCRYPT_METHOD SHA512”则表示使用 SHA512 来加密密码明文,而不使用旧式的 MD5。
现在你知道啦,使用 useradd 这支程序在创建 Linux 上的帐号时,至少会参考:
* /etc/default/useradd
* /etc/login.defs
* /etc/skel/*
这些文件,不过,最重要的其实是创建 /etc/passwd, /etc/shadow, /etc/group, /etc/gshadow 还有使用者主文件夹就是了~所以,如果你了解整个系统运行的状态,也是可以手动直接修改这几个文件就是了。 OK!帐号创建了,接下来处理一下使用者的密码吧!
* passwd
刚刚我们讲到了,使用 useradd 创建了帐号之后,在默认的情况下,该帐号是暂时被封锁的, 也就是说,该帐号是无法登陆的,你可以去瞧一瞧 /etc/shadow 内的第二个字段就晓得啰~ 那该如何是好?怕什么?直接给他设置新密码就好了嘛!对吧~设置密码就使用 passwd 啰!
```
[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: <==再输入一次同样的密码
passwd: all authentication tokens updated successfully. <==竟然还是成功修改了!
```
root 果然是最伟大的人物!当我们要给予使用者密码时,通过 root 来设置即可。 root 可以设置各式各样的密码,系统几乎一定会接受!所以您瞧瞧,如同上面的范例一,明明鸟哥输入的密码太短了, 但是系统依旧可接受 vbird2 这样的密码设置。这个是 root 帮忙设置的结果,那如果是使用者自己要改密码呢? 包括 root 也是这样修改的喔!
```
范例二:用 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. <==有无成功看关键字
```
passwd 的使用真的要很注意,尤其是 root 先生啊!鸟哥在课堂上每次讲到这里,说是要帮自己的一般帐号创建密码时, 有一小部分的学生就是会忘记加上帐号,结果就变成改变 root 自己的密码,最后.... root 密码就这样不见去!唉~ 要帮一般帐号创建密码需要使用“ passwd 帐号 ”的格式,使用“ passwd ”表示修改自己的密码!拜托!千万不要改错!
与 root 不同的是,一般帐号在更改密码时需要先输入自己的旧密码 (亦即 current 那一行),然后再输入新密码 (New 那一行)。 要注意的是,密码的规范是非常严格的,尤其新的 distributions 大多使用 PAM 模块来进行密码的检验,包括太短、 密码与帐号相同、密码为字典常见字串等,都会被 PAM 模块检查出来而拒绝修改密码,此时会再重复出现“ New ”这个关键字! 那时请再想个新密码!若出现“ Retype ”才是你的密码被接受了!重复输入新密码并且看到“ successfully ”这个关键字时才是修改密码成功喔!
![鸟哥的图示](https://box.kancloud.cn/2016-05-13_5735736501917.gif "鸟哥的图示")
**Tips** 与一般使用者不同的是, root 并不需要知道旧密码就能够帮使用者或 root 自己创建新密码! 但如此一来有困扰~就是如果你的亲密爱人老是告诉你“我的密码真难记,帮我设置简单一点的!”时, 千万不要妥协啊!这是为了系统安全...
为何使用者要设订自己的密码会这么麻烦啊?这是因为密码的安全性啦!如果密码设置太简单, 一些有心人士就能够很简单的猜到你的密码,如此一来人家就可能使用你的一般帐号登陆你的主机或使用其他主机资源, 对主机的维护会造成困扰的!所以新的 distributions 是使用较严格的 PAM 模块来管理密码,这个管理的机制写在 /etc/pam.d/passwd 当中。而该文件与密码有关的测试模块就是使用:pam_cracklib.so,这个模块会检验密码相关的信息, 并且取代 /etc/login.defs 内的 PASS_MIN_LEN 的设置啦!关于 PAM 我们在本章后面继续介绍,这里先谈一下, 理论上,你的密码最好符合如下要求:
* 密码不能与帐号相同;
* 密码尽量不要选用字典里面会出现的字串;
* 密码需要超过 8 个字符;
* 密码不要使用个人信息,如身份证、手机号码、其他电话号码等;
* 密码不要使用简单的关系式,如 1+1=2, Iamvbird 等;
* 密码尽量使用大小写字符、数字、特殊字符($,_,-等)的组合。
为了方便系统管理,新版的 passwd 还加入了很多创意选项喔!鸟哥个人认为最好用的大概就是这个“ --stdin ”了! 举例来说,你想要帮 vbird2 变更密码成为 abc543CC ,可以这样下达指令呢!
```
范例三:使用 standard input 创建用户的密码
[root@study ~]# echo "abc543CC" | passwd --stdin vbird2
Changing password for user vbird2.
passwd: all authentication tokens updated successfully.
```
这个动作会直接更新使用者的密码而不用再次的手动输入!好处是方便处理,缺点是这个密码会保留在指令中, 未来若系统被攻破,人家可以在 /root/.bash_history 找到这个密码呢!所以这个动作通常仅用在 shell script 的大量创建使用者帐号当中!要注意的是,这个选项并不存在所有 distributions 版本中, 请使用 man passwd 确认你的 distribution 是否有支持此选项喔!
如果你想要让 vbird2 的密码具有相当的规则,举例来说你要让 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 这家伙最近老是胡乱在主机乱来, 所以我想要暂时让她无法登陆的话,最简单的方法就是让她的密码变成不合法 (shadow 第 2 字段长度变掉)! 处理的方法就更简单的!
```
范例五:让 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
除了使用 passwd -S 之外,有没有更详细的密码参数显示功能呢?有的!那就是 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
```
我们在 [passwd](../Text/index.html#passwd) 的介绍中谈到了处理 vbird2 这个帐号的密码属性流程,使用 passwd -S 却无法看到很清楚的说明。如果使用 chage 那可就明白多了!如上表所示,我们可以清楚的知道 vbird2 的详细参数呢! 如果想要修改其他的设置值,就自己参考上面的选项,或者自行 man chage 一下吧!^_^
chage 有一个功能很不错喔!如果你想要让“使用者在第一次登陆时, 强制她们一定要更改密码后才能够使用系统资源”,可以利用如下的方法来处理的!
```
范例二:创建一个名为 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: <==这个帐号被强制要求必须要改密码!
```
非常有趣吧!你会发现 agetest 这个帐号在第一次登陆时可以使用与帐号同名的密码登陆, 但登陆时就会被要求立刻更改密码,更改密码完成后就会被踢出系统。再次登陆时就能够使用新密码登陆了! 这个功能对学校老师非常有帮助!因为我们不想要知道学生的密码,那么在初次上课时就使用与学号相同的帐号/密码给学生, 让她们登陆时自行设置她们的密码,如此一来就能够避免其他同学随意使用别人的帐号,也能够保证学生知道如何更改自己的密码!
* usermod
所谓这“人有失手,马有乱蹄”,您说是吧?所以啰,当然有的时候会“不小心手滑了一下”在 useradd 的时候加入了错误的设置数据。或者是,在使用 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 密码栏的 ! 拿掉,解冻啦!
```
如果你仔细的比对,会发现 usermod 的选项与 [useradd](../Text/index.html#useradd) 非常类似! 这是因为 usermod 也是用来微调 useradd 增加的使用者参数嘛!不过 usermod 还是有新增的选项, 那就是 -L 与 -U ,不过这两个选项其实与 passwd 的 -l, -u 是相同的!而且也不见得会存在所有的 distribution 当中!接下来,让我们谈谈一些变更参数的实例吧!
```
范例一:修改使用者 vbird2 的说明栏,加上“VBird's 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 74 May 4 17:51 . <==使用者主文件夹权限
drwxr-xr-x. 10 root root 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/passwd 与 /etc/shadow 里头的该帐号取消即可!一般而言,如果该帐号只是“暂时不启用”的话,那么将 /etc/shadow 里头帐号失效日期 (第八字段) 设置为 0 就可以让该帐号无法使用,但是所有跟该帐号相关的数据都会留下来! 使用 userdel 的时机通常是“你真的确定不要让该用户在主机上面使用任何数据了!”
另外,其实使用者如果在系统上面操作过一阵子了,那么该使用者其实在系统内可能会含有其他文件的。 举例来说,他的邮件信箱 (mailbox) 或者是[例行性工作调度 (crontab, 十五章)](../Text/index.html) 之类的文件。 所以,如果想要完整的将某个帐号完整的移除,最好可以在下达 userdel -r username 之前, 先以“ find / -user username ”查出整个系统内属于 username 的文件,然后再加以删除吧!
### 13.2.2 使用者功能
不论是 useradd/usermod/userdel ,那都是系统管理员所能够使用的指令, 如果我是一般身份使用者,那么我是否除了密码之外,就无法更改其他的数据呢? 当然不是啦!这里我们介绍几个一般身份使用者常用的帐号数据变更与查询指令啰!
* id
id 这个指令则可以查询某人或自己的相关 UID/GID 等等的信息,他的参数也不少,不过,都不需要记~反正使用 id 就全部都列出啰! 另外,也回想一下,我们在前一章谈到的循环时,就有用过这个指令喔! ^_^
```
[root@study ~]# id [username]
范例一:查阅 root 自己的相关 ID 信息!
[root@study ~]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:
s0-s0:c0.c1023
# 上面信息其实是同一行的数据!包括会显示 UID/GID 以及支持的所有群组!
# 至于后面那个 context=... 则是 SELinux 的内容,先不要理会他!
范例二:查阅一下 vbird1 吧~
[root@study ~]# id vbird1
uid=1003(vbird1) gid=1004(vbird1) groups=1004(vbird1)
[root@study ~]# id vbird100
id: vbird100: No such user <== id 这个指令也可以用来判断系统上面有无某帐号!
```
* finger
finger 的中文字面意义是:“手指”或者是“指纹”的意思。这个 finger 可以查阅很多使用者相关的信息喔! 大部分都是在 /etc/passwd 这个文件里面的信息啦!不过,这个指令有点危险,所以新的版本中已经默认不安装这个软件! 好啦!现在继续来安装软件先~记得[第九章 dos2unix](../Text/index.html#tips_dos) 的安装方式! 假设你已经将光驱或光盘镜像文件挂载在 /mnt 下面了,所以:
```
[root@study ~]# df -hT /mnt
Filesystem Type Size Used Avail Use% Mounted on
/dev/sr0 iso9660 7.1G 7.1G 0 100% /mnt # 先确定是有挂载光盘的啦!
[root@study ~]# rpm -ivh /mnt/Packages/finger-[0-9]*
```
我们就先来检查检查使用者信息吧!
```
[root@study ~]# finger [-s] username
选项与参数:
-s :仅列出使用者的帐号、全名、终端机代号与登陆时间等等;
-m :列出与后面接的帐号相同者,而不是利用部分比对 (包括全名部分)
范例一:观察 vbird1 的使用者相关帐号属性
[root@study ~]# finger vbird1
Login: vbird1 Name:
Directory: /home/vbird1 Shell: /bin/bash
Never logged in.
No mail.
No Plan.
```
由于 finger 类似指纹的功能,他会将使用者的相关属性列出来!如上表所示,其实他列出来的几乎都是 /etc/passwd 文件里面的东西。列出的信息说明如下:
* Login:为使用者帐号,亦即 /etc/passwd 内的第一字段;
* Name:为全名,亦即 /etc/passwd 内的第五字段(或称为注解);
* Directory:就是主文件夹了;
* Shell:就是使用的 Shell 文件所在;
* Never logged in.:figner 还会调查使用者登陆主机的情况喔!
* No mail.:调查 /var/spool/mail 当中的信箱数据;
* No Plan.:调查 ~vbird1/.plan 文件,并将该文件取出来说明!
不过是否能够查阅到 Mail 与 Plan 则与权限有关了!因为 Mail / Plan 都是与使用者自己的权限设置有关, root 当然可以查阅到使用者的这些信息,但是 vbird1 就不见得能够查到 vbird3 的信息, 因为 /var/spool/mail/vbird3 与 /home/vbird3/ 的权限分别是 660, 700 ,那 vbird1 当然就无法查阅的到! 这样解释可以理解吧?此外,我们可以创建自己想要执行的预定计划,当然,最多是给自己看的!可以这样做:
```
范例二:利用 vbird1 创建自己的计划档
[vbird1@study ~]$ echo "I will study Linux during this year." > ~/.plan
[vbird1@study ~]$ finger vbird1
Login: vbird1 Name:
Directory: /home/vbird1 Shell: /bin/bash
Last login Mon Jul 20 23:06 (CST) on pts/0
No mail.
Plan:
I will study Linux during this year.
范例三:找出目前在系统上面登陆的使用者与登陆时间
[vbird1@study ~]$ finger
Login Name Tty Idle Login Time Office Office Phone Host
dmtsai dmtsai tty2 11d Jul 7 23:07
dmtsai dmtsai pts/0 Jul 20 17:59
```
在范例三当中,我们发现输出的信息还会有 Office, Office Phone 等信息,那这些信息要如何记录呢? 下面我们会介绍 chfn 这个指令!来看看如何修改使用者的 finger 数据吧!
* chfn
chfn 有点像是: change finger 的意思!这玩意的使用方法如下:
```
[root@study ~]# chfn [-foph] [帐号名]
选项与参数:
-f :后面接完整的大名;
-o :您办公室的房间号码;
-p :办公室的电话号码;
-h :家里的电话号码!
范例一:vbird1 自己更改一下自己的相关信息!
[vbird1@study ~]$ chfn
Changing finger information for vbird1.
Name []: VBird Tsai test <==输入你想要呈现的全名
Office []: DIC in KSU <==办公室号码
Office Phone []: 06-2727175#356 <==办公室电话
Home Phone []: 06-1234567 <==家里电话号码
Password: <==确认身份,所以输入自己的密码
Finger information changed.
[vbird1@study ~]$ grep vbird1 /etc/passwd
vbird1:x:1003:1004:VBird Tsai test,DIC in KSU,06-2727175#356,06-1234567:/home/vbird1:/bin/bash
# 其实就是改到第五个字段,该字段里面用多个“ , ”分隔就是了!
[vbird1@study ~]$ finger vbird1
Login: vbird1 Name: VBird Tsai test
Directory: /home/vbird1 Shell: /bin/bash
Office: DIC in KSU, 06-2727175#356 Home Phone: 06-1234567
Last login Mon Jul 20 23:12 (CST) on pts/0
No mail.
Plan:
I will study Linux during this year.
# 就是上面特殊字体呈现的那些地方是由 chfn 所修改出来的!
```
这个指令说实在的,除非是你的主机有很多的用户,否则倒真是用不着这个程序!这就有点像是 bbs 里头更改你“个人属性”的那一个数据啦!不过还是可以自己玩一玩!尤其是用来提醒自己相关数据啦! ^_^
* chsh
这就是 change shell 的简写!使用方法就更简单了!
```
[vbird1@study ~]$ chsh [-ls]
选项与参数:
-l :列出目前系统上面可用的 shell ,其实就是 /etc/shells 的内容!
-s :设置修改自己的 Shell 啰
范例一:用 vbird1 的身份列出系统上所有合法的 shell,并且指定 csh 为自己的 shell
[vbird1@study ~]$ chsh -l
/bin/sh
/bin/bash
/sbin/nologin <==所谓:合法不可登陆的 Shell 就是这玩意!
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh <==这就是 C shell 啦!
# 其实上面的信息就是我们在 [bash](../Text/index.html) 中谈到的 /etc/shells 啦!
[vbird1@study ~]$ chsh -s /bin/csh; grep vbird1 /etc/passwd
Changing shell for vbird1.
Password: <==确认身份,请输入 vbird1 的密码
Shell changed.
vbird1:x:1003:1004:VBird Tsai test,DIC in KSU,06-2727175#356,06-1234567:/home/vbird1:/bin/csh
[vbird1@study ~]$ chsh -s /bin/bash
# 测试完毕后,立刻改回来!
[vbird1@study ~]$ ll $(which chsh)
-rws--x--x. 1 root root 23856 Mar 6 13:59 /bin/chsh
```
不论是 chfn 与 chsh ,都是能够让一般使用者修改 /etc/passwd 这个系统文件的!所以你猜猜,这两个文件的权限是什么? 一定是 [SUID](../Text/index.html#suid) 的功能啦!看到这里,想到前面! 这就是 Linux 的学习方法~ ^_^
### 13.2.3 新增与移除群组
OK!了解了帐号的新增、删除、更动与查询后,再来我们可以聊一聊群组的相关内容了。 基本上,群组的内容都与这两个文件有关:/etc/group, /etc/gshadow。 群组的内容其实很简单,都是上面两个文件的新增、修改与移除而已, 不过,如果再加上有效群组的概念,那么 newgrp 与 gpasswd 则不可不知呢!
* groupadd
```
[root@study ~]# groupadd [-g gid] [-r] 群组名称
选项与参数:
-g :后面接某个特定的 GID ,用来直接给予某个 GID ~
-r :创建系统群组啦!与 /etc/login.defs 内的 GID_MIN 有关。
范例一:新建一个群组,名称为 group1
[root@study ~]# groupadd group1
[root@study ~]# grep group1 /etc/group /etc/gshadow
/etc/group:group1:x:1503:
/etc/gshadow:group1:!::
# 群组的 GID 也是会由 1000 以上最大 GID+1 来决定!
```
曾经有某些版本的教育训练手册谈到,为了让使用者的 UID/GID 成对,她们建议新建的与使用者私有群组无关的其他群组时,使用小于 1000 以下的 GID 为宜。 也就是说,如果要创建群组的话,最好能够使用“ groupadd -r 群组名”的方式来创建啦! 不过,这见仁见智啦!看你自己的抉择啰!
* groupmod
跟 [usermod](../Text/index.html#usermod) 类似的,这个指令仅是在进行 group 相关参数的修改而已。
```
[root@study ~]# groupmod [-g gid] [-n group_name] 群组名
选项与参数:
-g :修改既有的 GID 数字;
-n :修改既有的群组名称
范例一:将刚刚上个指令创建的 group1 名称改为 mygroup , GID 为 201
[root@study ~]# groupmod -g 201 -n mygroup group1
[root@study ~]# grep mygroup /etc/group /etc/gshadow
/etc/group:mygroup:x:201:
/etc/gshadow:mygroup:!::
```
不过,还是那句老话,不要随意的更动 GID ,容易造成系统资源的错乱喔!
* groupdel
呼呼! groupdel 自然就是在删除群组的啰~用法很简单:
```
[root@study ~]# groupdel [groupname]
范例一:将刚刚的 mygroup 删除!
[root@study ~]# groupdel mygroup
范例二:若要删除 vbird1 这个群组的话?
[root@study ~]# groupdel vbird1
groupdel: cannot remove the primary group of user 'vbird1'
```
为什么 mygroup 可以删除,但是 vbird1 就不能删除呢?原因很简单,“有某个帐号 (/etc/passwd) 的 initial group 使用该群组!” 如果查阅一下,你会发现在 /etc/passwd 内的 vbird1 第四栏的 GID 就是 /etc/group 内的 vbird1 那个群组的 GID ,所以啰,当然无法删除~否则 vbird1 这个使用者登陆系统后, 就会找不到 GID ,那可是会造成很大的困扰的!那么如果硬要删除 vbird1 这个群组呢? 你“必须要确认 /etc/passwd 内的帐号没有任何人使用该群组作为 initial group ”才行喔!所以,你可以:
* 修改 vbird1 的 GID ,或者是:
* 删除 vbird1 这个使用者。
* gpasswd:群组管理员功能
如果系统管理员太忙碌了,导致某些帐号想要加入某个专案时找不到人帮忙!这个时候可以创建“群组管理员”喔! 什么是群组管理员呢?就是让某个群组具有一个管理员,这个群组管理员可以管理哪些帐号可以加入/移出该群组! 那要如何“创建一个群组管理员”呢?就得要通过 gpasswd 啰!
```
# 关于系统管理员(root)做的动作:
[root@study ~]# gpasswd groupname
[root@study ~]# gpasswd [-A user1,...] [-M user3,...] groupname
[root@study ~]# gpasswd [-rR] groupname
选项与参数:
:若没有任何参数时,表示给予 groupname 一个密码(/etc/gshadow)
-A :将 groupname 的主控权交由后面的使用者管理(该群组的管理员)
-M :将某些帐号加入这个群组当中!
-r :将 groupname 的密码移除
-R :让 groupname 的密码栏失效
# 关于群组管理员(Group administrator)做的动作:
[someone@study ~]$ gpasswd [-ad] user groupname
选项与参数:
-a :将某位使用者加入到 groupname 这个群组当中!
-d :将某位使用者移除出 groupname 这个群组当中。
范例一:创建一个新群组,名称为 testgroup 且群组交由 vbird1 管理:
[root@study ~]# groupadd testgroup <==先创建群组
[root@study ~]# gpasswd testgroup <==给这个群组一个密码吧!
Changing the password for group testgroup
New Password:
Re-enter new password:
# 输入两次密码就对了!
[root@study ~]# gpasswd -A vbird1 testgroup <==加入群组管理员为 vbird1
[root@study ~]# grep testgroup /etc/group /etc/gshadow
/etc/group:testgroup:x:1503:
/etc/gshadow:testgroup:$6$MnmChP3D$mrUn.Vo.buDjObMm8F2emTkvGSeuWikhRzaKHxpJ...:vbird1:
# 很有趣吧!此时 vbird1 则拥有 testgroup 的主控权喔!身份有点像板主啦!
范例二:以 vbird1 登陆系统,并且让他加入 vbird1, vbird3 成为 testgroup 成员
[vbird1@study ~]$ id
uid=1003(vbird1) gid=1004(vbird1) groups=1004(vbird1) ...
# 看得出来,vbird1 尚未加入 testgroup 群组喔!
[vbird1@study ~]$ gpasswd -a vbird1 testgroup
[vbird1@study ~]$ gpasswd -a vbird3 testgroup
[vbird1@study ~]$ grep testgroup /etc/group
testgroup:x:1503:vbird1,vbird3
```
很有趣的一个小实验吧!我们可以让 testgroup 成为一个可以公开的群组,然后创建起群组管理员, 群组管理员可以有多个。在这个案例中,我将 vbird1 设置为 testgroup 的群组管理员,所以 vbird1 就可以自行增加群组成员啰~呼呼!然后,该群组成员就能够使用 [newgrp](../Text/index.html#newgrp) 啰~
### 13.2.4 帐号管理实例
帐号管理不是随意创建几个帐号就算了!有时候我们需要考虑到一部主机上面可能有多个帐号在协同工作! 举例来说,在大学任教时,我们学校的专题生是需要分组的,这些同一组的同学间必须要能够互相修改对方的数据文件, 但是同时这些同学又需要保留自己的私密数据,因此直接公开主文件夹是不适宜的。那该如何是好? 为此,我们下面提供几个例子来让大家思考看看啰:
任务一:单纯的完成上头交代的任务,假设我们需要的帐号数据如下,你该如何实作?
| 帐号名称 | 帐号全名 | 支持次要群组 | 是否可登陆主机 | 密码 |
| --- | --- |
| myuser1 | 1st user | mygroup1 | 可以 | password |
| myuser2 | 2nd user | mygroup1 | 可以 | password |
| myuser3 | 3rd user | 无额外支持 | 不可以 | password |
处理的方法如下所示:
```
# 先处理帐号相关属性的数据:
[root@study ~]# groupadd mygroup1
[root@study ~]# useradd -G mygroup1 -c "1st user" myuser1
[root@study ~]# useradd -G mygroup1 -c "2nd user" myuser2
[root@study ~]# useradd -c "3rd user" -s /sbin/nologin myuser3
# 再处理帐号的密码相关属性的数据:
[root@study ~]# echo "password" | passwd --stdin myuser1
[root@study ~]# echo "password" | passwd --stdin myuser2
[root@study ~]# echo "password" | passwd --stdin myuser3
```
要注意的地方主要有:myuser1 与 myuser2 都有支持次要群组,但该群组不见得会存在,因此需要先手动创建他! 然后 myuser3 是“不可登陆系统”的帐号,因此需要使用 /sbin/nologin 这个 shell 来给予,这样该帐号就无法登陆啰! 这样是否理解啊!接下来再来讨论比较难一些的环境!如果是专题环境该如何制作?
任务二:我的使用者 pro1, pro2, pro3 是同一个专案计划的开发人员,我想要让这三个用户在同一个目录下面工作, 但这三个用户还是拥有自己的主文件夹与基本的私有群组。假设我要让这个专案计划在 /srv/projecta 目录下开发, 可以如何进行?
```
# 1\. 假设这三个帐号都尚未创建,可先创建一个名为 projecta 的群组,
# 再让这三个用户加入其次要群组的支持即可:
[root@study ~]# groupadd projecta
[root@study ~]# useradd -G projecta -c "projecta user" pro1
[root@study ~]# useradd -G projecta -c "projecta user" pro2
[root@study ~]# useradd -G projecta -c "projecta user" pro3
[root@study ~]# echo "password" | passwd --stdin pro1
[root@study ~]# echo "password" | passwd --stdin pro2
[root@study ~]# echo "password" | passwd --stdin pro3
# 2\. 开始创建此专案的开发目录:
[root@study ~]# mkdir /srv/projecta
[root@study ~]# chgrp projecta /srv/projecta
[root@study ~]# chmod 2770 /srv/projecta
[root@study ~]# ll -d /srv/projecta
drwxrws---. 2 root projecta 6 Jul 20 23:32 /srv/projecta
```
由于此专案计划只能够给 pro1, pro2, pro3 三个人使用,所以 /srv/projecta 的权限设置一定要正确才行! 所以该目录群组一定是 projecta ,但是权限怎么会是 2770 呢还记得[第六章谈到的 SGID](../Text/index.html#sgid) 吧?为了让三个使用者能够互相修改对方的文件, 这个 SGID 是必须要存在的喔!如果连这里都能够理解,嘿嘿!您的帐号管理已经有一定程度的概念啰! ^_^
但接下来有个困扰的问题发生了!假如任务一的 myuser1 是 projecta 这个专案的助理,他需要这个专案的内容, 但是他“不可以修改”专案目录内的任何数据!那该如何是好?你或许可以这样做:
* 将 myuser1 加入 projecta 这个群组的支持,但是这样会让 myuser1 具有完整的 /srv/projecta 的使用权限, myuser1 是可以删除该目录下的任何数据的!这样是有问题的;
* 将 /srv/projecta 的权限改为 2775 ,让 myuser1 可以进入查阅数据。但此时会发生所有其他人均可进入该目录查阅的困扰! 这也不是我们要的环境。
真要命!传统的 Linux 权限无法针对某个个人设置专属的权限吗?其实是可以啦!接下来我们就来谈谈这个功能吧!
### 13.2.5 使用外部身份认证系统
在谈 ACL 之前,我们再来谈一个概念性的操作~因为我们目前没有服务器可供练习....
有时候,除了本机的帐号之外,我们可能还会使用到其他外部的身份验证服务器所提供的验证身份的功能!举例来说, windows 下面有个很有名的身份验证系统,称为 Active Directory (AD)的东西,还有 Linux 为了提供不同主机使用同一组帐号密码, 也会使用到 LDAP, NIS 等服务器提供的身份验证等等!
如果你的 Linux 主机要使用到上面提到的这些外部身份验证系统时,可能就得要额外的设置一些数据了! 为了简化使用者的操作流程,所以 CentOS 提供一只名为 authconfig-tui 的指令给我们参考,这个指令的执行结果如下:
![使用外部身份验证服务器的方式](img/authconfig-tui.jpg)图13.2.1、使用外部身份验证服务器的方式
你可以在该画面中使用 [tab] 按钮在各个项目中间切换,不过,因为我们没有适用的服务器可以测试,因此这里仅是提供一个参考的依据, 未来如果谈到服务器章节时,你要如果谈到服务器章节时,服器有印象,处理外部身份验证的方式可以通过 authconfig-tui 就好了! 上图中最多可供操作的,大概仅有支持 MD5 这个早期的密码格式就是了!此外,不要随便将已经启用的项目 (上头有星号 * 的项目) 取消喔! 可能某些帐号会失效...
- 鸟哥的Linux私房菜:基础学习篇 第四版
- 目录及概述
- 第零章、计算机概论
- 0.1 电脑:辅助人脑的好工具
- 0.2 个人电脑架构与相关设备元件
- 0.3 数据表示方式
- 0.4 软件程序运行
- 0.5 重点回顾
- 0.6 本章习题
- 0.7 参考资料与延伸阅读
- 第一章、Linux是什么与如何学习
- 1.1 Linux是什么
- 1.2 Torvalds的Linux发展
- 1.3 Linux当前应用的角色
- 1.4 Linux 该如何学习
- 1.5 重点回顾
- 1.6 本章习题
- 1.7 参考资料与延伸阅读
- 第二章、主机规划与磁盘分区
- 2.1 Linux与硬件的搭配
- 2.2 磁盘分区
- 2.3 安装Linux前的规划
- 2.4 重点回顾
- 2.5 本章习题
- 2.6 参考资料与延伸阅读
- 第三章、安装 CentOS7.x
- 3.1 本练习机的规划--尤其是分区参数
- 3.2 开始安装CentOS 7
- 3.3 多重开机安装流程与管理(Option)
- 3.4 重点回顾
- 3.5 本章习题
- 3.6 参考资料与延伸阅读
- 第四章、首次登陆与线上求助
- 4.1 首次登陆系统
- 4.2 文字模式下指令的下达
- 4.3 Linux系统的线上求助man page与info page
- 4.4 超简单文书编辑器: nano
- 4.5 正确的关机方法
- 4.6 重点回顾
- 4.7 本章习题
- 4.8 参考资料与延伸阅读
- 第五章、Linux 的文件权限与目录配置
- 5.1 使用者与群组
- 5.2 Linux 文件权限概念
- 5.3 Linux目录配置
- 5.4 重点回顾
- 5.5 本章练习
- 5.6 参考资料与延伸阅读
- 第六章、Linux 文件与目录管理
- 6.1 目录与路径
- 6.2 文件与目录管理
- 6.3 文件内容查阅
- 6.4 文件与目录的默认权限与隐藏权限
- 6.5 指令与文件的搜寻
- 6.6 极重要的复习!权限与指令间的关系
- 6.7 重点回顾
- 6.8 本章习题:
- 6.9 参考资料与延伸阅读
- 第七章、Linux 磁盘与文件系统管理
- 7.1 认识 Linux 文件系统
- 7.2 文件系统的简单操作
- 7.3 磁盘的分区、格式化、检验与挂载
- 7.4 设置开机挂载
- 7.5 内存交换空间(swap)之创建
- 7.6 文件系统的特殊观察与操作
- 7.7 重点回顾
- 7.8 本章习题 - 第一题一定要做
- 7.9 参考资料与延伸阅读
- 第八章、文件与文件系统的压缩,打包与备份
- 8.1 压缩文件的用途与技术
- 8.2 Linux 系统常见的压缩指令
- 8.3 打包指令: tar
- 8.4 XFS 文件系统的备份与还原
- 8.5 光盘写入工具
- 8.6 其他常见的压缩与备份工具
- 8.7 重点回顾
- 8.8 本章习题
- 8.9 参考资料与延伸阅读
- 第九章、vim 程序编辑器
- 9.1 vi 与 vim
- 9.2 vi 的使用
- 9.3 vim 的额外功能
- 9.4 其他 vim 使用注意事项
- 9.5 重点回顾
- 9.6 本章练习
- 9.7 参考资料与延伸阅读
- 第十章、认识与学习BASH
- 10.1 认识 BASH 这个 Shell
- 10.2 Shell 的变量功能
- 10.3 命令别名与历史命令
- 10.4 Bash Shell 的操作环境:
- 10.5 数据流重导向
- 10.6 管线命令 (pipe)
- 10.7 重点回顾
- 10.8 本章习题
- 10.9 参考资料与延伸阅读
- 第十一章、正则表达式与文件格式化处理
- 11.1 开始之前:什么是正则表达式
- 11.2 基础正则表达式
- 11.3 延伸正则表达式
- 11.4 文件的格式化与相关处理
- 11.5 重点回顾
- 11.6 本章习题
- 11.7 参考资料与延伸阅读
- 第十二章、学习 Shell Scripts
- 12.1 什么是 Shell scripts
- 12.2 简单的 shell script 练习
- 12.3 善用判断式
- 12.4 条件判断式
- 12.5 循环 (loop)
- 12.6 shell script 的追踪与 debug
- 12.7 重点回顾
- 12.8 本章习题
- 第十三章、Linux 帐号管理与 ACL 权限设置
- 13.1 Linux 的帐号与群组
- 13.2 帐号管理
- 13.3 主机的细部权限规划:ACL 的使用
- 13.4 使用者身份切换
- 13.5 使用者的特殊 shell 与 PAM 模块
- 13.6 Linux 主机上的使用者讯息传递
- 13.7 CentOS 7 环境下大量创建帐号的方法
- 13.8 重点回顾
- 13.9 本章习题
- 13.10 参考资料与延伸阅读
- 第十四章、磁盘配额(Quota)与进阶文件系统管理
- 14.1 磁盘配额 (Quota) 的应用与实作
- 14.2 软件磁盘阵列 (Software RAID)
- 14.3 逻辑卷轴管理员 (Logical Volume Manager)
- 14.4 重点回顾
- 14.5 本章习题
- 14.6 参考资料与延伸阅读
- 第十五章、例行性工作调度(crontab)
- 15.1 什么是例行性工作调度
- 15.2 仅执行一次的工作调度
- 15.3 循环执行的例行性工作调度
- 15.4 可唤醒停机期间的工作任务
- 15.5 重点回顾
- 15.6 本章习题
- 第十六章、程序管理与 SELinux 初探
- 16.1 什么是程序 (process)
- 16.2 工作管理 (job control)
- 16.3 程序管理
- 16.4 特殊文件与程序
- 16.5 SELinux 初探
- 16.6 重点回顾
- 16.7 本章习题
- 16.8 参考资料与延伸阅读
- 第十七章、认识系统服务 (daemons)
- 17.1 什么是 daemon 与服务 (service)
- 17.2 通过 systemctl 管理服务
- 17.3 systemctl 针对 service 类型的配置文件
- 17.4 systemctl 针对 timer 的配置文件
- 17.5 CentOS 7.x 默认启动的服务简易说明
- 17.6 重点回顾
- 17.7 本章习题
- 17.8 参考资料与延伸阅读
- 第十八章、认识与分析登录文件
- 18.1 什么是登录文件
- 18.2 rsyslog.service :记录登录文件的服务
- 18.3 登录文件的轮替(logrotate)
- 18.4 systemd-journald.service 简介
- 18.5 分析登录文件
- 18.6 重点回顾
- 18.7 本章习题
- 18.8 参考资料与延伸阅读
- 第十九章、开机流程、模块管理与 Loader
- 19.1 Linux 的开机流程分析
- 19.2 核心与核心模块
- 19.3 Boot Loader: Grub2
- 19.4 开机过程的问题解决
- 19.5 重点回顾
- 19.6 本章习题
- 19.7 参考资料与延伸阅读
- 第二十章、基础系统设置与备份策略
- 20.1 系统基本设置
- 20.2 服务器硬件数据的收集
- 20.3 备份要点
- 20.4 备份的种类、频率与工具的选择
- 20.5 鸟哥的备份策略
- 20.6 灾难复原的考虑
- 20.7 重点回顾
- 20.8 本章习题
- 20.9 参考资料与延伸阅读
- 第二十一章、软件安装:源代码与 Tarball
- 20.1 开放源码的软件安装与升级简介
- 21.2 使用传统程序语言进行编译的简单范例
- 21.3 用 make 进行宏编译
- 21.4 Tarball 的管理与建议
- 21.5 函数库管理
- 21.6 检验软件正确性
- 21.7 重点回顾
- 21.8 本章习题
- 21.9 参考资料与延伸阅读
- 第二十二章、软件安装 RPM, SRPM 与 YUM
- 22.1 软件管理员简介
- 22.2 RPM 软件管理程序: rpm
- 22.3 YUM 线上升级机制
- 22.4 SRPM 的使用 : rpmbuild (Optional)
- 22.5 重点回顾
- 22.6 本章习题
- 22.7 参考资料与延伸阅读
- 第二十三章、X Window 设置介绍
- 23.1 什么是 X Window System
- 23.2 X Server 配置文件解析与设置
- 23.3 显卡驱动程序安装范例
- 23.4 重点回顾
- 23.5 本章习题
- 23.6 参考资料与延伸阅读
- 第二十四章、Linux 核心编译与管理
- 24.1 编译前的任务:认识核心与取得核心源代码
- 24.2 核心编译的前处理与核心功能选择
- 24.3 核心的编译与安装
- 24.4 额外(单一)核心模块编译
- 24.5 以最新核心版本编译 CentOS 7.x 的核心
- 24.6 重点回顾
- 24.7 本章习题
- 24.8 参考资料与延伸阅读