Linux系统用户与属组管理
Linux 账号的时刻了,对于 Linux 有一定的熟悉度之后,再来就是要管理连上 Linux 的账号问题了,这个账号的问题可大可小,大到可以限制他使用 Linux 主机的各项资源,小到甚至一般账号的密码订定守则都可以进行规定,管理员的工作中,相当重要的一环就是管理账号,因为整个系统都是你在管理的,并且所有一般用户的账号申请,都必须要透过你的协助才行,所以你就必须要了解一下如何管理好一个服务器主机的账号啦,在管理 Linux 主机的账号时,我们必须先来了解一下 Linux 到底是如何辨别每一个使用者的.
关于Linux UID账号 (User Identity 用户标识号)
超级用户: UID=0
系统用户: UID=500-65535 最大:1000-65535
普通用户: UID:500-65535 最大:1000-65535
关于Linux GID账号 (Group Identify 组标识号)
初始组(私有组),附加组(公共组)
Linux 用户文件解析
虽然我们登陆 Linux 主机的时候,输入的是我们的账号,但是其实 Linux 主机并不会直接认识你的『账号名称』的,他仅认识 ID (ID 就是一组号码),由于计算机仅认识 0 与 1,所以主机对于数字比较有概念的,至于账号只是为了让人们容易记忆而已,而你的 ID 与账号的对应就在 /etc/passwd 当中,为了安全起见 Linux 把用户密码单独放在了 /etc/shadow 目录下,且权限是只允许root能够访问,下面我们来介绍一下其这两个配置文件的具体参数吧.
/etc/passwd
这个文件的构造是这样的,每一行都代表一个账号,有几行就代表有几个账号在你的系统中,不过需要特别留意的是,里头很多账号本来就是系统正常运行所必须要的,我们可以简称他为系统账号,例如 bin,daemon,adm,nobody 等,这些账号请不要随意的删除,这个文件的内容有点像下面这个样子.
[root@localhost ~]# head -n 3 /etc/passwd |
我们先来看一下每个Linux系统都会有的第一行,就是root这个系统管理员那一行好了,你可以明显的看出来,每一行使用『:』分隔开,共有七个咚咚,分别是:
列号码 | 本列作用 |
---|---|
第一列 | 用户名:就是账号,用来对应UID的:例如root的UID对应就是0 |
第二列 | 密码位:密码占位符,这个字段的密码数据在/etc/shadow中 |
第三列 | 用户UID:0=管理员,1-499=系统账户,500-65535=自定义账户 |
第四列 | 用户GID:也就是用户的组ID号,这个GID与/etc/group有关 |
第五列 | 用户描述信息:这一列可有可无,只是用来解释账号的意义而已 |
第六列 | 用户家目录:指定了用户的家目录保存位置,系统默认生成 |
第七列 | 登陆默认Shell:指明系统默认的登陆shell是什么 |
/etc/shadow
我们知道很多程序的运行都与权限有关,而权限与 UID/GID 有关,因此各程序当然需要读取 /etc/passwd 来了解不同账号的权限,因此 /etc/passwd 的权限需配置为 -rw-r–r– 这样的情况,虽然早期的口令也有加密过,但却放置到 /etc/passwd 的第二个字段上,这样一来很容易被有心人士所窃取的,加密过的口令也能够透过暴力破解法去 try and error (试误) 找出来.
因为这样的关系,所以后来发展出将口令移动到 /etc/shadow 这个文件分隔开来的技术,而且还加入很多的口令限制参数在 /etc/shadow 里头,在这里,我们先来了解一下这个文件的构造吧,这个 /etc/shadow 文件有点像下面这样:
[root@localhost ~]# head -n 3 /etc/shadow |
基本上,shadow 同样以『:』作为分隔符,如果数一数,会发现共有九个字段,这九个字段的用途是这样的:
列号码 | 本列作用 |
---|---|
第一列 | 用户名:这个文件的第一栏就是账号,必须要与/etc/passwd相同才行 |
第二列 | 密码位:这个字段内的数据才是真正的口令,而且是经过加密的口令 |
第三列 | 密码最近更改时间:这个字段记录了『更改系统口令那一天』的日期 |
第四列 | 密码最短有效期:账号的口令在最近一次被更改后需要经过几天后才能再次更改 |
第五列 | 密码最长有效期:指定在最近一次更改口令后,经过多久需要再次更改的时间 |
第六列 | 密码到期前的警告天数:当账号口令过期时,系统会发出『警告』给这个账号 |
第七列 | 密码过期后的宽限天数:口令有效日期为『升级日期(第3字段)』+『重新变更日期(第5字段)』 |
第八列 | 密码失效时间:账号在此字段规定的日期之后,将无法再使用,默认是9999999 |
第九列 | 系统保留:此配置没有被使用,属于系统保留字段 |
Linux 属组文件解析
认识了账号相关的两个文件 /etc/passwd 与 /etc/shadow 之后,你或许还是会觉得奇怪,那么群组的配置文件在哪里?还有在 /etc/passwd 的第四栏不是所谓的 GID 吗? 那又是啥? 此时就需要了解 /etc/group 与 /etc/gshadow 这两个配置文件喽.
/etc/group
这个文件就是在记录 GID 与组名的对应了,他主要是实现组用户的记录工作, /etc/group 内容有点像以下这样:
[root@localhost ~]# head -n 3 /etc/group |
这个文件每一行代表一个群组,也是以冒号『:』作为字段的分隔符,共分为四栏,每一字段的意义如下:
列号码 | 本列作用 |
---|---|
第一列 | 组名称:就是组名,在新建用户的时候系统会为用户分配一个默认组. |
第二列 | 密码占位符:通常不需要配置,这个配置通常是给『组管理员』使用的. |
第三列 | 组ID号(GID):就是群组的 ID 号码. |
第四列 | 成员列表:显示本组内的成员列表 |
/etc/gshadow
本配置文件用于存储组的密码,等相关信息/etc/gshadow的内容有点像这样:
[root@localhost ~]# head -n 3 /etc/gshadow |
这个文件内同样还是使用冒号『:』来作为字段的分隔字符,而且你会发现,这个文件几乎与/etc/group一模一样,是这样没错不过,要注意的大概就是第二个字段,第二个字段是口令栏,如果口令栏上面是『!』时,表示该群组不具有群组管理员,至于第四个字段也就是支持的账号名称,这四个字段的意义为:
列号码 | 本列作用 |
---|---|
第一列 | 用户组:就是组名,本配置文件必须与/etc/group文件相对应. |
第二列 | 组密码:这个段可以是空的或!,如果是空的或有!,表示没有密码 |
第三列 | 组管理者:这个字段也可为空,如果有多个用户组管理者用,分割 |
第四列 | 组内成员:如果有多个成员用,号分割 |
以系统管理员的角度来说,这个 gshadow 最大的功能就是创建群组管理员啦,那么什么是群组管理员呢?由于系统上面的账号可能会很多,但是我们root可能平时太忙碌,所以当有使用者想要加入某些群组时,root或许会没有空管理,此时如果能够创建群组管理员的话,那么该群组管理员就能够将那个账号加入自己管理的群组中,可以免去root的忙碌啦.
Linux 用户管理命令
既然要管理账号,当然是由新增与移除使用者开始的啰~底下我们就分别来谈一谈如何新增、移除与更改用户的相关信息吧~
useradd 新建用户
useradd命令用于Linux中创建的新的系统用户,useradd可用来建立用户帐号,帐号建好之后,再用passwd设定帐号的密码.而可用userdel删除帐号,使用useradd指令所建立的帐号,实际上是保存在/etc/passwd文本文件中,在Slackware中,adduser指令是个script程序,利用交谈的方式取得输入的用户帐号资料,然后再交由真正建立帐号的useradd命令建立新用户,如此可方便管理员建立用户帐号.在Red Hat Linux中,adduser命令则是useradd命令的符号连接,两者实际上是同一个指令,其参数我们会在下面进行说明.
[root@localhost ~]# useradd --help |
实例1:使用 useradd -M -r -s /sbin/nologin
参数创建一个系统用户.
[root@localhost ~]# useradd -M -r -s /sbin/nologin lyshark |
实例2:使用 useradd -G
参数创建用户并指定组.
[root@localhost ~]# groupadd admin |
关于useradd命令的拓展
其实系统已经帮我们规定好非常多的默认值了,所以我们可以简单的使用『 useradd 账号 』来创建使用者即可,这些默认值主要会帮我们处理几个项目:
在 /etc/passwd 里面创建一行与账号相关的数据,包括创建UID/GID/家目录等.
在 /etc/shadow 里面将此账号的口令相关参数填入,但是尚未有口令.
在 /etc/group 里面加入一个与账号名称一模一样的组名.
在 /home 底下创建一个与账号同名的目录作为用户家目录,且权限为700.
那么我们在创建默认用户的时候也会参考一些配置文件,来完成默认参数的配置,现在我们可以使用下面的命令来直接获取默认配置参数.
[root@localhost ~]# useradd -D |
这个数据其实是由/etc/default/useradd参数读取出来的,你可以自行用VIM去观察该文件的内容,搭配上头刚刚谈过的运行结果,上面这些配置项目所造成的行为分别是:
[root@localhost ~]# vim /etc/default/useradd |
[root@localhost ~]# vim /etc/login.defs |
现在你知道啦,使用 useradd 这支程序在创建 Linux 上的账号时,至少会参考:
/etc/default/useradd
/etc/login.defs
/etc/skel/*
这些文件,不过最重要的其实是创建 /etc/passwd,/etc/shadow,/etc/group,/etc/gshadow还有用户家目录就是了~所以,如果你了解整个系统运行的状态,也是可以手动直接修改这几个文件就是了.
passwd 设置密码
passwd命令用于设置用户的认证信息,包括用户密码、密码过期时间等,系统管理者则能用它管理系统用户的密码,只有管理者可以指定用户名称,一般用户只能变更自己的密码,其参数我们会在下面进行说明.
[root@localhost ~]# passwd --help |
实例1:使用 echo |passwd --stdin
参数非交互设置密码.
[root@localhost ~]# echo "lyshark" |passwd --stdin lyshark |
实例2:使用 passwd
参数修改lyshark用户的密码.
[root@localhost ~]# passwd lyshark |
root果然是最伟大的人物,当我们要给予用户口令时,通过root来配置即可,root可以配置各式各样的口令,系统几乎一定会接受,所以如同上面的范例,明明输入的口令太短了,但是系统依旧可接受123123这样的口令配置.
usermod 管理用户
usermod命令用于修改用户的基本信息,usermod命令不允许你改变正在线上的使用者帐号名称,当usermod命令用来改变userid,必须确认这名user没在电脑上执行任何程序,你需手动更改使用者的crontab,也需手动更改使用者的at工作,采用NIS server须在server上更动相关的NIS设定,其参数我们会在下面进行说明.
[root@localhost ~]# usermod --help |
如果你仔细的比对,会发现 usermod 的选项与 useradd 非常类似,这是因为 usermod 也是用来微调 useradd 添加的使用者参数嘛,不过 usermod 还是有新增的选项,那就是 -L 与 -U,不过这两个选项其实与 passwd 的 -l,-u 是相同的.
实例1:使用 usermod -m -d /home/hello wang
参数将原wang家目录修改成hello.
[root@localhost home]# ls |
实例2:使用 usermod -s /bin/bash
参数修改lyshark账户的默认shell.
[root@localhost ~]# usermod -s /bin/bash lyshark |
userdel 删除用户
userdel命令用于删除给定的用户,以及与用户相关的文件,若不加选项,则仅删除用户帐号,而不删除相关文件,其参数我们会在下面进行说明.
[root@localhost ~]# userdel --help |
这个功能就太简单了,目的在删除用户的相关数据,而用户的数据有:
用户账号/口令相关参数:/etc/passwd, /etc/shadow
使用者群组相关参数:/etc/group, /etc/gshadow
用户个人文件数据: /home/username, /var/spool/mail/username..
这个命令下达的时候要小心了,通常我们要移除一个账号的时候,你可以手动的将 /etc/passwd 与 /etc/shadow 里头的该账号取消即可,一般而言,如果该账号只是『暂时不激活』的话,那么将 /etc/shadow 里头账号失效日期 (第八字段) 配置为 0 就可以让该账号无法使用,但是所有跟该账号相关的数据都会留下来,使用userdel的时候通常是『你真的确定不要让该用户在主机上面使用任何数据了』
chage 查询参数
chage命令是用来修改帐号和密码的有效期限,其参数我们会在下面进行说明.
[root@localhost ~]# chage --help |
实例1:使用 chage -d 0 lyshark
强制用户下次登陆修改密码.
[root@localhost ~]# chage -l lyshark |
Linux 属组管理命令
了解了账号的新增、删除、更动与查询后,再来我们可以聊一聊群组的相关内容了,基本上,群组的内容都与这两个文件有关:/etc/group,/etc/gshadow,群组的内容其实很简单,都是上面两个文件的新增、修改与移除而已,不过如果再加上有效群组的概念,那么gpasswd则不可不知呢.
groupadd 添加属组
groupadd命令用于创建一个新的工作组,新工作组的信息将被添加到系统文件中,其参数我们会在下面进行说明.
[root@localhost ~]# groupadd --help |
groupmod 修改属组
groupmod命令更改群组识别码或名称,需要更改群组的识别码或名称时,可用groupmod指令来完成这项工作,其参数我们会在下面进行说明.
[root@localhost ~]# groupmod --help |
groupdel 删除属组
groupdel命令用于删除指定的工作组,本命令要修改的系统文件包括/ect/group和/ect/gshadow,若该群组中仍包括某些用户,则必须先删除这些用户后,方能删除群组,其参数我们会在下面进行说明.
[root@localhost ~]# groupdel --help |
gpasswd 添加成员
gpasswd命令是Linux下工作组文件/etc/group和/etc/gshadow管理工具,其参数我们会在下面进行说明.
[root@localhost ~]# gpasswd --help |
实例1:使用 gpasswd -a
添加lyshark用户到root组.
[root@localhost ~]# gpasswd -a lyshark root |
实例2:使用 gpasswd -d
从lyshark组中删除root.
[root@localhost ~]# gpasswd -d lyshark root |
实例3:使用 gpasswd -M
批量将用户 a1,a2,a3,a4 添加到test组.
[root@localhost ~]# useradd a1 |
Linux 用户查询命令
谈了这么多的账号问题,总是该要谈一谈,那么如何针对系统上面的用户进行查询吧?想几个状态,如果你在Linux上面操作时,刚好有其他的用户也登陆主机,你想要跟他对谈,该如何是好,你想要知道某个账号的相关信息,该如何查阅,下面我们就来看一看具体的查询技巧吧.
su 切换身份命令
su命令用于切换当前用户身份到其他用户身份,变更时须输入所要变更的用户帐号与密码,其参数我们会在下面进行说明.
[root@localhost ~]# su --help |
实例1:使用 su -c
执行指令后自动退出.
[root@localhost ~]# su -c id lyshark |
id 查询用户信息
id命令可以显示真实有效的用户ID(UID)和组ID(GID),UID 是对一个用户的单一身份标识,组ID(GID)则对应多个UID,id命令已经默认预装在大多数Linux系统中,要使用它,只需要在你的控制台输入id,其参数我们会在下面进行说明.
[root@localhost ~]# id --help |
实例1:使用 id
命令查询指定用户.
[root@localhost ~]# id lyshark |
w 显示登陆用户列表
w命令用于显示已经登陆系统的用户列表,并显示用户正在执行的指令,执行这个命令可得知目前登入系统的用户有那些人,以及他们正在执行的程序,单独执行w命令会显示所有的用户,您也可指定用户名称,仅显示某位用户的相关信息,其参数我们会在下面进行说明.
[root@localhost ~]# w --help |
实例1:使用 w
命令查看系统正在登陆的用户.
[root@localhost ~]# w |
实例2:使用 w -h lyshark
命令查看lyshark用户的登陆情况.
[root@localhost ~]# w -h lyshark |
who 显示登录系统信息
who命令是显示目前登录系统的用户信息,执行who命令可得知目前有那些用户登入系统,单独执行who命令会列出登入帐号,使用的终端机,登入时间以及从何处登入或正在使用哪个显示器,其参数我们会在下面进行说明.
[root@localhost ~]# who --help |
实例1:使用 who -q
命令查看系统登录用户总人数.
[root@localhost ~]# who -q |
last 显示用户最近登录信息
last命令用于显示用户最近登录信息,单独执行last命令,它会读取/var/log/wtmp的文件,并把该给文件的内容记录的登入系统的用户名单全部显示出来,其参数我们会在下面进行说明.
[root@localhost ~]# last --help |
实例1:使用 last -f /var/log/wtmp
指定一个读取文件,来打印.
[root@localhost ~]# last -f /var/log/wtmp |
实例2:使用 last -n 4
命令显示前4行数据.
[root@localhost ~]# last -n 4 |
lastlog 显示最后登陆信息
lastlog命令用于显示系统中所有用户最近一次登录信息.
lastlog文件在每次有用户登录时被查询,可以使用lastlog命令检查某特定用户上次登录的时间,并格式化输出上次登录日志/var/log/lastlog的内容,它根据UID排序显示登录名、端口号(tty)和上次登录时间,如果一个用户从未登录过,lastlog显示 Never logged,注意需要以root身份运行该命令,其参数我们会在下面进行说明.
[root@localhost ~]# lastlog --help |
实例1:使用 lastlog -u root
查询root的最后登录日期.
[root@localhost ~]# lastlog -u root |
Linux 用户对话命令
write 在线发送提示
write命令用于向指定登录用户终端上发送信息,通过write命令可传递信息给另一位登入系统的用户,当输入完毕后,键入EOF表示信息结束,write命令就会将信息传给对方,如果接收信息的用户不只登入本地主机一次,你可以指定接收信息的终端机编号.
实例1:使用 write
给lyshark用户发送消息.
[root@localhost ~]# echo "hello lyshark" | write lyshark |
实例2:使用 write
给lyshark用户无线发送乱码.
while true |
注意:若对方设定mesg n 则此时信息将无法传给对方.
wall 给所有人通知
wall命令用于向系统当前所有打开的终端上输出信息,通过wall命令可将信息发送给每位同意接收公众信息的终端机用户,若不给予其信息内容,则wall命令会从标准输入设备读取数据,然后再把所得到的数据传送给所有终端机用户.
实例1:使用 wall
给全部用户发送消息.
[root@localhost ~]# wall hello linux admin |
mail 发送邮件
mail命令是命令行的电子邮件发送和接收工具,操作的界面不像elm或pine那么容易使用,但功能非常完整,其参数我们会在下面进行说明.
[root@localhost ~]# yum install -y mailx |
实例1:使用 mail
使用管道进行邮件发送.
[root@localhost ~]# echo "hello,this is the content of mail." |mail -s "by root" lyshark |
实例2:使用 mail
使用文件进行邮件发送.
[root@localhost ~]# mail -s "by root" admin@mkdirs.com < mail.txt |