回顾:

         bash       globing             IO重定向及管道

glob通配符: *,?,[],[^]

IO重定向: >   >>

                            2>   2>>

                            &>   &>>

                            >/PATH/TO/SOMEFILE 2>&1                    //&1表示引用前面的路径

                            <,   <<HereDocument:此处文档)

                            command1| comand2

                            命令: tr,  tee

                   用户的基础概念

 

用户管理基础概念:

                   用户类别:

                            管理员,普通用户(系统用户和登录用户)

                   组类别:

                            管理员组,普通用户组                //要注意这里的ID号的范围

                            基本组和附加组

                            私有组,公共组

 

                   数据库文件:

                            /etc/passwd

                                     login:password:uid:gid:comment:home:shell

 

                            /etc/shadow

                                     login:encrpted_password:最进一次修改密码的日期:密码最小有效期限:密码最大有效期限:警告时间:密码过期时间:账号失效时间:保留字

                           

                            /etc/group

                                     group:password:gid:user_list

         密码存储格式: 单向加密,并借助于salt完成

                   加密算法:

                            md5:识别号码1

                            sha1                                      2

                            sha224                        3

                            sha256                        4

                            sha384                        5

                            sha512:识别号码6

 

 

Linux用户和组管理:

 

         进程有两类,一类是自动启动的,一类是开机后通过终端启动的。

 

         类型为:安全上下文

 

                   进程以其发起者的身份运行;

                            进程对文件的访问权限,取决于发起此进程的用户的权限;

                                     举例:

                                     root身份可以查看/etc/shadow.。但是以普通管理员身份就不能查看

                                               [root@localhost ~]# cat /etc/shadow

                                               [root@localhost~]# su - dong

                                               [dong@localhost ~]$ cat /etc/shadow

                                               cat:/etc/shadow: Permission denied      //没有权限

                                               [dong@localhost~]$

系统用户:     为了能够让那后台进程或服务类进程以非管理员的身份运行,通常需要为次创                          建多个普通用户,这类用户从不登陆系统,

                   每次执行一个命令,其实就是调动了进程。

 

         groupadd命令:

                    添加组

                   mangroupadd

                   语法:

                            groupadd[options] group_name             //翻译:groupadd 选项 组名

 

                   groupadd选项:

 

                   -g  GID :          指定GID, 不指定则默认是上一个组的GID+1

                   -r         创建系统组

 

我们在Xshell上测试:

         一台主机我们打开两个终端进行连接,一个窗口执行命令,另一个窗口查看命令执行的结果,这个的做法在执行一些文件追踪显示,或者让对比时十分有效。

          例如:添加一个王用户:

                            [root@localhost~]# groupadd wang

                            在另一个伪终端上执行下面的命令:

                            [root@localhost~]# tail -f /etc/group 

                            pulse-access:x:494:

                            fuse:x:493:

                            sshd:x:74:

                            slocate:x:21:

                            stapusr:x:156:

                            stapsys:x:157:

                            stapdev:x:158:

                            tcpdump:x:72:

                            dong:x:500:

                            wang:x:501:  //这个gid我们没有指定是自动生成的。

                           

                            [root@localhost~]# tail -2 /etc/group

                            wang:x:501:

                            xiang:x:502:

                            [root@localhost~]#

         创建一个系统组:

                   [root@localhost~]# groupadd -r test

                   [root@localhost~]# tail -2 /etc/group

                   xiang:x:502:

                   test:x:492:

                   [root@localhost~]#

         创建一个指定gid号的系统组:

                   [root@localhost~]# groupadd -r -g 306 haha

                   [root@localhost~]# groupadd -r -g 308 mariadb

                   [root@localhost~]# tail -2 /etc/group

                   test:x:492:

                   haha:x:306:

                   [root@localhost~]#

 

         linux是可以允许创建GID相同的用户组的。但是不建议这样创建。

 

groupmod命令:修改组属性

        

         可以用查看man帮助,来获取groupmod的帮助信息:

                   [root@localhost~]# man groupmod

                           

         格式:groupmod [options]GROUP

                   -g      GID:修改GID;(这里如果前面不加“-o”选项,那么我们修改的GID号一定                                                          不能跟现存的某个组的GID号相同

                   -n      new_name:修改组名;(如果事先有其他组加入到这个组中了,那么这些其他                                                                 组的所属组组名也发生变化)

         演示:

                   将上面的系统组mariadb的组ID改为702

         [root@localhost~]# groupmod -g 702 mariadb

         [root@localhost~]# tail -2 /etc/group

         dong:x:500:

         mariadb:x:702:

         [root@localhost~]#

        

                   将系统组mariadb的组名改为perconaserver

                   [root@localhost~]# groupmod -n perconaservermariadb  //新名在前,原名在后

                   [root@localhost~]# tail -2 /etc/group

                   dong:x:500:

                   perconaserver:x:702:

                   [root@localhost~]#

 

groupdel命令:删除组

 

         [root@localhost~]# man groupdel

 

         格式:      groupdel [options] GROUP  //无可用选项,直接删除组即可

 

演示:

         [root@localhost~]# groupdel perconaserver

         [root@localhost~]# tail -2 /etc/group

         tcpdump:x:72:

         dong:x:500:

         [root@localhost~]#

 

 

useradd命令:创建用户

        

注意:创建用户时的诸多默认设定,的配置文件为  /etc/login.defs

 

         其实useradd也可以写成adduser,我们可以通过如下命令来验证,adduseruseradd的关系:

                   [root@localhost~]# which adduser                //查看adduser这个命令是否存在

                   /usr/sbin/adduser

                   [root@localhost~]# file `which adduser`  //file查看文件类型,反引号表示命令引用

                   /usr/sbin/adduser:symbolic link to `useradd'

                   [root@localhost~]#

        

         查看一下useraddman帮助:  man useradd

                   [root@localhost~]# man useradd

 

useradd - create a new user or updatedefault new user information(翻译:useradd这个命令是用来创建一个新用户,或者更新默认新用户的信息)

 

         语法格式:useradd[options] LOGIN (翻译: useradd [选项] 登录名)

演示:

         [root@localhost~]# useradd docker  

         [root@localhost~]# tail -1 /etc/passwd

         docker:x:501:501::/home/docker:/bin/bash   //如果不指定新用户的所属组,则默认创建                                                                                               一个与用户同名的组,作为用户的私有组

         [root@localhost~]#

         [root@localhost~]# tail -1 /etc/group    //查看创建新用户时建立的私有组,只包含一个                                                                                     用户

         docker:x:501:

         [root@localhost~]#

 

 

                   useradd的选项:

                            -u,--uid  UID:短选项-u,长选项--uid,都是指定用户的UID

                            -g,--gid  GROUP:短选项-g,长选项--gid,指定用户的基本组。注意:此组得                                                          事先存在

                            -G,--groups   GROUP1[,GROUP2,...[,GROUPN]]]:指明用户所属的附加组,多个                                                                                                                组之间用逗号分隔,组要事先存在

                            演示:

                            [root@localhost~]# tail /etc/group

                            sshd:x:74:

                            slocate:x:21:

                            stapusr:x:156:

                            stapsys:x:157:

                            stapdev:x:158:

                            tcpdump:x:72:

                            dong:x:500:

                            docker:x:501:

                            mogilefs:x:502:

                            mygrp:x:503:    //有一个mygrp组,现在他没有组成员

                            [root@localhost~]#

                            [root@localhost~]# useradd -G mygrp archlinux   //创建一个用户,附加组为                                                                                                                                          mygrp

                            [root@localhost~]# tail  /etc/group

                            slocate:x:21:

                            stapusr:x:156:

                            stapsys:x:157:

                            stapdev:x:158:

                            tcpdump:x:72:

                            dong:x:500:

                            docker:x:501:

                            mogilefs:x:502:

                            mygrp:x:503:archlinux   //mygrp有一个以此组为附加组的组成员是arclinux

                            archlinux:x:504:                 //新添加的用户的基本组

                            [root@localhost~]#

 

                            -c,--comment   COMMENT:指明注释信息

                                     演示:

                                               [root@localhost~]# useradd -c "MogileFSDFS" mogilefs

                                               [root@localhost~]# tail -1 /etc/passwd

                                               mogilefs:x:502:502:MogileFS DFS:/home/mogilefs:/bin/bash

                                               [root@localhost~]#

 

                            -d,--home-dir  HOME_DIR :以指定的路径为用户的家目录,他是通过复制                                                                                                   /etc/skel此目录并重命名实现的。指定的家目                                                         录路径如果事先存在,则不会为用户复制环境配置文件

                   演示:

                            [root@localhost~]# mkdir /tmp/mytest

                            [root@localhost~]# useradd -d /tmp/mytestmytest  //家目录路径已经存在

                            useradd:warning: the home directory already exists.(翻译:警告,此目录已经                                                                                                                                               存在)

                            Notcopying any file from skel directory into it.(翻译:不从skel目录里向其中复                                                                                                                  制任何文件)

                            [root@localhost~]#

                            [root@localhost~]# ls  -a /tmp/mytest/

                            .  ..   //没有任何文件

                            [root@localhost~]#

                            [root@localhost~]# ls  -a /etc/skel

                            . ..  .bash_logout  .bash_profile .bashrc  .gnome2  .mozilla

                            [root@localhost~]#

注意:在指定用户的家目录时,家目录的路径最好不要存在。

 

         -s,--shell  SHELL:指定用户的默认shell,可用的所有shell列表存储在 /etc/shells文件

                   演示:

                                     [root@localhost~]# cat /etc/shells

                                     /bin/sh

                                     /bin/bash

                                     /sbin/nologin    很多系统用户shell就是/sbin/nologin

                                     /bin/dash

                                     /bin/tcsh

                                     /bin/csh

                                     [root@localhost~]#

                                     [root@localhost~]# useradd -s /bin/cshkeystone

                                     [root@localhost~]# tail -1 /etc/passwd

                                     keystone:x:506:507::/home/keystone:/bin/csh

                                     [root@localhost~]#

注意:当我们指定的shell不在/etc/shells列表中,也是可以的,只是在安全检查相对严格的情况下,会出错的。

 

         -r,--system:创建系统用户;

         -m,--create-home:强制创建主目录;

         -M,--no-create-home:不为用户创建主目录;

         -f,--inactive INACTIVE:密码过期后,账户彻底禁用之前的天数。0表示立即禁用,-1                                                 示禁用这个功能。

 

 

 

 

 

 

useradd-D   显示用户创建时许多默认配置属性信息

useradd -D 选项:修改默认选项的值;

         演示:

                   [root@localhost~]# useradd -D

                   GROUP=100

                   HOME=/home                //用户创建时,尤其不是系统用户时,要不要创建家目录

                   INACTIVE=-1                 //非活动期限为禁用

                   EXPIRE=                           //过期期限为永不过期

                   SHELL=/bin/bash               //默认shell

                   SKEL=/etc/skel

                   CREATE_MAIL_SPOOL=yes   //要不要为用户创建邮件缓冲队列,yes表示每创建一个用户,会在 /var/spool/mial/目录下为用户创建一个专用的邮筒,用来接收邮件的。

                   [root@localhost~]#

 

这个怎样用呢?

 

         举例说明:

                   useradd  -D

 

[root@localhost ~]# useradd -D  //单独执行这么命令是查看我们创建用户时,默认的配置属                                                                           性信息

GROUP=100

HOME=/home

INACTIVE=-1

EXPIRE=

SHELL=/bin/bash

SKEL=/etc/skel

CREATE_MAIL_SPOOL=yes

[root@localhost ~]#

我们还可以利用useradd  -D来更改我们创建用户时的默认配置属性,比如说我们原来创建一个用户,是默认登录shell /bin/bash,当我们用命令,useradd  -D -s  /bin/csh,那么我们以后在创建用户时,默认的登录shell就是 /bin/csh

[root@localhost ~]# useradd -D -s /bin/csh

[root@localhost ~]# useradd -D

GROUP=100

HOME=/home

INACTIVE=-1

EXPIRE=

SHELL=/bin/csh

SKEL=/etc/skel

CREATE_MAIL_SPOOL=yes

[root@localhost ~]# useradd nova

[root@localhost ~]# tail -1 /etc/passwd

nova:x:507:508::/home/nova:/bin/csh    //发现默认的登录shell变成了/bin/csh

[root@localhost ~]#

 

注意:上面修改的结果保存于 /etc/default/useradd文件中

         [root@localhost~]# cat /etc/default/useradd

         #useradd defaults file

         GROUP=100

         HOME=/home

         INACTIVE=-1

         EXPIRE=

         SHELL=/bin/csh

         SKEL=/etc/skel

         CREATE_MAIL_SPOOL=yes

 

         [root@localhost~]#

 

 

usermod命令:修改用户属性

        

         [root@localhost~]# man usermod

语法:

         usermod[options] LOGIN

 

选项:

         -u,--uid  UID:修改用户的ID为此处指定的新UID

         -g,--gid  GROUP:修改用户所属的基本组;

         -G,--groups  GROUP1[,GROUP2,...[,GROUPN]]]:修改用户所属的附加组,原来的附加组                                                                                                          被覆盖

         -a,--append:与-G一同使用,用于为用户追加新的附加组;

         -c,--comment  COMMENT:修改注释信息;

         -d,--home  HOME_DIR:修改用户的家目录,用户原有的文件不会被转移至新位置;

         -m,--move-home:只能与 -d 选项一同使用,用于将原来的家目录移动为新的家目录;

         -l,--login  NEW_LOGIN:修改用户名;

         -s,--shell  SHELL:修改用户默认shell

         -L,--lock:锁定用户密码,使用户不能登录;即在用户原来的密码字符串之前添加一个                               “!”

         -U,--unlock:解锁用户密码;解锁就是将“!”删除;

         -eYYYY-MM-DD:  指明用户账号过期日期;

         -fINACTIVE:

 

 

userdel命令:删除用户

         [root@localhost~]# man userdel

语法:

                   userdel[options] LOGIN

 选项:

         -r,--remove:删除用户时,一并删除用户的家目录,默认是不删除家目录的。

 

演示:

[root@localhost ~]# tail -1 /etc/passwd

nova:x:507:508::/home/nova:/bin/csh

[root@localhost ~]# userdel nova

 [root@localhost ~]# ls /home/

archlinux docker  dong  keystone mogilefs  nova  //家目录仍然存在

[root@localhost ~]# userdel -r keystone

[root@localhost ~]# ls /home

archlinux docker  dong  mogilefs nova     //keytone家目录不存在了

[root@localhost ~]#

 

 

练习:

         1.创建用户gentooUID4001,基本组为gentoo,附加组为distroGID5000)和peguinGID5001);

         2.创建用户fedora,其注释信息为“FedoraCore”,默认shell /bin/tcsh

         3.修改gentoo用户的家目录为/var/tmp/gentoo;要求其原有文件仍能被用户访问;

         4.gentoo新增附加组netadmin

 

 

paswd命令:

 

         修改用户密码的命令

 

[root@www ~]# man passwd

 

         语法格式:

passwd [-k] [-l] [-u [-f]] [-d] [-e] [-nmindays] [-x maxdays] [-w warndays] [-i inactivedays] [-S] [--stdin] [username]

         又上的语法可以看出,passwd是可以单独使用的。

 1passwd:修改用户自己的密码;

 2passwd  USERNAME:修改指定用户的密码,但默认情况下仅root有此权限;

 

         选项:

         -l|-u:锁定或者解锁用户;

         -d:清除用户密码串;

                  演示:

                            [root@www~]# passwd -d docker   //清除docker用户的密码,其实docker                                                                                                没有密码的

                            Removingpassword for user docker.

                            passwd:Succes

         -e  DATE:过期期限,日期;

         -i  DAYS:非活动期限;即密码过期后,账号还能活动几天

         -n  DAYS:密码的最短使用期限;

         -x      DAYS:密码的最长使用期限;

         -w     DAYS:警告期限;

 

         --stdin:结合echo命令,和管道符,将密码直接付给用户,一般在脚本中这样使用

                   用法:

                            echo  "PASSWORD"  | passwd  --stdin  USERNAME

                  

                   演示:

                   [root@www~]# echo"mageedu"|passwd --stdin docker

                   Changingpassword for user docker.

                   passwd:all authentication tokens updated successfully.

                   [root@www~]#

                   [root@www~]# echo"mageedu"|passwd --stdin docker >/dev/null   //如果不想输                           出命令执行的结果提示信息,我们可以将这些提示信息输出到/dev/null

                   [root@www~]# echo $?    //用这个命令查看最近一次执行是否成功,成功为0                                                                              不成功为非0的数

                   0

                   [root@www~]#

        

 

gpasswd命令:

        

         默认给组定义密码,但是也同时可以向组中添加用户和删除用户

                   gpasswd  group:更改组账号的密码;

 

         格式:gpasswd[option] group

 

         选项[option]

                   -a  USERNAME:向组中添加用户;

                   -d USERNAME:从组中移除用户;

        

newgrp命令:临时切换指定的组为基本组;

         格式:

                   newgrp[-] [group]

                            -:会模拟用户重新登录以实现重新初始化其工作环境

 

         组密码存放在什么位置?

                   /etc/gshadow

         组账号存放在什么位置?

                   /etc/group

         给组添加密码有什么用呢?

         当我们将一个用户临时切换到某个组时,就特别有用了

 

                   通过演示来说明组加密码的作用:

         先添加一个任意组

[root@www ~]# groupadd mygrp

然后对这个新加的组改密码:

[root@www ~]# gpasswd mygrp

Changing the password for group mygrp

New Password:     //密码为123456

Re-enter new password:

[root@www ~]# cat /etc/gshadow |grep mygrp     //查看一下密码是否添加成功

mygrp:$6$YDofMRIec$AgW5fhiJdfqex2VK4fjkx.qNaNoarsZmbgdKw4DLULYWGNUPRs8gPysU14mCmzgLDPT4hwTVgt5649uVkW1RW/::archlinux

[root@www ~]#

[root@www ~]# su - archlinux   //这是我们切换到一个用户

[archlinux@www ~]$ whoami          //查看当前用户是谁

archlinux

[archlinux@www ~]$ id                     //查看用户的相关信息,我们看到他的属组两个有,其中附                                                                  加组为mygrp

uid=503(archlinux) gid=504(archlinux) groups=504(archlinux),503(mygrp)

[archlinux@www ~]$

[archlinux@www ~]$ touch test   //创建一个空文件

[archlinux@www ~]$ ll

total 0

-rw-rw-r-- 1 archlinux archlinux 0 Oct 10 16:07 test    //可以看到文件的属组为用户的基本组

[archlinux@www ~]$

[archlinux@www ~]$ newgrp mygrp  //我们将用户archlinux的基本组临时切换为mygrp

[archlinux@www ~]$

[archlinux@www ~]$ id

uid=503(archlinux) gid=503(mygrp)groups=503(mygrp),504(archlinux) //基本组已经发生变化

[archlinux@www ~]$

[archlinux@www ~]$ touch test2  //在创建一个文件,发现这个文件的基本组已经成为了                                                                                  mygrp

[archlinux@www ~]$ ll

total 0

-rw-rw-r-- 1 archlinux archlinux 0 Oct 1016:07 test

-rw-r--r-- 1 archlinux mygrp     0 Oct 10 16:14 test2

[archlinux@www ~]$

[archlinux@www ~]$ exit    //用这个命令退回到原来的状态

exit

[archlinux@www ~]$ id

uid=503(archlinux) gid=504(archlinux)groups=504(archlinux),503(mygrp)

[archlinux@www ~]$

 

上面的演示,我们发现用户archlinux本来就属于两个组 archlinuxmygrp,所以可以随意切换。

但是当一个用户不属于某个组时,将这个用户切换到这个组,我们应该怎么做?

我们接着上面演示:

[archlinux@www ~]$ exit   //普通用户退回到原来的管理员用户

logout

[root@www ~]#

[root@www ~]# su - docker

[docker@www ~]$ id     //查看用户docker的信息,看到它只属于一个组

uid=501(docker) gid=501(docker) groups=501(docker)

[docker@www ~]$

[docker@www ~]$ touch test

[docker@www ~]$ ll     //用户docker创建文件的属主属组都为用户的属组属主

total 0

-rw-rw-r-- 1 docker docker 0 Oct 10 16:23test

[docker@www ~]$ newgrp mygrp    //docker用户属于mygrp组,并且mygrp组有密码,                                                                                 这是临时切换,就需要不属于这个组的用户输入组的密                                                                          

Password:     //输入组密码123456

[docker@www ~]$ id     //查看用户docker的信息发现,其基本组变成了mygrp

uid=501(docker) gid=503(mygrp)groups=503(mygrp),501(docker)

[docker@www ~]$

[docker@www ~]$ touch test2   //再次创建文件,发现文件的属组也成了mygrp

[docker@www ~]$ ll

total 0

-rw-rw-r-- 1 docker docker 0 Oct 10 16:23test

-rw-r--r-- 1 docker mygrp 0 Oct 10 16:27 test2

[docker@www ~]$

 

所以说,给组加密码,就是为了避免其他用户,将自己的基本组变为这个组

 

chage命令:

                   用来更改用户密码的过期信息的

[docker@www ~]$ man chage

 

格式:

         chage[options]  登录名

 

id命令:显示用户真实和有效的ID

                   真实和有效是有区别的

         格式:

                      id [OPTION]... [USERNAME]

         选项:

                   -u:仅显示有效的UID

                   -g:显示用户的基本组ID

                   -G:仅显示用户所属的所有组的ID;

                   -n:显示名字而非ID;与上面的显示ID的选项一起使用

                   演示:    

                   [docker@www~]$ id -G -n archlinux

                   archlinuxmygrp

                   [docker@www~]$

 

su命令:switch user:完成用户切换

 

         登录有两种:

                   登录式切换又叫完全切换

                   非登录式切换又叫半切换

         登录式切换:会通过重新读取目标用户的配置文件来重新初始化

                   su  - USERNAME

                   su  -l USERNAME

         非登录式切换:不会读取目标用户的配置文件进行初始化

                  su USERNAME

 

注意:管理员可无需密码切换至其他任何用户

                   普通用户要切换其他任何用户都需要密码

 

选项:

         -c  'COMMAND':仅以指定用户的身份运行此处指定的命令;

         演示:

                   [root@www~]# su - docker -c 'whoami'

                   docker

                   [root@www~]# whoami

                   root

                   [root@www~]#

 

其他几个命令不怎么用了现在,了解一下就行:

                   chsh,  chfn,  finger,  whoami,  pwck, grpck

 

chsh:更改当前用户或者指定用户的shell

  单独执行chsh 或者 chshdocker

 

chfn:更改finger信息的;

 

finger这个命令需要安装在使用,安装: yuminstll finger

     man finger  :发现这个命令是查看用户信息的工具。

 

 

 

演示:

         [root@www~]# finger docker

Login: docker                            Name:

Directory: /home/docker                    Shell:/bin/bash

Never logged in.

No mail.

No Plan.

[root@www ~]#

 

pwck 检查用户的密码有什么问题的

 

grpck:检查组账号的密码有什么问题的

命令总结:

         groupadd  groupmod groupdel  useradd  usermod userdel  passwd  newgrp id  su chage