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

Linux学习第二十八篇--用户和群组

2017-08-04 13:44 323 查看

前言

个人感觉这又是一块比较枯燥的地方了,倒是也没有必要死记硬背,用到的时候,再查也不迟,主要是记录一遍,给自己一个印象,到时候方便自己精确查找。

linux的用户和群组

passwd和shadow文件

在我学习linux的过程中,已经多次接触到了linux的用户和群组问题,包括最开始的登录到之后的权限管理和特殊权限都涉及到了用户和群组,但是一直也没有特别深入的去学习。
这里刚好学到了这一块,顺手记录一下。
首先要说一下位于/etc目录下的passwd文件,如果单纯的从名字来看,感觉这应该是密码相关的文件,其实则不然,这个命令是用户记录相关数据的,但恰恰没有真正的去记录用户的密码。
因为一些原因,密码被放置到了/etc/shadow文件中。
这里先看一下passwd文件的内容。





看起来乱七八糟貌似很复杂的样子,实际上没有想象中那么复杂。我们看一下这里面的内容具体是什么含义,首先这里的每一行都是一条用户记录,这一条用户记录又包含了多条用户信息,这些用户信息是通过:号来分割的。
awk -F'[:]' 'BEGIN {print "用户名\t密码\tUID\tGID\t描述\t家目录\tshell"} {print $1"\t"$2"\t"$3"\t"$4"\t"$5"\t"$6"\t"$7}'  /etc/passwd




如上图,每一条用户记录大概包含了七条信息。
首先第一列记录了用户名称。
第二列原本是记录密码的,但是现在为了安全考虑密码放置在了/etc/shadow文件中。
第三列,记录了用户的UID,这里我忘记了我之前有没有记录这个概念,这里再阐述一遍吧,在我学过的编程知识里面,这个ID通常是唯一的,用来区分不同的数据,在linuxUid也是唯一的,即同时只能有一条。linux记录的数据基本都是记录的UID而不是我们使用的用户名,这里的用户名只是为了方便我们用户来记忆和使用而已。
第四列,记录了用户所在群组的ID,即GID,这里还会牵扯到一个概念,叫有效群组和初始群组,这里待会再说,这儿先主要了解用户相关的信息。
第五列,这条信息主要是用来描述这个用户的作用的,就像我们学shellscript时的注释一样。
第六列,这里记录了该用户对应的家目录。
第七列,这儿记录的是当该用户登录成功时,取得的第一个shell。
看看上面这七列数据,除了UID和GID基本都是我们熟悉的东西,再看看/etc/shadow文件的内容吧,他也是使用:号来分割的。
额。。。因为这里的密码能够破解出来,所以我就不贴root这一条用户数据了。



上面的信息同样也是每一行对应一条记录,而每一条记录又可以分为九条信息。
第一列是用户名。
第二列是用户密码,这里的密码是通过加密后的。
第三列记录了上次该用户密码变更的日期,这里记录的一串数字表示的是自1970年1月1日至今的天数。你要是想问这个日期怎么算,那还是去看看date命令的文档去吧~
第四列记录的数据表示,当我变更了密码后在几天内不能再次修改密码。如果是0的话,就表示随时都可以修改。
第五列记录的数据表示,当我修改密码后,我必须在几天内再次修改密码。
第六列记录的数据表示,提前几天提示我修改密码。比如我2017/08/01修改了密码,我设置了第五条数据为31,第六列数据为5的话,那么在27号开始,我登录就会开始提示我修改密码了。
第七列数据记录的数据表示,如果到日期了我还是没修改密码,可以宽限我几天,就像你的信用卡,假设每月一号还款,但是如果你一号没有还款的话,他往往还会告诉你需要在几天内还款,和这个异曲同工之妙。
第八列记录的数据表示,如果到达这个日期我还是没有修改密码,不好意思,你的密码就失效了,就好像,到了最后宽限日期你还是没还款,警察叔叔就抓你了(我猜的)。
第九列,没啥好说的,这是个保留字段。
记不住没关系啊,记不住可以留个概念,至少以后遇到这个问题,知道在哪儿。
一直到这个位置,说的数据基本上都是用户相关的信息,而且算是理论性的东西吧,下面再说一些群组的理论性的知识。
群组也是个比较有啥意思的玩意,尤其是他的配置文件,和用户的类似。
他的群组定义文件是/etc/group。。。他还有个/etc/gshadow。。。虾米?不要问我为啥群组还有密码。。。待会你就知道了。

group和gshadow文件

先看一下/etc/group文件的内容




group文件的数据不是很多,同理也是一行表示一条记录,每条记录通过:号分割成了四条信息。
依次分别是,群组名称,群组密码,群组ID和群组的用户,这里要说一下群组用户这条信息,这里多个用户用户使用英文逗号(,)分割的。
然后看看/etc/gshadow文件的内容



数了数,gshadow文件一条记录也是记录了四条信息,依次分别是群组名称,群组密码,群组管理员,群组用户。
ok,理论性的东西差不多就到这儿了,下面来点干货,先研究一下怎么样去操作用户和群组.

用户和群组的操作

很无奈啊,都学了这么久了,竟然还不会用户和群组的操作.
如果要让我去想,对用户和群组都会有哪些操作,无外乎增删改查吧.
增加用户,删除用户,修改用户信息,查看用户信息.
增加群组,删除群组,修改群组信息,查看群组及群组用户的信息.

Useradd命令

先看一个命令,叫做useradd,如果通过名字来看,这个命令应该是用来添加用户的.



看一下手册也确实是这么说的,
4000
那么useradd命令都有哪些常用的选项呢.
我们在前面记录了passwd文件中每条记录记录了七条信息.
这些信息的变更和初始化,我们几乎都可以通过useradd命令来实现。
比如:
-u 指定用户的uid
-g 指定passwd文件中gid。
-G 将指定用户添加到指定的组。
-M 强制不创建家目录。
-m 强制使用默认值创建家目录。
-c 添加用户描述
-d 指定用户的家目录
-r 创建系统账号
-s 指定用户登录获取的shell
当然还有一些其他参数,比如通过-e 指定账号失效日期。
咦,是不是很奇怪,为什么添加用户竟然不能指定密码。
那是因为我们指定密码可以通过passwd命令来实现。我们先不管这个,我们看一下useradd这个命令的效果啊.
太复杂的就算了,就设置一个最简单的用户吧.





额,挺简单的啊.但是貌似有一个问题.看一下shadow文件.



passwd命令

我这账号没有密码啊...这时候就要用到passwd命令了.



passwd命令主要用来修改用户的密码.
看一下他的主要用法
passwd [选项] 账号名称
-l选项,锁定账号的密码,让这个密码失效.
-u选项,解锁密码.
当然他还有其他参数,用来修改或者查看用户密码相关的数据,但是暂时就先不理会了,用了在查看就是.
试一下,passwd命令的效果.



通过passwd 用户名的形式,成功的给用户添加或者修改了密码,我试试能不能登录.



成功登录,然后试试锁死密码.



但是我在锁死之后,发现正在登录的这个用户依然可以操作,不过,当退出该用户之后,再次登陆失败.使用passwd -u panda 之后,则又可以登录了.
这样,我们就可以给我们的系统添加新的用户喽,如果想在添加用户之后修改数据可以使用命令usermod.

usermod

usermod用来修改用户的数据,请注意,一张大图即将来袭~



这个命令还是比较有意思的.
他的格式是酱紫的,usermod [选项] 用户
-c选项,修改用户的描述信息.对应的是passwd文件的第五列信息.

-d修改用户的家目录.
-g修改用户的初始群组
-G修改用户的次要群组,可以和-a一块使用,表示追加次要群组,而不是设置..
上面这两个群组的概念,将会在下文解释.
-l 修改账户的名称.
-s修改账户登录后加载的shell.
-u修改用户的uid.
-L,效果和passwd -l一样,锁定用户密码.
-U,效果和passwd -u一样,解锁密码.
还有删除用户的命令userdel

userdel

userdel命令比较简单,记住一个-r选项就好了.直接使用userdel 用户可以删除指定用户,如果加上-r选项将会一同删除掉用户的家目录.

上面就是用户的相关操作了,额,好像还少一个查,可以通过id命令来查询用户信息哟.

恩,这样就完整了.

下面看一下群组的操作.

groupadd

创建一个新的群组,他常用的也就两个选项,一个是-r 创建一个系统群组,一个是-g指定这个群组的gid.

groupmod

修改群组信息,选项也很简单,-g修改gid,-n修改群组名称.

groupdel

删除一个群组,不顾哦需要注意的是,这儿如果要删除一个群组的话需要确保的是被删除的群组里面没有用户哟.
不要问我为啥群组的这几个命令为啥写的这么单薄...毕竟他和用户相关操作长得差不多...

还记得刚才说过的初始群组和有效群组吗?

有效群组和初始群组

个人感觉这是一个比较有意思的地方.为啥群组还要分成两部分呢?
还记得我们在passwd文件第四列记录的数据吗,这个位置记录了用户所属组的GID,其实这个GID就是该用户的初始群组,有一点需要注意的是,用户的初始群组,并不会记录在group文件的第四列中.
这个初始群组就是我们在登录到linux系统之后,立马就会获得该群组的权限.
当然一个用户不止可以加入一个群组,一个群组可以拥有多个用户,一个用户可以属于多个群组.
我们介意通过groups来查看当前用户所属的群组集合,.
举个例子.



我们先创建一个用户,两个群组来玩一下



我们来验证一下有效群组是啥意思.
我们首先通过groups命令看一下panda所属的所有群组.



这里输出的第一个群组就是有效群组.
我们切换到panda用户,创建一个文件,看一下权限.



看所属组是panda.
这里这个panda组就是panda用户当前的有效群组.他的作用就是我们创建文件时,这个文件的所属组.
我们可以通过newgrp来切换有效群组.
我们看一下效果.



额,到了这,群组还剩下一个概念,就搞定了~

群组管理员

群组管理员这个身份有点像是班级里的班主任这个角色.他对你们这个班有着一定的掌控权.
他的应用场景比较好玩,举个例子,我们公司有很多个项目组,每个项目组都有自己的项目经理,项目组员在服务器上统一维护代码.
人多啊,你不能每次有需要的时候,都去找网络管理员吧,于是呢,这里就用到了群组管理员这个身份.
我们看一下gpasswd这个命令,他主要操作的是group和gshadow这两个文件,root用户可以通过-A选项来添加管理员列表,-M选项来添加用户列表.
也可以通过-a选项添加一个用户到群组,-d选项删除一个用户.-r移除群组密码.-R使群组密码失效.
他的使用格式是:gpasswd [选项] 群组名称,如果不加任何选项那就是给群组添加密码.
额...不想测试了....放过他了...

最后的最后,补充一点吧,我们目前学到的权限管理方面,管理的颗粒还是比较大,毕竟一个文件加上特殊权限才只有十二个权限位,如果我们想针对某一个文件的某一个用户或者某一个群组来进行特殊的权限处理,这种普通的权限授权就不够用了,这时候,我们就可以通过ACL来扩展我们的权限管理了.
昨天和前天用了两天的时间看了一下ACL这一块,其实不是很难,用了这么长时间主要还是因为最近项目太忙,没有太充裕的时间看.
ACL这一块,主要是有两个命令,一个setfacl用来设置acl权限,一个是getfacl用来设置acl权限,太过具体的东西可以通过man命令来看一下.
额,至于为什么不去详细的记录这一块,主要是因为,作为开发人员,这个东西想来有个印象就够了~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: