/etc/passwd    用户名:用户密码:UID:GID:说明:家目录:使用的shell

1. 账号名称:

就是账号啦!用来对应 UID 的。例如 root 的 UID 对应就是 0 (第三字段);

2. 密码:

早期 Unix 系统的密码就是放在这字段上!但是因为这个文件的特性是所有的程序都能够读取,

这样一来很容易造成密码数据被窃取, 后来就将这个字段的密码数据改放到/etc/shadow中。

所以这里你会看到一个『 x 』

3.UID

id 范围     该 ID 使用者特性

0           当 UID 是 0 时,代表这个账号是『系统管理员』! 所以当你要让其他的账号

名称也具有 root 的权限时,将该账号的 UID 改为 0 即可。 这也就是说,一

(系统管理员) 部系统上面的系统管理员不见得只有 root , 不过不建议有多

个账号的UID 是 0 啦~

1~499       保留给系统使用的 ID,其实除了 0 之外,其他的 UID 权限与特性并没有不一

样。默认500 以下的数字让给系统作为保留账号只是一个习惯。由于系统上面

的服务希望使用较小的权限去运作,因此不希望使用 root的身份去执行这些

服务, 所以我们就得要提供这些运作中程序的拥有者账号才行。这些系统账号

通常是不可登入的, 所以才会有/sbin/nologin 这个特殊的 shell 存在。根据

系统账号的由来,通常系统账号又约略被区分为两种:

1~99:由 distributions 自行建立的系统账号;

100~499:若用户有系统账号需求时,可以使用的账号 UID。

500~65535    给一般使用者用的。事实上,目前的 linux 核心 (2.6.x 版)已经可以支持到

(可登入账号) 4294967295 (2^32-1) 这么大的 UID 号码

4.GID:

这个与/etc/group 有关,其实 /etc/group 的观念与/etc/passwd 差不多,只是他是用来规范

组名与 GID 的对应而已!

5. 用户信息说明栏:

这个字段基本上并没有什么重要用途,只是用来解释这个账号的意义,不过,如果您提供使用 finger

的功能时, 这个字段可以提供很多的讯息,后面的 chfn 指令会来解释这里的说明。

6. 家目录:

这是用户的家目录,以上面为例, root 的家目录在 /root ,所以当 root 登入之后,就会立刻跑

到 /root 目录里头,如果你有个账号的使用空间特别的大,你想要将该账号的家目录移动到其他

的硬盘去可以在这个字段进行修改,默认的用户家目录在/home/yourIDname

7. Shell:

我们在第十一章 BASH 提到很多次,当用户登入系统后就会取得一个 Shell 来与系统的核心沟通

以进行用户的操作任务,预设 shell 就是在这个字段指定的,这里比较需要注意的是,有一个

shell 可以用来替代成让账号无法取得 shell 环境的登入动作,那就是/sbin/nologin。

/etc/shadow 文件结构

shadow 同样以『:』作为分隔符,如果数一数,会发现共有九个字段啊,这九个字段的用途是这样的:

1. 账号名称:

由于密码也需要与账号对应因此,这个文件的第一栏就是账号,必须要与 /etc/passwd 相同

2. 密码:

这个字段内的数据才是真正的密码,而且是经过编码的密码 (加密), 你只会看到有一些特殊

符号的字母就是了!需要特别留意的是,虽然这些加密过的密码很难被解出来, 但是『很难』不

等于『不会』,所以,这个文件的预设权限是『-rw-------』或者是『-r--------』,亦即只有

root 才可以读写,你得随时注意,不要不小心更动了这个文件的权限。

另外,由于各种密码编码的技术不一样,因此不同的编码系统会造成这个字段的长度不相同。 举

例来说,旧式的 DES 编码系统产生的密码长度就与目前惯用的 MD5 不同,MD5 的密码

长度明显的比较长些。由于固定的编码系统产生的密码长度必须一致,因此『当你让这个字段的

长度改变后,该密码就会失效(算不出来)』。 很多软件透过这个功能,在此字段前加上 ! 或 * 改

变密码字段长度,就会让密码『暂时失效』了。

3. 最近更动密码的日期:

这个字段记录了『更动密码那一天』的日期,不过,很奇怪呀!在我的例子中怎么会是 14126这个

是因为计算 Linux 日期的时间是以 1970 年 1 月 1 日作为 1 而累加的日期,1971 年 1 月1日

则为 366。 得注意一下这个资料呦!上述的 14126 指的就是 2008-09-04那一天,而想要了解该

日期可以使用本章后面 chage 指令,至于想要知道某个日期的累积日数, 可使用如下的程序计算

(%号和s之间没有空格):

#echo $(($(date --date="2008/09/04" +%s)/86400+1))

上述指令中,2008/09/04 为你想要计算的日期,86400 为每一天的秒数, %s 为 1970/01/01

以来的累积总秒数。 由于 bash 仅支持整数,因此最终需要加上 1 补齐 1970/01/01 当天

4. 密码不可被更动的天数:(与第 3 字段相比)

第四个字段记录了:这个账号的密码在最近一次被更改后需要经过几天才可以再被变更,如果是

0 的话, 表示密码随时可以更动的意思。这的限制是为了怕密码被某些人一改再改而设计的,如

果设定为 20 天的话,那么当你设定了密码之后, 20 天之内都无法改变这个密码。

5. 密码需要重新变更的天数:(与第 3 字段相比)

经常变更密码是个好习惯,为了强制要求用户变更密码,这个字段可以指定在最近一次更改密码

后, 在多少天数内需要再次的变更密码才行。你必须要在这个天数内重新设定你的密码,否则这

个账号的密码将会『变为过期特性』。 而如果像上面的 99999 (计算为 273 年) 的话,那就表

示,密码的变更没有强制性之意。

6. 密码需要变更期限前的警告天数:(与第 5 字段相比)

当账号的密码有效期限快要到的时候 (第 5 字段),系统会依据这个字段的设定,发出『警告』言

论给这个账号,提醒他『再过 n 天你的密码就要过期了,请尽快重新设定你的密码呦!』,如上

面的例子,则是密码到期之前的 7 天之内,系统会警告该用户。

7. 密码过期后的账号宽限时间(密码失效日):(与第 5 字段相比)

密码有效日期为『更新日期(第 3 字段)』+『重新变更日期(第 5 字段)』,过了该期限后用户依旧

没有更新密码,那该密码就算过期了。 虽然密码过期但是该账号还是可以用来进行其他工作的,

包括登入系统取得 bash 。不过如果密码过期了, 那当你登入系统时,系统会强制要求你必须要

重新设定密码才能登入继续使用喔,这就是密码过期特性。

这个字段的功能是在密码过期几天后,如果使用者还是没有登入更改密码,那么这个账号的密码

将会『失效』, 亦即该账号再也无法使用该密码登入了。要注意密码过期与密码失效并不相同。

8. 账号失效日期:

这个日期跟第三个字段一样,都是使用 1970 年以来的总日数设定。这个字段表示: 这个账号在

此字段规定的日期之后,将无法再使用。 就是所谓的『账号失效』,此时不论你的密码是否有过

期,这个『账号』都不能再被使用, 这个字段会被使用通常应该是在『收费服务』的系统中,你

可以规定一个日期让该账号不能再使用。

9. 保留:

最后一个字段是保留的,看以后有没有新功能加入。

/etc/group 文件结构

这个文件就是在记录 GID 与组名的对应了

这个文件每一行代表一个群组,也是以冒号『:』作为字段的分隔符,共分为四栏,每一字段的意义是:

1. 组名:

2. 群组密码:

通常不需要设定,这个设定通常是给『群组管理员』使用的,目前很少有这个机会设定群组管理

员,同样的,密码已经移动到 /etc/gshadow 去,因此这个字段只会存在一个『x』而已;

3. GID:

就是群组的 ID,/etc/passwd 第四个字段使用的 GID 对应的群组名,就是由这里对应出来

4. 此群组支持的账号名称:

我们知道一个账号可以加入多个群组,那某个账号想要加入此群组时,将该账号填入这个字段即可。

举例来说,如果我想要让 dmtsai 也加入 root 这个群组,那举在第一行的最后面加上

『,dmtsai』,注意不要有空格, 使成为『 root:x:0:root,dmtsai 』就可以啰~

有效群组(effective group)与初始群组(initial group)

#usermod -G groupname username <==将username用户加入群组groupname,groupname为其附加组

groups: 有效于支持群组的观察

#groups

输出用户支持的所有群组,且第一个是用户有效群组,通常有效群组的作用是在新建文件,新建文件的属组为用户的有效群组

newgrp: 有效群组的切换

不过使用 newgrp 是有限制的,那就是你想要切换的群组必须是你已经有支持的群组。

#newgrp groupname <==用户切换有效群组为groupname

newgrp 这个指令,这个指令可以变更目前用户的有效群组, 而且是另外以一个 shell来提供这个功能的,因此如果你想要回到原本的环境中,请输入 exit 回到原本的 shell。

/etc/gshadow

这个文件内同样还是使用冒号『:』来作为字段的分隔字符,而且你会发现,这个文件几乎与

/etc/group 一模一样,是这样没错~不过,要注意的大概就是第二个字段~第二个字段是密码

栏, 如果密码栏上面是『!』时,表示该群组不具有群组管理员,至于第四个字段也就是支持

的账号名称,这四个字段的意义为:

1. 组名

2. 密码栏,同样的,开头为 ! 表示无合法密码,所以无群组管理员

3. 群组管理员的账号

4. 该群组的所属账号 (与/etc/group 内容相同)

账号管理

新增与移除使用者: useradd, 相关配置文件, passwd, usermod, userdel

#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 为永久不失效(密码只会过期而强制于登入时重新设定而已)

CentOS 这些默认值主要会帮我们处理几个项目:

在 /etc/passwd 里面建立一行与账号相关的数据,包括建立 UID/GID/家目录等;

在 /etc/shadow 里面将此账号的密码相关参数填入,但是尚未有密码;

在 /etc/group 里面加入一个与账号名称一模一样的组名;

在 /home 底下建立一个与账号同名的目录作为用户家目录,且权限为 700

一般账号应该是 UID 500 号以后,那用户自己建立的系统账号则一般是由100 号以后起算的。

所以在这里我们加上 -r 这个选项以后,系统就会主动将账号与账号同名群组的UID/GID 都指定

小于 500 以下, 在本案例中则是使用 100(UID) 与 103(GID) 啰!此外,由于系统账号主要是用来

进行运作系统所需服务的权限设定, 所以系统账号默认都不会主动建立家目录的!

useradd建立普通用户是的参考档 /etc/default/useradd,可以是使用

#useradd -D <==查看默认的值

/etc/default/useradd内容解析:

ROUP=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 文件结构当中谈过,第七个字段的设定值将会影响到密码过期后, 在多久时间

内还可使用旧密码登入。这个项目就是在指定该日数啦!如果是 0 代表密码过期立刻失效, 如果

是 -1 则是代表密码永进不会失效,如果是数字,如 30 ,则代表过期 30 天后才失效。

EXPIRE=:账号失效的日期

就是 shadow 内的第八字段,你可以直接设定账号在哪个日期后就直接失效,而不理会密码的问

题。通常不会设定此项目,但如果是付费的会员制系统,或许这个字段可以设定

SHELL=/bin/bash:默认使用的 shell 程序文件名

系统默认的 shell 就写在这里。假如你的系统为 mail server ,你希望每个账号都只能使用 email

的收发信件功能, 而不许用户登入系统取得 shell ,那么可以将这里设定为 /sbin/nologin ,如

此一来,新建的使用者预设就无法登入

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 500                <==使用者最小的 UID,意即小于 500 的 UID 为系统保留

UID_MAX 60000              <==使用者能够用的最大 UID

GID_MIN 500                <==使用者自定义组的最小 GID,小于 500 为系统保留

GID_MAX     60000          <==使用者自定义组的最大 GID

CREATE_HOME    yes         <==在不加 -M 及 -m 时,是否主动建立用户家目录?

UMASK    077               <==用户家目录建立的 umask ,因此权限会是 700

USERGROUPS_ENAB yes        <==使用 userdel 删除时,是否会初除初始群组

MD5_CRYPT_ENAB yes         <==密码是否经过 MD5 的加密机制处理

这个文件规范的数据则是如下所示:

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 核心支持的账号可高达 2^32 这么多个,不过一部主机要作出这么多账号在管理上也是

很麻烦的, 所以在这里就针对 UID/GID 的范围进行规范就是了。上表中的 UID_MIN 指的就是

可登入系统的一般账号的最小 UID ,至于 UID_MAX 则是最大 UID 之意。

要注意的是,系统给予一个账号 UID 时,他是 (1)先参考 UID_MIN 设定值取得最小数值; (2)由

/etc/passwd 搜寻最大的 UID 数值, 将 (1) 与 (2) 相比,找出最大的那个再加一就是新账号的

UID 了。我们上面已经作出 UID 为 700 的 vbird2 , 如果再使用『 useradd vbird4 』时,你

猜 vbird4 的 UID 会是多少?答案是: 701 。 所以中间的 505~699 的号码就空下来啦!

而如果我是想要建立系统用的账号,所以使用 useradd -r sysaccount 这个 -r 的选项时,就会

找『比 500 小的最大的那个 UID + 1 』就是了。

用户家目录设定值:

系统默认会帮用户建立家目录就是因为这个『CREATE_HOME = yes』的设定值,这个

设定值会让你在使用 useradd 时, 主动加入『 -m 』这个产生家目录的选项,如果不想要建

立用户家目录,就只能强制加上『 -M 』的选项在 useradd 指令执行时。至于建立家目录的权

限设定就透过 umask 这个设定值,因为是 0700 的预设设定,因此用户家目录默认权限才

会是『 drwx------ 』哩!

用户删除与密码设定值:

使用『USERGROUPS_ENAB yes』这个设定值的功能是: 如果使用 userdel 去初除一个账号

时,且该账号所属的初始群组已经没有人隶属于该群组了, 那么就删除掉该群组,举例来说,我

们刚刚有建立 vbird4 这个账号,他会主动建立 vbird4 这个群组。 若 vbird4 这个群组并没有其

他账号将他加入支持的情况下,若使用 userdel vbird4 时,该群组也会被删除的意思。 至于

『MD5_CRYPT_ENAB yes』则表示使用 MD5 来加密密码明文,而不使用旧式的 DES

现在你知道啦,使用 useradd 这支程序在建立 Linux 上的账号时,至少会参考:

/etc/default/useradd

/etc/login.defs

/etc/skel/*

这些文件,不过,最重要的其实是建立 /etc/passwd, /etc/shadow, /etc/group, /etc/gshadow 还有

用户家目录,所以,如果你了解整个系统运作的状态,也是可以手动直接修改这几个文件就是了。

O账号建立了,接下来处理一下用户的密码

passwd

使用 useradd 建立了账号之后,在预设的情况下,该账号是暂时被封锁的, 也就是说,该账号是无法登入的。

#passwd     [--sdtin]    <==所有人都可以使用来修改自己的密码

# passwd [-l] [-u] [--sdtin] [-S] [-n 日数] [-x 日数] [-w 日数] [-i 日期] 账号 <==root 功能

选项与参数:

--stdin :可以透过来自前一个管线的数据,作为密码输入,对 shell script 有用

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

-l :是 Lock 的意思,会将 /etc/shadow 第二栏最前面加上 ! 使密码失效;

-u :与 -l 相对,是 Unlock 的意思!

-S :列出密码相关参数,亦即 shadow 文件内的大部分信息。

-n :后面接天数,shadow 的第 4 字段,多久不可修改密码天数

-x :后面接天数,shadow 的第 5 字段,多久内必须要更动密码

-w :后面接天数,shadow 的第 6 字段,密码过期前的警告天数

-i :后面接『日期』,shadow 的第 7 字段,密码失效日期

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

chage

更详细的密码参数显示功能

#chage [-ldEImMW] 账号名

选项与参数:

-l :列出该账号的详细密码参数;

-d :后面接日期,修改 shadow 第三字段(最近一次更改密码的日期),格式YYYY-MM-DD

-E :后面接日期,修改 shadow 第八字段(账号失效日),格式 YYYY-MM-DD

-I :后面接天数,修改 shadow 第七字段(密码失效日期)

-m :后面接天数,修改 shadow 第四字段(密码最短保留天数)

-M :后面接天数,修改 shadow 第五字段(密码多久需要进行变更)

-W :后面接天数,修改 shadow 第六字段(密码过期前警告日期)

chage 有一个功能很不错,如果你想要让『使用者在第一次登入时, 强制他们一定要更改密码后才能

够使用系统资源』,可以利用如下的方法来处理

范例二:建立一个名为 agetest 的账号,该账号第一次登入后使用默认密码,但必须要更改过密码后,使用新密码才能够登入系统使用 bash 环境

#useradd agetest

#echo "agetest" | passwd --stdin agetest

#chage -d 0 agetest

此时此账号的密码建立时间会被改为 1970/1/1 ,所以会有问题

你会发现 agetest 这个账号在第一次登入时可以使用与账号同名的密码登入, 但登入时就

会被要求立刻更改密码,更改密码完成后就会被踢出系统。再次登入时就能够使用新密码登入了

usermod

所谓这『人有失手,马有乱蹄』,所以,当然有的时候会『不小心』在 useradd 的时候加入了错误的设定数据。或者是,在使用 useradd 后,发现某些地方还可以进行细部修改。 此时,当然我们可以直接到 /etc/passwd 或 /etc/shadow 去修改相对应字段的数据, 不过,Linux 也有提供相关

的指令让大家来进行账号相关数据的微调,那就是 usermod

# 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 密码栏的 ! 拿掉,解冻啦

userdel

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

用户账号/密码相关参数:/etc/passwd, /etc/shadow

使用者群组相关参数:/etc/group, /etc/gshadow

用户个人文件数据: /home/username, /var/spool/mail/username..

整个指令的语法非常简单:

#userdel [-r] username

选项与参数:

-r :连同用户的家目录也一起删除

其实用户如果在系统上面操作过一阵子了,那么该用户其实在系统内可能会含有其他文件的。举例来说,

他的邮件信箱 (mailbox) 或者是例行性工作排程 (crontab, 十六章) 之类的文件。 所以,如果想要

完整的将某个账号完整的移除,最好可以在下达 userdel -r username 之前, 先以『 find / -user

username 』查出整个系统内属于 username 的文件,然后再加以删除吧!

用户功能

不论是 useradd/usermod/userdel ,那都是系统管理员所能够使用的指令, 如果我是一般身份使用

者,那举我是否除了密码之外,就无法更改其他的数据呢? 当然不是啦!这里我们介绍几个一般身份用

户常用的账号数据变更与查询指令啰!

finger

finger 的中文字面意义是:『手指』或者是『指纹』的意思。这个 finger 可以查阅很多用户相关的信

息喔! 大部分都是在 /etc/passwd 这个文件里面的信息啦!我们就先来检查检查用户信息吧!

# finger [-s] username

选项与参数:

-s :仅列出用户的账号、全名、终端机代号与登入时间等等;

-m :列出与后面接的账号相同者,而不是利用部分比对 (包括全名部分)

由于 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 当然就无法查阅的到!

chfn

chfn 修改用户的 finger 数据,有点像是: change finger 的意思!这玩意的使用方法如下:

# chfn [-foph] [账号名]

选项与参数:

-f :后面接完整的大名;

-o :您办公室的房间号码;

-p :办公室的电话号码;

-h :家里的电话号码!

chsh

这就是 change shell 的简写!使用方法就更简单了!

$ chsh [-ls]

选项与参数:

-l :列出目前系统上面可用的 shell ,其实就是 /etc/shells 的内容!

-s :设定修改自己的 Shell 啰

id

id 这个指令则可以查询某人或自己的相关 UID/GID 等等的信息,他的参数也不少,不过, 都不需要

让~反正使用 id 就全部都列出啰~ ^_^

#id [username]

新增与移除群组

基本上,群组的内容都与这两个文件有关:/etc/group,/etc/gshadow。群组的内容其实很简单,都是上面两个

文件的新增、修改与移除而已, 不过,如果再加上有效群组的概念,那么 newgrp与gpasswd 则不可不知呢!

# groupadd [-g gid] [-r] 组名

选项与参数:

-g :后面接某个特定的 GID ,用来直接给予某个 GID

-r :建立系统群组啦!与 /etc/login.defs 内的 GID_MIN 有关

groupmod

跟 usermod 类似的,这个指令仅是在进行 group 相关参数的修改而已。

#groupmod [-g gid] [-n group_name] 群组名

选项与参数:

-g :修改既有的 GID 数字;

-n :修改既有的组名

groupdel

呼呼! groupdel 自然就是在删除群组的啰~用法很简单:

#groupdel [groupname]

若要删除 vbird1 这个群组的话?

#groupdel vbird1

groupdel: cannot remove user's primary group.

为什么 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)做的动作:

#gpasswd groupname

#gpasswd [-A user1,...] [-M user3,...] groupname

#gpasswd [-rR] groupname

选项与参数:

:若没有任何参数时,表示给予 groupname 一个密码(/etc/gshadow)

-A :将 groupname 的主控权交由后面的使用者管理(该群组的管理员)

-M :将某些账号加入这个群组当中!

-r :将 groupname 的密码移除

-R :让 groupname 的密码栏失效

关于群组管理员(Group administrator)做的动作:

[someone@www ~]$ gpasswd [-ad] user groupname

选项与参数:

-a :将某位使用者加入到 groupname 这个群组当中!

-d :将某位使用者移除出 groupname 这个群组当中。

账号管理实例

账号管理不是随意建置几个账号就算了!有时候我们需要考虑到一部主机上面可能有多个账号在协同工

作! 举例来说,在大学任教时,我们学校的专题生是需要分组的,这些同一组的同学间必须要能够互相

修改对方的数据文件, 但是同时这些同学又需要保留自己的私密数据,因此直接公开家目录是不适宜

的。那该如何是好? 为此,我们底下提供几个例子来让大家思考看看啰:

任务一:单纯的完成上头交代的任务,假设我们需要的账号数据如下,你该如何实作?

账号名称    账号全名        支援次要群组    是否可登入主机    密码

myuser1 1st user     mygroup1         可以         password

myuser2 2nd user     mygroup1         可以         password

myuser3 3rd user     无额外支持         不可以         password

处理的方法如下所示:

# groupadd mygroup1

# useradd -G mygroup1 -c "1st user" myuser1

# useradd -G mygroup1 -c "2nd user" myuser2

# useradd -c "3rd user" -s /sbin/nologin myuser3

# echo "password" | passwd --stdin myuser1

# echo "password" | passwd --stdin myuser2

# echo "password" | passwd --stdin myuser3

要注意的地方主要有:myuser1 与 myuser2 都有支援次要群组,但该群组不见得会存在,因此需要先

手动建立他! 然后 myuser3 是『不可登入系统』的账号,因此需要使用 /sbin/nologin 这个 shell来

给予,这样该账号就无法登入啰! 这样是否理解啊!接下来再来认论比较难一些的环境!如果是专题环

境该如何制作?

任务二:我的使用者 pro1, pro2, pro3 是同一个项目计划的开发人员,我想要让这三个用户在同一个目

录底下工作, 但这三个用户还是拥有自己的家目录与基本的私有群组。假设我要让这个项目计划在

/srv/projecta 目录下开发, 可以如何进行?

1. 假设这三个账号都尚未建立,可先建立一个名为 projecta 的群组,

再让这三个用户加入其次要群组的支持即可:

#groupadd projecta

# useradd -G projecta -c "projecta user" pro1

# useradd -G projecta -c "projecta user" pro2

# useradd -G projecta -c "projecta user" pro3

# echo "password" | passwd --stdin pro1

# echo "password" | passwd --stdin pro2

# echo "password" | passwd --stdin pro3

2. 开始建立此项目的开发目录:

# mkdir /srv/projecta

# chgrp projecta /srv/projecta

# chmod 2770 /srv/projecta

# ll -d /srv/projecta

drwxrws--- 2 root projecta 4096 Feb 27 11:29 /srv/projecta

由于此项目计划只能够给 pro1, pro2, pro3 三个人使用,所以 /srv/projecta 的权限设定一定要正确才行, 所以该目录群组一定是 projecta ,但是权限怎么会是 2770 呢还记得第七章谈到的 SGID 吧?为

了让三个使用者能够互相修改对方的文件, 这个 SGID 是必须要存在的喔!如果连这里都能够理解,您的账号管理已经有一定程度的概念。但接下来有个困扰的问题发生了!假如任务一的 myuser1 是 projecta 这个项目的助理,他需要这个项目的内容, 但是他『不可以修改』项目目录内的任何数据!那该如何是好?你或许可以这样做:

将 myuser1 加入 projecta 这个群组的支持,但是这样会让 myuser1 具有完整的 /srv/projecta

的权限, myuser1 是可以删除该目录下的任何数据的!这样是有问题的;

将 /srv/projecta 的权限改为 2775 ,让 myuser1 可以进入查阅数据。但此时会发生所有其他人

均可进入该目录查阅的困扰! 这也不是我们要的环境,传统的 Linux 权限无法针对某个个人设定专

属的权限吗?其实是可以的,那就是ACL

linux 用户加入次要群组,linux学习笔记之 帐号和群组管理相关推荐

  1. 【Linux】Linux用户、用户组、文件权限学习笔记

    原文地址:http://www.sourcejoy.com/other_dev_tech/linux-user-and-file-manage.html 作者:HaiHai 发布时间:August 1 ...

  2. 鸟哥linux群,【鸟哥的linux私房菜-学习笔记】linux的帐号与群组

    linux的帐号与群组 使用者标识符: UID 与 GID ID 与账号的对应就在 /etc/passwd 当中: 计算机只认得ID(即数字),并不能区别账号: 每个登陆的使用者至少都会取得两个 ID ...

  3. Linux 的帐号与群组:有效与初始群组、groups, newgrp

    关于群组: 有效与初始群组.groups, newgrp 认识了帐号相关的两个档案 /etc/passwd 与 /etc/shadow 之后,您或许还是会觉得奇怪, 那么群组的设定档在哪里?还有,在 ...

  4. MySQL学习笔记(1)——高可用组复制

    MySQL学习笔记(1)--高可用组复制 积土成山,风雨兴焉.积水成渊,蛟龙生焉. 一.概念 组复制(MySQL Group Replication,MGR)是MySQL官方在MySQL 5.7.17 ...

  5. kubernetes(K8S)学习笔记P6:K8s集群|java项目部署

    kubernetes(K8S)学习笔记P6:K8s集群|java项目部署 8.集群资源监控 8.1概述 8.2搭建集群监控平台系统 8.2.1部署prometheus 8.2.3部署Grafana 8 ...

  6. 指数高通滤波器代码_影像组学学习笔记1-2——高通滤波法及应用

    笔记1-1中,我和大家一起学习了一种基于空域变换的图像增强法,今天在1-2我将介绍一种基于频域滤波增强的方法--高通滤波法. 图像的频域滤波增强是利用图像变换方法将原来图像空间中的图像以某种形式转换到 ...

  7. Redis运维和开发学习笔记(3)redis搭建集群

    Redis运维和开发学习笔记(3)redis搭建集群 文章目录 Redis运维和开发学习笔记(3)redis搭建集群 Redis集群搭建 Redis集群搭建 cp /etc/redis.d/redis ...

  8. PSO(粒子群)算法学习笔记

    PSO(粒子群)算法学习笔记 PSO算法的概述 PSO算法是一种全局优化的算法,它模拟的是鸟群或者鱼群的一种彼此共享信息去搜寻食物的过程. PSO算法与遗传算法(GA)类似,但是其少了GA中" ...

  9. Windows内存管理学习笔记(一)—— 线性地址的管理

    Windows内存管理学习笔记(一)-- 线性地址的管理 用户空间线性地址的管理 实验一:理解用户空间线性地址管理 Private Memory 实验二:理解Private Memory 堆 实验三: ...

最新文章

  1. 每日一道算法题--leetcode 509--斐波那契数(动态规划)--python
  2. tensorflow教程 开始——数据集:快速了解 tf.data
  3. sqlserver 清除日志
  4. React Component里的状态机Pattern
  5. Android SDK下载太慢
  6. 数据分析和数据开发的区别
  7. DxO PhotoLab 3 for Mac(照片后期处理软件)
  8. 软件测试必须知道的缺陷分析
  9. 一文带你了解机器翻译
  10. 如何打造一份it项目计划书
  11. python编程案例看电影_转利用python实现电影推荐
  12. 【优雅编程之道】之IO流,序列化的4点建议
  13. OkHttp3源码详解(四)缓存策略,万分膜拜
  14. 产品驱动程序一览表(ThinkPad X61)
  15. 计算机工作组环境和域环境的区别
  16. 生活随记-如何健康摄入果糖
  17. 计算机无法启动bios,开机进入bios无法进入系统怎么办_电脑开机就进入bios的解决方法...
  18. 500人访问的网站服务器配置,500人并发量的服务器配置
  19. 解决猫盘x3p无法登录的问题
  20. MMSystem.h头文件

热门文章

  1. 属于拼多多的巴别塔正在构筑
  2. 黑马程序员——【学习笔记】集合——String、StringBuffer 以及集合
  3. 复测前端BUG一定要清缓存吗?
  4. 如何用TANGO探戈和VVDI编程器来刷写宝马PCF7953钥匙
  5. lte盲重定向_TD-LTE网络基于PS业务的重定向过程研究
  6. 机器视觉光源选型总结---颜色选择
  7. 【1071】C语言程序设计教程(第三版)课后习题6.9
  8. Jessi-记录工作问题
  9. Django框架之美多商城项目
  10. Windows环境下通过SSH登录新浪云