您的位置:首页 > 运维架构 > Linux

Linux学习笔记(十五)

2012-07-22 15:17 134 查看
Linux 账号管理与 ACL 权限设定
用户识别:UID与GID

虽然登录主机的时候,输入的是我们的账号,但是其实Linux主机并不会直接认识“账号名称”,它仅认识ID。ID就是一组号码,主机识别的是数字,账号是为了让人们方便记忆。

ID与账号对应的关系就在/etc/passwd中。

每个登录用户至少会取得两个ID,一个是用户ID(user ID,检测UID),一个是用户组ID(Group ID简称GID)。文件就是利用UID与GID来识别它的拥有者与用户组的。

使用者账号

Linux 系统上面的用户如果需要登入主机以取得 shell 的环境来工作时,他需要如何进行呢?

1. 先找寻 /etc/passwd 里面是否有你输入的账号?如果没有则跳出,如果有的话则将该账号对应的 UID 与 GID (在 /etc/group 中) 读出来,另外,该账号的家目录与 shell
设定也一并读出;

2. 再来则是核对密码表啦!这时 Linux 会进入 /etc/shadow 里面找出对应的账号与 UID,然后核对一下你刚刚输入的密码与里头的密码是否相符?

3. 如果一切都 OK 的话,就进入 Shell 控管的阶段啰!

/etc/passwd和/etc/shadow是必须要让系统读取的文件。而且这两个文件也是必须备份的文件。

/etc/passwd

这个文件的构造是:每一个行都代表一个账号,有几行就代表系统中有几个账号。里面很多账号是系统中必须要的,也叫做系统账号。如bin,daemon,adm,nobody这些账号是系统正常运行所需要的,不要随意删除掉。文件的内容有点儿像下面的:



我们先来看一下每个 Linux 系统都会有的第一行,就是 root 这个系统管理员那一行,

每一行都是用“:“分隔(一行总共6个“:”)开,共有七部分的内容,分别是:

账号名称:对用UID。例如,root就是默认的系统管理员账号名称。

密码:现在这个字段的密码数据已经改放在/etc/shadow中。这里可以看到是一个x,表示密码已经移到shadow这个加密后的文件中了。

UID:这就是用户识别码(UID)

Linux 对于 UID 有几个限制需要说给您了解一下:



GID:与/etc/group有关。其实/etc/group的概念与/etc/passwd差不多,只是这个是用来规范用户组的。

用户信息说明栏:这字段没什么重要用途,只是用来解释这个账号的意义。

家目录:用户的家目录。

Shell:拥有您执行命令后,各硬件设备接口之间的通信,个人感觉也就是这个账号所用到或者是取得的Shell。

etc/shadow

因为每个程序都需要取得UID和GID来判断权限问题,所以/etc/passwd的权限必须要设置为-rw-r--r--。这样的话所有人都可以看到密码了,所以后来人们就把密码移到/etc/shadow文件中,而且在/etc/shadow里加入了很多密码限制参数。

/etc/shadow 文件有点像这样:



基本上, shadow 同样以『:』作为分隔符,共有九个字段,这九个字段的用途是这样的:

1账号名称:由于密码也需要与账号对应啊~因此,这个档案的第一栏就是账号,必须要与 /etc/passwd 相同才行!

2密码:这个字段内的数据才是真正的密码,而且是经过编码的密码 (加密) 啦! 你只会看到有一些特殊符号的字母就是了!需要特别留意的是,虽然这些加密过的密码很难被解出来, 但是『很难』不等于『不会』,所以,这个档案的预设权限是『-rw-------』或者是『-r--------』,亦即只有 root 才可以读写就是了!你得随时注意,不要不小心更动了这个档案的权限呢!很多软件透过这个功能,在此字段前加上 ! 或 * 改变密码字段长度,就会让密码『暂时失效』了。

3最近更动密码的日期:这个字段记录了『改动密码那一天』的日期,不过,很奇怪呀!在我的例子中怎么会是 14126 呢?呵呵,这个是因为计算 Linux 日期的时间是以 1970 年 1 月 1 日作为 1 而累加的日期,1971 年 1 月 1 日则为 366 啦! 得注意一下这个资料呦!上述的 14126 指的就是 2008-09-04 那一天啦!了解乎? 而想要了解该日期可以使用本章后面 chage 指令的帮忙!至于想要知道某个日期的累积日数, 可使用如下的程序计算:



上述指令中,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保留:最后一个字段是保留的,看以后有没有新功能加入。

举个例子来说好了,假如我的 dmtsai 这个使用者的密码栏如下所示:



这表示什么呢?先要注意的是 14299 是 2009/02/24 。所以 dmtsai 这个使用者的密码相关意义是:

由于密码几乎仅能单向运算(由明码计算成为密码,无法由密码反推回明码),因此由上表的数据我们无法得知 dmstai 的实际密码明文;

此账号最近一次更动密码的日期是 2009/02/24 (14299);

能够再次修改密码的时间是 5 天以后,也就是 2009/03/01 以前 dmtsai 不能修改自己的密码;如果使用者还是尝试要更动自己的密码,系统就会出现这样的讯息:

画面中告诉我们:你必须要等待更久的时间才能够变更密码之意啦!

由于密码过期日期定义为 60 天后,亦即累积日数为: 14299+60=14359,经过计算得到此日数代表日期为 2009/04/25。 这表示:『使用者必须要在 2009/03/01 到 2009/04/25 之间的 60 天限制内去修改自己的密码,若 2009/04/25 之后还是没有变更密码时,该密码就宣告为过期』了!

警告日期设为 7 天,亦即是密码过期日前的 7 天,在本例中则代表 2009/04/19 ~ 2009/04/25 这七天。 如果使用者一直没有更改密码,那么在这 7 天中,只要 dmtsai 登入系统就会发现如下的讯息:



如果该账号一直到 2009/04/25 都没有更改密码,那么密码就过期了。但是由于有 5 天的宽限天数, 因此 dmtsai 在 2009/04/30 前都还可以使用旧密码登入主机。 不过登入时会出现强制更改密码的情况,画面有点像底下这样:



你必须要输入一次旧密码以及两次新密码后,才能够开始使用系统的各项资源。如果你是在 2009/04/30 以后尝试以 dmtsai 登入的话,那么就会出现如下的错误讯息且无法登入,因为此时你的密码就失效去啦!



如果使用者在 2009/04/25 以前变更过密码,那么第 3 个字段的那个 14299 的天数就会跟着改变,因此, 所有的限制日期也会跟着相对变动喔!

无论使用者如何动作,到了 14419 (大约是 2009/07/24 左右) 该账号就失效了~

如果密码忘记或者被更改了怎么办?

· 一般用户的密码忘记了:这个最容易解决,请系统管理员帮忙, 他会重新设定好你的密码而不需要知道你的旧密码!利用 root 的身份使用 passwd 指令来处理即可。

· root 密码忘记了:这就麻烦了!因为你无法使用 root 的身份登入了嘛! 但我们知道 root 的密码在 /etc/shadow 当中,因此你可以使用各种可行的方法开机进入 Linux 再去修改。 例如重新开机进入单人维护模式(第二十章)后,系统会主动的给予 root 权限的 bash 接口, 此时再以 passwd 修改密码即可;或以 Live CD 开机后挂载根目录去修改 /etc/shadow,将里面的 root 的密码字段清空, 再重新开机后 root 将不用密码即可登入!登入后再赶快以 passwd 指令去设定 root 密码即可

关于用户组

用户组的设置文件 /etc/group和/etc/gshadow这两个文件。

1:/etc/group

这个文件时记录GID与用户组名称的。/etc/group内容有点儿像这样:



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

用户组名称:就似乎用户组的名称。

用户组密码:通常不需要设置,因为我们很少用到用户组登录。即使是有密码的话,密码也是记录在/etc/gshadow这个文件中。

GID:用户组的ID。

支持的账户名称:加入到这个用户组里的所有账号。一个用户可以加入多个用户组。只要把用户名加入到这个地方(,用户名) 不要有空格就可以了。

谈完了 /etc/passwd, /etc/shadow, /etc/group之后,我们可以使用一个简单的图示来了解一下 UID ,GID 与密码之间的关系, 图示如下。其实重点是 /etc/passwd 啦,其他相关的数据都是根据这个档案的字段去找寻出来的。下图中,root 的 UID 是 0 ,而 GID 也是 0 ,去找 /etc/group 可以知道 GID 为 0 时的组名就是 root 哩。 至于密码的寻找中,会找到 /etc/shadow 与/etc/passwd 内同账号名称的那一行,就是密码相关数据啰。



2 有效用户主与初始用户组

每个用户在/etc/passwd里的第四栏,都有GID,这个GID就是“初始用户组”,也即是说当用户登录系统,立刻就拥有了这个用户组的相关权限。要建立一个新的文件,则文件的用户组就要看当前用户的有效用户组了。还得让每个使用者在他的 /etc/passwd 里面的第四栏有所谓的 GID 吧?那个 GID 就是所谓的『初始群组 (initial group) 』!也就是说,当用户一登入系统,立刻就拥有这个群组的相关权限的意思。 举例来说,我们上面提到 dmtsai 这个使用者的 /etc/passwd 与 /etc/group 还有 /etc/gshadow 相关的内容

如下:

[root@www ~]# usermod -G users dmtsai <==先设定好次要群组

[root@www ~]# grep dmtsai /etc/passwd /etc/group /etc/gshadow

/etc/passwd:dmtsai:x:503:504::/home/dmtsai:/bin/bash

/etc/group:users:x:100:dmtsai <==次要群组的设定

/etc/group:dmtsai:x:504: <==因为是初始群组,所以第四字段不需要填入账号

/etc/gshadow:users:::dmtsai <==次要群组的设定

/etc/gshadow:dmtsai:!::

仔细看到上面这个表格,在 /etc/passwd 里面,dmtsai 这个使用者所属的群组为 GID=504 ,搜寻一下 /etc/group 得到 504 是那个名为 dmtsai 的群组啦!这是 initial group。因为是初始群组, 使用者一登入就会主动取得,不需要在 /etc/group 的第四个字段写入该账号的,但是非 initial group的其他群组可就不同了。举上面这个例子来说,我将 dmtsai 加入 users 这个群组当中,由于users 这个群组并非是 dmtsai 的初始群组,因此, 我必须要在 /etc/group 这个档案中,找到 users 那一行,并将 dmtsai 这个账号加入第四栏, 这样 dmtsai 才能够加入 users 这个群组啊。那举在这个例子当中,因为我的 dmtsai 账号同时支持 dmtsai 与 users 这两个群组, 因此,在读取/写入/执行档案时,针对群组部分,只要是 users与 dmtsai 这两个群组拥有的功能, 我的dmtsai 这个使用者都能够拥有喔!这样瞭呼?不过,这是针对已经存在的档案而言, 如果今天我要建立一个新的档案或者是新的目录,请问一下,新档案的群组是 dmtsai 还是 users ?呵呵!这就得要检查一下当时的有效群组了 (effective group)。

查看当前用户所支持的用户组:直接在命令行下 敲 groups即可,第一个输出的用户组为有效用户组。

更改有效用户组:命令行界面下 newgroup 用户组名(想要更改的用户组名字)。就可以了。要离开新的有效用户组时候,直接exit即可。



既然如此,也就是说,只要我的用户有支持的群组就是能够切换成为有效群组!好了, 那举如何让一个账号加入不同的群组就是问题的所在啰。你要加入一个群组有两个方式,一个是透过系统管理员 (root) 调用 usermod 帮你加入,如果 root 太忙了而且你的系统有设定群组管理员,那么你可以透过群组管理员以 gpasswd 帮你加入他所管理的群组中!详细的作法留待下一小节再来介绍啰!

3 /etc/gshadow

如果没有明白/etc/gshadow的设置,newgroup是无法操作的。/etc/gshadow的内容有点儿像下面这样:



这个档案内同样还是使用冒号『:』来作为字段的分隔字符,这个档案几乎与 /etc/group 一模一样!第二个字段是密码栏,如果密码栏上面是“!”时,表示该用户组不能使用密码来登录。第四个字段也就是支持的账号名称。

这四个字段的名称:

1 用户组名称

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

3 用户组管理员的账号 (相关信息在 gpasswd 中介绍)

4 该用户组的所属账号 (与 /etc/group 内容相同!)

以系统操作来说,事实上,这个/etc/gshadow的密码最大的作用是“让哪些不在用户组中的成员,临时加入该用户组”。实际情况是很少的。如果真的想让某个用户利用该用户组的功能,还是直接将对方加入该用户组的支持就好了,否则太麻烦。

账号管理

如何新增、删除与更改用户的相关信息。

新增与删除用户:useradd、相关配置文件、passwd、usermod、userdel

1 useradd命令可以在Linux系统中新增一个用户

[root@www ~]# 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@www ~]# useradd vbird1

[root@www ~]# ll -d /home/vbird1

drwx------ 4 vbird1 vbird1 4096 Feb 25 09:38 /home/vbird1

# 预设会建立使用者家目录,且权限为 700 !这是重点!

[root@www ~]# grep vbird1 /etc/passwd /etc/shadow /etc/group

/etc/passwd:vbird1:x:504:505::/home/vbird1:/bin/bash

/etc/shadow:vbird1:!!:14300:0:99999:7:::

/etc/group:vbird1:x:505: <==预设会建立一个与账号一模一样的群组名其实系统已经帮我们规定好非常多的默认值了,所以我们可以简单的使用『 useradd 账号 』来建立使用者即可。CentOS 这些默认主要会帮我们处理几个项目:

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

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

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

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

由于在 /etc/shadow 内仅会有密码参数而不会有加密过的密码数据,因此我们在建立使用者账号时,还需要使用『 passwd 账号 』来给予密码才算是完成了用户建立的流程。如果由于特殊需求而需要改变使用者相关参数时, 就得要透过上述表格中的选项来进行建立了,参考底下的案例:

范例二:假设我已知道我的系统当中有个组名为 users ,且 UID 700 并不存在,请用 users 为初始群组,以及 uid 为 700来建立一个名为 vbird2的账号

[root@www ~]# useradd -u 700 -g users vbird2

[root@www ~]# ll -d /home/vbird2

drwx------ 4 vbird2 users 4096 Feb 25 09:59 /home/vbird2

[root@www ~]# grep vbird2 /etc/passwd /etc/shadow /etc/group

/etc/passwd:vbird2:x:700:100::/home/vbird2:/bin/bash

/etc/shadow:vbird2:!!:14300:0:99999:7:::

# 看一下,UID 与 initial group 确实改变成我们需要的了!

范例三:建立一个系统账号,名称为 vbird3

[root@www ~]# useradd -r vbird3

[root@www ~]# ll -d /home/vbird3

ls: /home/vbird3: No such file or directory <==不会主动建立家目录

[root@www ~]# grep vbird3 /etc/passwd /etc/shadow /etc/group

/etc/passwd:vbird3:x:100:103::/home/vbird3:/bin/bash

/etc/shadow:vbird3:!!:14300::::::

/etc/group:vbird3:x:103:

使用 useradd 建立使用者账号时,其实会更改不少地方,至少我们就知道底下几个档案:

使用者账号与密码参数方面的档案:/etc/passwd, /etc/shadow

使用者群组相关方面的档案:/etc/group, /etc/gshadow

使用者的家目录:/home/账号名称

useradd 参考档

其实 useradd 的默认值可以使用底下的方法呼叫出来:

[root@www ~]# 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)

passwd

使用 useradd 建立了账号之后,在预设的情况下,该账号是暂时被封锁的, 也就是说,该账号是无法登入的,你可以去瞧一瞧 /etc/shadow 内的第二个字段就晓得啰~ 那该如何是好?直接给他设定新密码就好了嘛!对吧~设定密码就使用 passwd 啰!

[root@www ~]# passwd [--sdtin] <==所有人均可使用来改自己的密码

[root@www ~]# passwd [-l] [-u] [--sdtin] [-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@www ~]# passwd vbird2

Changing password for user vbird2.

New UNIX password: <==这里直接输入新的密码,屏幕不会有任何反应

BAD PASSWORD: it is WAY too short <==密码太简单或过短的错误!

Retype new UNIX password: <==再输入一次同样的密码

passwd: all authentication tokens updated successfully. <==竟然还是成功修改了!

chage

有没有更详细的密码参数显示功能呢?那就是 chage 了! 他的用法如下:

[root@www ~]# chage [-ldEImMW] 账号名

选项与参数:

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

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

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

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

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

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

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

范例一:列出 vbird2 的详细密码参数

[root@www ~]# chage -l vbird2

Last password change : Feb 26, 2009

Password expires : Apr 27, 2009

Password inactive : May 07, 2009

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

usermod

[root@www ~]# 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..

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

[root@www ~]# userdel [-r] username

选项与参数:

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

范例一:去除 vbird2 ,连同家目录一起去除

[root@www ~]# userdel -r vbird2

这个指令下达的时候要小心了!通常我们要移除一个账号的时候,你可以手动的将 /etc/passwd 与

/etc/shadow 里头的该账号取消即可!

id

id 这个指令则可以查询某人或自己的相关 UID/GID 等等的信息,他的参数也不少,不过, 都不需要记~反正使用 id 就全部都列出啰~ ^_^

[root@www ~]# id [username]

范例一:查阅 root 自己的相关 ID 信息!

[root@www ~]# id

uid=0(root) gid=0(root)

groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),

10(wheel) context=root:system_r:unconfined_t:SystemLow-SystemHigh

# 上面信息其实是同一行的数据!包括会显示 UID/GID 以及支持的所有群组!

# 至于后面那个 context=... 则是 SELinux 的内容,先不要理会他!

范例二:查阅一下 vbird1 吧~

[root@www ~]# id vbird1

uid=504(vbird1) gid=505(vbird1) groups=505(vbird1)

context=root:system_r:

unconfined_t:SystemLow-SystemHigh

[root@www ~]# id vbird100

id: vbird100: No such user <== id 这个指令也可以用来判断系统上面有无某账号!

新增与删除用户组

用户组的内容都与下面这个两个文件有关:

/etc/group

/etc/gshadow

1 groupadd

[root@www ~]# groupadd [-g gid] [-r] 群组名称

选项与参数:

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

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

范例一:新建一个群组,名称为 group1

[root@www ~]# groupadd group1

[root@www ~]# grep group1 /etc/group /etc/gshadow

/etc/group:group1:x:702:

/etc/gshadow:group1:!::

# 群组的 GID 也是会由 500 以上最大 GID+1 来决定!

2 groupmod

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

[root@www ~]# groupmod [-g gid] [-n group_name] 群组名

选项与参数:

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

-n :修改既有的群组名称

范例一:将刚刚上个指令建立的 group1 名称改为 mygroup , GID 为 201

[root@www ~]# groupmod -g 201 -n mygroup group1

[root@www ~]# grep mygroup /etc/group /etc/gshadow

/etc/group:mygroup:x:201:

/etc/gshadow:mygroup:!::

不过,还是那句老话,不要随意的更动 GID ,容易造成系统资源的错乱!

3 groupdel

groupdel 自然就是在删除群组,用法很简单:

[root@www ~]# groupdel [groupname]

范例一:将刚刚的 mygroup 删除!

[root@www ~]# groupdel mygroup

范例二:若要删除 vbird1 这个群组的话?

[root@www ~]# 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)做的动作:

[root@www ~]# gpasswd groupname

[root@www ~]# gpasswd [-A user1,...] [-M user3,...] groupname

[root@www ~]# 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 这个群组当中。

范例一:建立一个新群组,名称为 testgroup 且群组交由 vbird1 管理:

[root@www ~]# groupadd testgroup <==先建立群组

[root@www ~]# gpasswd testgroup <==给这个群组一个密码吧!

Changing the password for group testgroup

New Password:

Re-enter new password:

# 输入两次密码就对了!

[root@www ~]# gpasswd -A vbird1 testgroup <==加入群组管理员为 vbird1

[root@www ~]# grep testgroup /etc/group /etc/gshadow

/etc/group:testgroup:x:702:

/etc/gshadow:testgroup:$1$I5ukIY1.$o5fmW.cOsc8.K.FHAFLWg0:vbird1:

# 很有趣吧!此时 vbird1 则拥有 testgroup 的主控权喔!身份有点像板主啦!

范例二:以 vbird1 登入系统,并且让他加入 vbird1, vbird3 成为 testgroup 成员

[vbird1@www ~]$ id

uid=504(vbird1) gid=505(vbird1) groups=505(vbird1) ....

# 看得出来,vbird1 尚未加入 testgroup 群组喔!

[vbird1@www ~]$ gpasswd -a vbird1 testgroup

[vbird1@www ~]$ gpasswd -a vbird3 testgroup

[vbird1@www ~]$ grep testgroup /etc/group

testgroup:x:702:vbird1,vbird3

5 newgrp

newgrp会额外以另一个login来让用户登录到另一个Shell中,并将有效用户组改为newgrp后面接的那个用户组,若没有接用户组,则默认用户组为初始用户组。

切换用户身份

原因:

操作的好习惯

用较低的权限启动系统服务

软件本身的限制

一般来说我们不希望以root身份登录主机,以避免被怪客入侵。如何将一般用户的身份变成root?有以下两种方式:

1:用su直接将身份变成root,这个命令需要root的密码,也就是说如果要以su变成root, 你的一般用户必须要有root的密码才行。

2: 若有很多人同时管理一台主机的时候,root的密码会让很多人知道,如果不想将root的密码外传,使用sudo。

su

su 是最简单的身份切换指令了,他可以进行任何身份的切换唷!方法如下:

[root@www ~]# su [-lm] [-c 指令] [username]

选项与参数:

- :单纯使用 - 如『 su - 』代表使用 login-shell 的变量档案读取方式来登入系统;若使用者名称没有加上去,则代表切换为 root 的身份。

-l :与 - 类似,但后面需要加欲切换的使用者账号!也是 login-shell 的方式。

-m :-m 与 -p 是一样的,表示『使用目前的环境设定,而不读取新使用者的设定档』

-c :仅进行一次指令,所以 -c 后面可以加上指令喔!

如果使用su的时候没有加上“-“则,很多原来用户的设置回继续存在,比如说PATH变量问题。加入”-“以后很多变量的设置也就随着su而变。建议以后使用su 的时候加上”-“

如果su 后面没有加上用户账号时,默认是切换到root。若要完整的切换到新使用者的环境,必须要使用『 su - username 』或『 su -l username 』, 才会连同 PATH/USER/MAIL 等变量都转成新使用者的环境;如果仅想要执行一次 root 的指令,可以利用『 su - -c "指令串" 』的方式来处理;使用 root 切换成为任何使用者时,并不需要输入新使用者的密码;

sudo

但是 sudo 预设仅有 root 能使用啊! sudo 的执行是这样的流程:

1:当使用者执行 sudo 时,系统于 /etc/sudoers 档案中搜寻该使用者是否有执行 sudo 的权限;

2:若使用者具有可执行 sudo 的权限后,便让使用者『输入使用者自己的密码』来确认;

3:若密码输入成功,便开始进行 sudo 后续接的指令(但 root 执行 sudo 时,不需要输入密码);

4:若欲切换的身份与执行者身份相同,那也不需要输入密码。

所以说,sudo 执行的重点是:『能否使用 sudo 必须要看 /etc/sudoers 的设定值, 而可使用 sudo 者是透过输入使用者自己的密码来执行后续的指令串』喔!由于能否使用与 /etc/sudoers 有关, 所以我们当然要去编辑 sudoers 档案啦!不过,因为该档案的内容是有一定的规范的,因此直接使用 vi 去编辑是不好的。 此时,我们得要透过 visudo 去修改这个档案喔!

单一使用者可进行 root 所有指令,与 sudoers 档案语法:

假如我们要让 vbird1 这个账号可以使用 root 的任何指令,那么可以简单的这样进行修改即可:

[root@www ~]# visudo

....(前面省略)....

root ALL=(ALL) ALL <==找到这一行,大约在 76 行左右

vbird1 ALL=(ALL) ALL <==这一行是你要新增的!

....(前面省略)....

有趣吧!其实 visudo 只是利用 vi 将 /etc/sudoers 档案呼叫出来进行修改而已,所以这个档案就是 /etc/sudoers 啦! 这个档案的设定其实很简单,如上面所示,如果你找到 76 行 (有 root 设定的那行) 左右,看到的数据就是:

使用者账号 登入者的来源主机名称=(可切换的身份) 可下达的指令

root ALL=(ALL) ALL <==这是默认值

上面这一行的四个组件意义是:

系统的哪个账号可以使用 sudo 这个指令的意思,预设为 root 这个账号;

当这个账号由哪部主机联机到本 Linux 主机,意思是这个账号可能是由哪一部网络主机联机过来的, 这个设定值可以指定客户端计算机(信任用户的意思)。默认值 root 可来自任何一部网络主机 ,这个账号可以切换成什么身份来下达后续的指令,预设 root 可以切换成任何人; 可用该身份下达什么指令?这个指令请务必使用绝对路径撰写。 预设 root 可以切换任何身份且进行任何指令之意。 如果想让属于某个用户组的用户都能进行sudo时候可以这样写:

%goupname ALL = (ALL) ALL

如果不想让这个用户组的用户在使用sudo时候不输入密码可以在“可执行的命令“字段内加入一个名为”NOPASSWD:“的参数。

%goupname ALL = (ALL) NOPASSWD: ALL
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: