开始这个话题之前应该先了解下/etc/shadow这个文件中的构造,对于列所代表的意思大体有个了解,先以ftpuser账户来介绍:后边会给出一些相应的例题来做使用说明补充(好吧我承认,这,又是一篇博客作业^_^万恶的标题党)。

ftpuser:$6$T9WUEls/$AK4hTO1bZ7MXW7VoMej8e7tVG1qqxPy5axVJAAIz4m6uuzZmoYDcQjUG2XlXx7klx/i8yJ1luZDtoKYwJAMa4.:16929:0:99999:7:5::

总共有9个字段被“:”隔开,每个字段的意义如下:

  1) ftpuser:第一个字段表示,账户名称。

  2) 一大长串:第二个字段表示经过加密的密码,没有密码是显示为"!!"号,如果是!!后跟一大长串则表示该账户已被锁定。

  3) 16929:第三个字段表示最近一次修改密码的时间,此数字是自1970年01月01日起到修改密码日期的累计天数,设置为0时,表示需要立即修改密码。

  4) 0:第四个字段是密码最短使用期限,这个是一个相对时长,从最近一次修改密码时间算起往后推多少天,如果为0时表示不设置最短使用期。

  5) 99999:第五个字段表示密码最长使用期限,也是相对于最近一次修改密码日期的天数(第三字段),默认为可以用到死~~,设置为-1时表示系统将不再检查此账户密码的有效性。

  6) 7:第六个字段表示密码到达最长使用期限前的7天,开始向用户发送密码过期警告,提示用户需要修改密码。

  7) 5:第七个字段表示密码过期后的宽限时间为5天,即为到达最长使用日期后的5天之内,每次登陆系统第一件事就是改密码,否则无法登录系统。

  8) 第八个地段表示账户失效日期:当该账户到达设置的失效日期之后,如果说密码使用时间为无限期那么只要到了设定的失效日期,这个账号也是game over了(看来用到死也是分跟谁比呀,这个字段就是“上帝”,你敢比他活的久么= ̄ω ̄=)

  9) 第九字段为系统保留字段,以备以后添加其他新的功能使用(没准就是干掉“上帝”(¬_¬) 赶紧跑)。

创建用户命令:useradd

  useradd - create a new user or update default new user information

  格式:

  (1) useradd [options] LOGIN

  (2) useradd -D

  (3) useradd -D [options]

  使用useradd不加任何选项来创建用户账号时,默认的一些创建参数是通过/etc/login.defs来定义的,比如普通用户的的ID范围是1000~60000,系统账户的ID是201~999等等,具体可以通过查看/etc/login.defs文件来了解。

  常用选项:

  -d,--home-dir HOME_DIR:指定用户家目录的创建位置,创建的用户家目录不可以指定为已经存在的目录,否则将无法将/etc/skel模板复制到指定的用户家目录中。

  -c,--comment COMMENT:创建用户是可以指定一些基本的描述信息。

  -u,--uid UID:指定用户ID。

  -s,--shell SHELL:指定用户登录shell,如果是创建一些守护进程类的用户,不允许其登录系统,则选择/sbin/nologin。

  -r,--system:加入此选项后将创建一个系统账户。

  -D,--defaults:通过useradd -D 可以查看默认的选项参数,也可以通过查看/etc/default/useradd文件达到相同的效果。如果需要修改相关默认参数,修改此文件中的内容即可。

  -g,--gid GROUP:指定用户组ID,指定的组ID必须是已经存在的,否则将指定失败。

  -G,--groups GROUP[,GROUP2,...]:指定用户附加组可以指定多个,但指定的组ID必须是已经存在才可以。

  -e,--expiredate EXPIRE_DATE:创建用户时指定其失效时间,指定日期格式为:“YYYY-MM-DD”,默认为该新建账户可以使用到死~到死!

  -f,--inactive INACTIVE:指定账户密码失效时间,设置为-1时表示永远不失效,0表示为立即失效。

  该值的设定是相对于账户密码最长使用期限来说,例如ftp用户设置的最长使用期限为2017年01月01日,此时将失效时间设置为5即为,当系统时间到达2017年01月02日时,每次登陆即会告知用户需要更改密码,否则无法进行其他操作,当到达1月7日时账户将会被锁定而无法登录。

修改用户账户命令:usermod

   usermod - modify a user account

   格式:usermod [options] LOGIN

   常用选项:

   -c COMMENT:修改账户描述信息,如果描述信息中间有空格则需要使用双引号""引起描述信息。

   -d HOME_DIR:修改用户家目录,如果指定的位置目录不存在则家目录无法创建,若想目录不存在时创建则需要同时使用-m选项来创建家目录。

注意:如果指定的家目录是已经存在的目录,则原来用户家目录中的内容将不会被复制到指定目录中去,所以建议更改家目录时尽量选择-md来创建新的目录。

     -g GROUP:修改用户的基本组,指定的组ID必须是已经存在的组ID。

     -l NEW_LOGIN:修改用户的用户名。

       -s SHELL:修改用户登录shell。

       -u UID:修改用户ID。

       -L:锁定用户,此时用户将无法登录系统。

     -U:将原先锁定的用户解锁。

修改用户密码命令:passwd

passwd - update user's authentication tokens

格式:passwd [-l] [-u] [-n mindays] [-x maxdays] [-w warndays] [-i inactivedays] [-S] [--stdin] [username]

passwd 单独使用时是修改当前用户的密码。

常用选项:

-l:锁定用户。

-u:解锁用户。

-f:让指定用户在下次登录时,强制修改密码。

-n DAYS:设置用户最短使用期限,即在指定的时间里无法修改密码。

-x DAYS:设置用户密码最长使用期限。

-w DAYS:设置用户密码过期警告期限,此天数是相对于最长使用期限来说,即如果设置警告期限为7,则当距离密码最长使用期限的前7天,每天登陆时会提示用户密码即将过期。

-i DAYS:设置用户非活动期限,也是相对于最长使用期限来说,要叫宽限期,超过最长使用期限后的指定的时间里,还可以使用原来账户密码登陆,但登陆后只能先修改密码,而无法执行其他操作。

-S:可以查看指定用户的一些简单信息

修改用户使用期限命令:chage

鉴于此命令主要是针对密码时效性,所以以下所涉及到的日期,均按/etc/shadow中的字段号称呼。

chage - change user password expiry information

格式:chage [options] LOGIN

常用选项:

-l :查看指定账户详细信息。

-d LAST_DAY:指定账户最近修改密码日期,格式为“YYYY-MM-DD”,如果设置为0则该账户下次登录时立即修改密码。第3字段

-m MIN_DAYS:修改账户最短使用期限,即在此时间段之内无法修改账户密码,相对于第3字段的时长。

-M MAX_DAYS:修改账户最长使用期限,也是相对于第3字段时长。

-W WARN_DAYS:修改账户过期前的警告时间,相对于第5字段时长。

-I INACTIVE:修改账户非活动时间,相对于第5字段时长,即到达账户最长使用期限之后,还可以在设置的非活动时间之内登录系统,但是,登录系统的第一件事情就是改密码,因为你也干不了别的,不信你试试~~!

-E EXPIRE_DATE:这个就厉害了,决定指定账户的“死亡”日期,也就是算着时间“过日子”吧,到日子就“死”╮(╯﹏╰)╭,指定格式为“YYYY-MM-DD”,设置为-1时表示取消失效时间,呐~指定账户又“复活”了!

创建用户组命令:groupadd

格式:groupadd [options] group

常用选项:

-g:指定创建用户组的组ID。

-r:使用此选项可以创建系统用户组。

删除用户组命令:groupdel

格式:groupdel [options] GROUP

删除命令比较简单直接使用groupdel 后跟要删除的组名即可。

====****我是分割线****========****我是分割线****====

1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。

使用who命令即可查看当前所有登录系统的用户,过滤重复登录的用户则使用cut命令现将用户名取出,然后使用sort命令来将重复的过滤掉,如果想记录每个用户登录的次数则可使用,uniq命令来实现。

~]# who |cut -d' ' -f1|sort -u
~]# who |cut -d' ' -f1|uniq -c  #可以记录用户登录次数

2、取出当前系统上被用户当做其默认shell最多的那个shell。

当前用户相关信息存储在/etc/passwd文件中,查看相关相关shell使用cut命令截取passwd中第七个字段,然后使用sort命令进行排序,使用uniq命令“-c”参数对其进行统计获取每个shell被使用的次数,最后再通过sort进行逆序排序后,通过head将默认shell最多的显示出来。

~]# cat /etc/passwd|cut -d: -f7|sort|uniq -c|sort -n -r|awk 'NR==1{print $NF}'

3、将/etc/passwd中的第三个字段数值最大的后10个用户的信息全部改为大写后保存至/tmp/maxuser.txt中。

sort命令可以按列来进行排序,排序完成之后使用tail命令取出数值最大的10个用户,最后使用tr命令将输出的信息转换为大写然后将转换后的内容使用重定向至/tmp/maxuser.txt文件中。

~]#cat /etc/passwd |sort -t: -k3 -n|tail -10|tee /tmp/maxuser.txt    #使用tee命令是将内容重定向至文件中的同时再向屏幕输出一份,以便观察。

4、取出当前主机IP地址,提示:对ifconfig命令的结果进行切分。

ifconfig命令是查看当前主机网络相关信息的命令,观察输出的内容不难发现IP地址在多个空格开头后跟inet的行中,中间包含了IP地址、子网掩码、广播地址。

其中获取到的IP地址还会包含了本地回环地址,可以将其使用grep 过滤掉,最后awk命令取出本机IP地址。

~]# ifconfig |grep -o 'inet .*'|tr -d "addr:"|awk '{printf "IP: %s\n",$2}'grep -v "127"    #本次测试是在centos 7系统下完成,其中tr -d 是为了兼容cenots6.7中获取到的数据会有“addr:”,所以要将其删除后显示。

方法二、目前ifconfig命令已逐渐退出历史舞台,在centos7中默认都不会安装此命令,现在推荐使用功能更强大的IP命令,在Centos6中也是支持此命令的,现在使用IP命令配合相关命令来获取本机IP地址来看看其区别。

~]# ip addr show|grep -o "inet .*"|grep -E -o "^[^/]+\>"|grep -v "127"|awk '{printf "IP: %s\n",$2}'   #相对来说更方便一点

5、显示/var目录下一级子目录或文件的总个数。

统计目录个数使用wc命令,wc命令不止可以统计行数,还可以统计字符数以及文件大小,本题是通过管道将ls命令输出的内容传给wc命令来统计个数。

~]# ls /var|wc -l

6、取出/etc/group文件中第三个字段数值最小的10个组的名字。

本题的方法与题3类似,只是取完内容之后通过cut命令获得组名。

~]# cat /etc/group |sort -t: -k3 -n|head -10|cut -d: -f1

7、将/etc/fstab和/etc/issue文件的内容合并为同一个后保存至/tmp/etc.test文件中。

通过cat命令读入两个文件,然后通过输出重定向来将内容存储在/tmp/etc.test中。

~]# cat /etc/fstab /etc/issue >/tmp.etc.test

8、请总结描述用户和组管理类命令的使用方法并完成以下练习:

总结开篇已经给出,请参照开篇描述~~

(1) 创建组distro,其GID为2016;

~]# groupadd -g 2016 distro

(2) 创建用户mandriva,其ID号为10005;基本组为distro;

~]# useradd -u 10005 -g 2016 mandriva

(3) 创建用户megeia,其ID号为1100,家目录为/home/linux;

~]# useradd -u 1100 -d /home/linux megeia

(4) 给用户mageia添加密码,密码为mageedu;

~]# echo "mageedu"|passwd --stdin mageia

(5) 删除mandriva,但保留其家目录;

~]# userdel mandriva

(6) 创建用户slackware,其ID号为2002,基本组distro,附加组peguin;

~]# groupadd peguin
~]# useradd -u 2002 -g 2016 -aG peguin slackware

(7) 修改slackware的默认shell为/bin/tcsh;

~]# usermod -s /bin/tcsh

(8) 为用户slackware新增附加组admins;

~]# groupadd -r admins
~]# usermod -aG admins slackware

(9) 为用户slackware添加密码,且要求密码最短使用期限为3天,最长为180天,警告为3天;

~]# echo "slackpwd" |passwd --stdin slackware -n 3 -x 180 -w 3

方法二修改完密码后使用chage命令进行使用日期修改

~]# chage -m 3 -M 180 -W 3 slackware

(10) 添加用户openstack,其ID号为3003,基本组为clouds,附加组为peguin和nova;

~]# groupadd clouds
~]# groupadd nova
~]# useradd -u 3003 -g clouds -G peguin,nova

(11) 添加系统用户mysql,要求其shell为/sbin/nologin;

~]# useradd -r -s /sbin/nologin mysql

(12) 使用echo用命令,非交互式为openstack添加密码;

~]# echo "openstackpwd" |passwd --stdin openstack

9、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其他用户均没有任何访问权限。

~]# cp -r /etc/skel /home/tuser1
~]# chmod -R go=--- /home/tuser1

10、显示/proc/meminfo文件中以大写或小写S开头的行,用两种方式;

~]# grep -i "s" /proc/meminfo
~]# grep "^[sS]" /proc/meminfo

11、显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户;

~]# grep -v "/sbin/nologin" /etc/passwd

12、显示/etc/passwd文件中其默认shell为bin/bash的用户;

~]# grep "bin/bash" /etc/passwd

13、找出/etc/passwd文件中的一位数或两位数;

~]# grep -E "[0-9]{1,2}" /etc/passwd

14、显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;

~]# grep -E "^#[[:space:]]+[^[:space:]].*" /etc/rc.d/rc.sysinit

15、打出netstat -tan命令执行结果以'LISTEN',后跟空白字符结尾的行;

~]# netstat -tan |grep -E "LISTEN[[:space:]]{0,}$"

16、添加用户bash,testbash,basher,nologin(此一个用户的shell为/sbin/nologin),而后找出当前系统上其用户名和默认shell相同的用户的信息;

~]# useradd bash
~]# useradd testbash
~]# useradd basher
~]# useradd -s /sbin/nologin nologin 
~]# grep -E "^([[:alnum:]]+)\>.*\1$" /etc/passwd