用户和组

      操作系统都有用户和组,windows,linux等等,用户和组用来做什么呢?

      用户,是我们进入系统时的凭证,不是每一个人想进就进的。你想吧,如果操作系统没有用户就能登录进系统,那这就带来了许许多多的安全隐患了。而组则是为了方便管理用户的一个组容器。

      那下面我们就来说说创建用户和组的命令。


useradd:创建用户

useradd命令用于Linux中创建的新的系统用户。useradd可用来建立用户帐号。帐号建好之后,再用passwd设定帐号的密码.而可用userdel删除帐号。使用useradd指令所建立的帐号,实际上是保存在/etc/passwd文本文件中。而密码则是放在/etc/shadow文件中。                                             

其实当我们创建一个用户时系统默认更改了/etc/passwd  、/etc/shadow、/etc/group、 /etc/ gsh adow这四个主要的文件,实则还有其他一些不太重要的文件,比如邮箱等等。就不一一说了。           


用法:useradd [options]  LOGINname

    选项options:

-M:不创建家目录
    #useradd -M user1  
    //创建用户时不创建用户的家目录
    
-u:创建用户并指定其UID
    #useradd -u 1001 user1
    //如果不指定UID系统会默认给用户指定一个已有的普通用户UID最大的然后+1,赋给user1
    
-g:创建用户并指定其基本组(基本组只能指定一个)
    #useradd -g group1 user1
    //注意:基本组必须事先存在,才能指定用户的基本组
    
-s:创建用户并指定其shell
    #useradd -s /bin/bash  user1
    //shell必须为当前系统上可用的shell,查看/etc/shells即可看到系统当前可用shell
    
-c:创建用户并指定其注释信息
    #useradd -c  “this is new user ” user1
    //注释信息用finger +username 即可查看用户的基本信息
    
-d:创建用户并指定其家目录
    #useradd -d /home/users user1
//,如果指定的家目录不存在,则不会创建。如果没有手动指定家目录系统会自动在/home/中创建与用户名相同目录作为家目录。 系统默认给用户创建家目录实则是在/etc/skel/中复制家目录的模板给用户。

-r:创建系统用户
    #useradd -r system1
    //创建之后此用户的UID即为1~499或者1~999之间,这取决与你是centos6还是7版本。系统用户一般是不用来登录的,只是用在系统自行用系统用户来运行某些进程所使用。
    
-G:创建用户并指定其附加组(附加组可以多个)
                #useradd -G gruop1,group2
                //注意:指定用户附加组时其必须事先存在,才能完成指定。指定多个附加组时用逗号 “ ,”隔开


若我们什么选项都没有指定,直接使用useradd username创建一个用户,系统会默认指定上述所有选项的信息。那么他们是依照什么来创建的呢?请往下看。

注意:如果我们使用useradd直接创建系统用户时,系统用户是没有家目录的,shell类型也为/bin/nologin不可登录类型。

- D:显示创建用户是的默认配置
#useradd -D -s /bin/csh 
 这样可以更改创建用户时默认shell,但只不过是临时的。
useradd -D  调用了/etc/default/useradd里面定义了创建用户是的默认信息
        [root@localhost home]# cat /etc/default/useradd 
        # useradd defaults file
        GROUP=100
        HOME=/home
        INACTIVE=-1
        EXPIRE=
        SHELL=/bin/bash
        SKEL=/etc/skel
        CREATE_MAIL_SPOOL=yes
        //对比一下吧
        [root@localhost home]# useradd -D
        GROUP=100
        HOME=/home
        INACTIVE=-1
        EXPIRE=
        SHELL=/bin/bash
        SKEL=/etc/skel
        CREATE_MAIL_SPOOL=yes


当我们创建用户是的默认配置的配置文件有两个:

第一:/etc/default/useradd

//此为创建用户是的默认配置信息文件,更改此文件的配置信息在创建是就依据这个配置文件来指定默认配置。

第二:/etc/login.defs

//此文件为用户创建时的默认权限、密码策略等设置



系统中,还有一个命令也是添加用户的,就是adduser,他实则是一个软链接文件,指向的实际文件地址还是useradd,所以使用它跟useradd是一样的

[root@localhost home]# ls -l `which adduser`
lrwxrwxrwx. 1 root root 7 Jul 25 09:01 /usr/sbin/adduser -> useradd
[root@localhost home]#


在生活中,我们想要一次创建很多用户,如果一个一个的useradd 加上用户名的话感觉有点low,所以我们来试一试高大上的吧!


Step1:如何同时创建多个用户?首先,我们创建一个文本文件,在里面填写需要添加的用户信息。注意:格式必须和/etc/passwd 文件中的格式一致。下面就是我们要添加的用户,然后保存并退出。

[root@localhost home]# vim passwd.txt
user1:x:2001:2001:user1:/home/user1:/bin/bash
user2:x:2002:2002:user2:/home/user2:/bin/bash
user3:x:2003:2003:user3:/home/user3:/bin/bash
user4:x:2004:2004:user4:/home/user4:/bin/bash


Step2然后执行newusers passwd.txt;执行之后用getent查看一下/etc/passwd文件中有没有关于我们创建的用户信息,(/etc/passwd、/etc/shadow、/etc/group、/etc/gshadow)这几个文件系统都已经默认创建好了。但是发现用户的家目录没有文件。所以这就得自己复制了。

[root@localhost home]# newusers passwd.txt
[root@localhost home]# getent passwd user1      //可以更换用户查询
user1:x:2001:2001:user1:/home/user1:/bin/bash


Step3:在/etc/skel/中拷贝家目录文件到我们创建的用户家目录中。当然,可以批量创建用户,必然也可以批量更改用户密码。

[root@localhost skel]# cp -r /etc/skel/. /home/user1
[root@localhost skel]# cp -r /etc/skel/. /home/user2
[root@localhost skel]# cp -r /etc/skel/. /home/user3
[root@localhost skel]# cp -r /etc/skel/. /home/user4
[root@localhost skel]# ls /home/user4
[root@localhost skel]# ls -a
.  ..  .bash_logout  .bash_profile  .bashrc  .gnome2  .mozilla


Step4:批量更改我们刚创建的用户密码,文件格式为“username:passwd”。这样我们这个批量创建用户和批量更改密码也就完成了。其实也没多高大上。

[root@localhost /]# vi pass.txt
[root@localhost /]# cat pass.txt
user1:centos
user2:centos
user3:centos
user4:centos
[root@localhost /]# cat pass.txt | chpasswd

//这里使用管道从定向,将文件中的数据传送给chpasswd命令,然后再由chpasswd命令将数据添加到shadow文件中。


上面,我们用到了两个命令,分别是newusers和chpasswd,简单分析,newusers应该就是”new users“  翻译为“新的用户,而且还为复数,所以加上s ,另一个你应该知道了吧。 这个分析不标准,仅供参考;下面我们就来说说这两个命令的含义,以及复制家目录时的注意事项。

newusers: 用于批处理的方式一次创建多个命令。

chpasswd: 批量更新用户口令的工具,是把一个文件内容重新定向添加到/etc/shadow中。

使用newusers和chpasswd批量创建时,必须事先把需要创建的用户信息按照特定格式来创建好。其中,newusers批量添加用户则需要按照/etc/passwd中的内容格式创建。而chpasswd批量更改用户密码则需要根据/etc/shadow中的内容格式来创建。至于为什么需要按照这两个文件的格式来创建,因为一个是创建用户,而用户的信息是保存到/etc/passwd中的。而用户密码则是在/etc/shad ow中的。So,That's it。


这里有个技巧,聪明的人应该能想到,当我们创建用户或更改用户密码时,写在文件中的数据只是为了能让后面的命令调用执行,那要是使用这种办法创建一个,则不需要文件了。

        echo ’user1:redhat‘ | chpasswd   //这就相当于更改用户的密码了,是不是跟写在文件中一样呢?现在知道写在文件中的初衷是干什么了吧?!


上面我们复制了/etc/skel/中的数据给用户的家目录,有几种方法。

    1)进入skel目录中在执行复制命令

  cp -r `ls -A` /home/user100
 //其中使用到了命令替换,将ls -A 显示出来的结果被cp调用,然后递归复制其文件到用户的家目录中。


2.复制skel下的以点开头然后中间为非点,后面接任何内容的文件到用户家目录中。

    cp -r  /etc/skel/.[^.]*  /home/user100


3.这是最好的一种,直接复制/etc/skel/当前目录的所有文件到用户家目录中。

cp -r /etc/skel/. /home/user100

结论:复制目录下的文件时,不能使用(如:cp -r /etc/skel/*)此类的方法,因为这样复制的不单是当前目录中的文件,而是连上一层目录的所有文件都給复制过去了。我们知道,每个目录中都有两个特殊的文件,即" .. " 和 “ . ” ,他们代表什么意思呢?一个表示上一层目录,另一个表示当前目录,如果我们使用(如:cp -r /etc/skel/*)这样不就两个都包括了?所以我们上面的第三种方法即为复制/etc/skel/的当前目录下的所有文件,因为 “ . ” 表示为当前目录。懂了吗?


学完用户创建之后现在来看一下创建完用户之后又怎么修改用户。修改用户即为当我们在使用环境中根据自己特定的需求来更改属性。这个任务则一般交给usermod来处理。


usermod:用户属性更改

usermod命令用于修改用户的基本信息。usermod命令不能更改正在线上的用户。

用法:usermod [options] LOGINname

常用选项:

-u:更改用户UID
    #usermod -u 1001 user1
-g:更改用户基本组(基本组只能指定一个)
    #usermod -g group1 user1
    //注意:基本组必须已存在,才能指定用户的基本组
-s:更改用户其shell
    #usermod -s /bin/bash  user1
    //shell必须为当前系统上可用的shell,查看/etc/shells即可看到系统当前可用shell
-c:更改用户注释信息
    #usermod -c  “this is new user ” user1
    //注释信息用finger +username 即可查看用户的基本信息
-d:创建用户其家目录
    #usermod -d /home/users user1
    //用户原有的文件不会被转移至新位置,必须跟上-m选项才能复制用户原有的家目录文件到新家目录中
-m:用于将用户原有的家目录移至新的家目录,只能配合-d使用
    #usermod -dm /new/home user2
-G:更改用户其附加组(附加组可以多个,用逗号 “ ,”隔开)
    #usermod -G group1,group2
    //注意:用户原有的附加组将会被替换,如不想被替换到,则使用-a选项,表示为追加用的附加组
- l:更改用户名
    #usermod -l "newname"  user1
    //将user1用户名更改为双引号“ newname” 内的内容 
-L:(lock)锁定用户密码
    #usermod -L  user1
    //锁定之后就不能登录,当然,有锁就有钥匙。
-U:(unlock)解锁
    #usermod -U user1

当然,有添加更改就一定有删除,没有为什么......


userdel:删除指定用户

      用于删除给定的用户,以及与用户相关的文件。如果不加选项,则仅删除用户帐号,而不删除相关文件,如家目录。

   选项:- r      //删除用户时也删除用户的家目录。



   用户组使用技巧:

清空用户的附加组

#usermod -G  " " username

//这表示使用-G添加用户的附加组时,不指定组名,则不就表示用空覆盖原有的附加组,因为我们这里没有使用-a选项,-a选项不是覆盖,而是追加,所以这样清空也是一个技巧。



结论:用户修改(usermod)大多数常用选项都和用户添加(useradd)选项一样。只不过一个用于添加,一个用于修改;删除则更为简单,就一个常用选项为 -r ,则删除用户也删除家目录,记下这句话有助于你理解他们的作用,以及帮助记忆。                                                                                 



上面我们创建用户时,每个用户都有id号,什么UID,GID,用他们来干什么呢?对我们有没有用呢?

操作系统中,文件用inode节点号识别,那么用户呢?用户则是用id号来表示的,系统只能通过ID号来识别具体的用户,具体叫什么名字只不过是为了人类记忆罢了,其中linux所有发行版中权限最大的root账户的ID为0,其余的都为普通账号,系统中uID和gID都是从0~65536,但其中使用到的一般为0~60000,uID和gID的 0 都是给超级管理员root所使用的,其余为系统用户和普通登录用户所使用。

id命令可以显示真实有效的用户ID(UID)和组ID(GID)。UID 是对一个用户的单一身份标识。其中一个组ID(GID)中可以有多个UID,因为组就是用来存放用户的。


id:显示用户的ID号

不带选项输入id会显示当前用户的UID、GID以及附加组GID。

选项:  

-u: UID
    #id -u  则会显示当前用户的UID号,如果后面加上指定的用户名则会显示指定用户的UID。
    #id -u USERNAME 
-g: 基本组ID
    #id -g  则会显示当前用户的GID号,如果后面加上指定的用户名则会显示指定用户的GID。
    #id -g USERNAME 
-G: 显示用户所属的所有组ID
    #id -G  则会显示当前用户的所属的所有GID号,如果后面加上指定的用户名则会显示指定用户的所属的所有GID号。
    #id -G USERNAME 
-n:显示对应的ID的名称
    #id -un 则会显示当前用户的UID名称,如果后面加上指定的用户名则会显示指定用户的UID名称。
    #id -un USERNAME 
    其余的GID也是用样的操作


  结论:ID号在操作系统中是用户的组的唯一标识。组和用户的ID相同不受影响,因为他们是两个独立的类型,但组内和用户内各ID不能重复                                                                                           



当我们终端中练习测试时,难免有切换用户的时候,难道我们都要每次退出再重新登录吗?那大可不必这样。使用su命令即可完成在终端中切换当前用户的操作。


下面来说说su命令的使用方法以及注意点;


su命令用于切换当前用户身份到其他用户身份,变更时须输入所要变更的用户帐号与密码。而root用户可以切换到任意一个用户,并且不用密码,其他用户切换至任意用户则都需要


su:不用退出在终端中切换用户

切换有两种方式

    不完全切换和完全切换,又叫做非登录式切换和登录式切换。

不完全切换(非登录式切换)特点:不会读取切换的用户的相关的配置文件

完全切换(登录式切换)特点:会模拟正常登录时读取其用户的配置文件重新初始化     



1.不完全切换,非登录式切换

#su username    //用此方法切换时,当前目录不会更改

2.完全切换有两种方法  一个为直接加 “  -  ”  ,一个为 “ -l ’ 选项

#su - username 默认切换到root
#su -l username  //用此方法切换时会回到当前用户的家目录中

        3.用指定的用户指定某命令,但不切换 

#su - root -c 'pwck'
以root的用户执行pwck命令,让用户执行完命令之后又返回当前用户


结论:各种方法切换时的效果是不一样的,这取决于我们的需求。



用户密码,是用最重要的参数,丢失密码则会失去安全性,我们在密码这方面一定要注意到几点:1.别使用自己的信息作为密码;2.密码长度一定要长;3.密码结构为字符,数字,大小写字母最为好;4.定期更改时间等。上面我们提到用户的更改都没提到密码管理或更改,尤其体现出密码的重要性,用单独的命令来管理用户密码,则是passwd命令



passwd:修改用户口令信息

用于设置用户的认证信息,包括用户密码、密码过期时间等。超级管理员可以更改每一个用户的密码,而普通用户一般则只能更改自己的密码。

注意:  (1)不加任何选项即为修改当前用户密码

(2)加选项并指定用户名更改密码

常用选项:

-l /U: 解锁或锁定用户
    #passwd -l user1   //锁定用户之后不能登录
    #passwd -U user1   //解锁用户
    
-d:清除用户密码串
    #passwd -d  user1    //运行之后用户就没有密码
    
-e  DATE:用户密码过期期限日期,快速让用户密码过期,但用户可以在下次登录前重设密码
    #passwd -e user1  //让用户密码立即过期,只有在下次登录时重设
    
-i DAYS:非活动期限:
    #passwd -i 99999 user1  //指定用户的非活动期限 直接写天数。
    
-n DAYS:密码最短使用期限
    #passwd -n 0 user1   //指定user1的密码最短使用期限为0,意为密码最少能用多少天,0为不限
    
-x DAYS:密码最长使用期限
    #passwd -x 99999 user1  //指定user1的密码最长使用期为99999,意为密码最多能使用多少天,99999为不限时间
    
-w DAYS:密码离过期几天前提醒天数
    #passwd -w 7 user1 //指定user1的密码过期7天前开始提醒用户更改密码
    
--stdin:从标准输入中读取密码来给用户设定密码  //这个常用
    #echo "centos" | passwd --stdin user1
    //将user1用户的密码设定为centos ,其中使用了管道重定向,是将前一个命令的输出当做后一个命令的输入


结论: -l 锁定用户,其原理是在shadow中密码字段加感叹号“  !” 。                                            

      如果我们新创建一个用户没有指定密码,其/etc/shadow文件中密码字段为双感叹号“ !!” ,如果此时我们使用 -u 选项解锁时,会提示其密码解锁之后为空,不让解锁,此时我们可以使用-f 强制解锁。                                                                                                                                                     



当我们使用passwd对密码更改不够完全时,可以使用chage命令更改用户密码策略


chage:更改密码策略

   chage [option]... login

-m:密码可更改的最小天数。为零时代表任何时候都可以更改密码。
-M:密码保持有效的最大天数。 
-w:用户密码到期前,提前收到警告信息的天数。 
-E:帐号到期的日期。过了这天,此帐号将不可用。 
-d:上一次更改的日期。
 
-l:例出当前用户的密码策略信息
[root@localhost /]# chage -l root
Last password change: Jul 25, 2016     //密码最近更改日期
Password expires: never//密码不过期
Password inactive: never//密码永远可用
Account expires: never//账户不过期
Minimum number of days between password change: 0
    //密码多少天之内不能更改,此为0表示任何时候都可以更改
Maximum number of days between password change: 99999
    //密码多少天之内必须更改,此为99999表示密码永久有效
Number of days of warning before password expires: 7
    //密码要过期前几天通知,默认为7天前开始通知

chage username   不加选项直接指定用户是,以默认的交互式更改用户的密码策略,其中不填信息则为默认信息 

[root@localhost /]# chage user1
Changing the aging information for user1
Enter the new value, or press ENTER for the default
Minimum Password Age [0]: 0
Maximum Password Age [99999]: 99999
Last Password Change (YYYY-MM-DD) [2016-07-25]: 2016-8-2   
Password Expiration Warning [7]: 
Password Inactive [-1]: 
Account Expiration Date (YYYY-MM-DD) [-1]:



相关与用户的相关命令差不多就说到这里了。更过关于用户的命令去google吧。

用户介绍完了之后来看看组吧,组是系统为了方便管理用户的一种机制,对组设置权限等操作之后,只在文件上针对组设定权限之后组里的成员就会继承此组权限来访问此文件,就不用一一对组进行操作了,是不是简单快捷很多?



groupadd:添加用户组

    -g:创建组指定gid
     #groupadd -g  2000 group1
        //创建组group1并给group设定组ID为2000   
    -r:创建系统组
     #groupadd -r  -g 150 group1
       //创建系统group1,并给系统组设定ID为150。注意:centos 6中系统组ID为1~499,centos 7中为1~999。




有添加也有修改

groupmod:组修改

-g:修改组ID号
-n:修改组名
     #groupmod -n “newgrp1” group1
      //修改组group1新名称为newgrp1



当然也有删除,删除就更简单了,直接跟上要删除的组即可


groupdel:删除组

#groupdel newgrp1
     //删除组newgrp1


结论:对于组的操作也挺简单的,就是GID、名称、系统组、删除这几个操作。当然组也应该能向上面我们使用的批量添加用户的方法吧?赶快试试吧。

另外也有几个对于组进行操作的命令



groupmems:查看用户的附加组

-a:添加
    #groupmems -a  user4 -g root
    //把用户user4添加到root组里
-d:删除
    #groupdel -d user4 -g root
     //把用户4从root组里移除掉
-l:查看
    groupmems -l -g GROUP
    //查看以GROUP为附加组的用户列表
 -g:组


结论:groupmems是一个简单的对组操作添加删除用户以及查看以此组为附加组的用户列表的小工具。


    还有一个对组进行操作的命令,但是这个命令可以给组设定管理员,改管理员可以对此组进行用户的添加删除操作

gpasswd 

组管理相关配置文件: /etc/group、/etc/gpasswd

用法: gpasswd [option] group

常用选项:

-a username:向组中添加用户
    [root@localhost ~]# gpasswd -a user1 magedu    //把user1添加到magedu组中
    Adding user user1 to group magedu//提示信息添加完成
-d username:从组中移除用户
    [root@localhost ~]# gpasswd -d user1 magedu    //把user1从magedu组中移除
    Removing user user1 from group magedu //提示信息完成移除
-A:设置有管理权限的用户列表
        #gpasswd -A user4 bin   
        //设定用户user4为bin组的管理员,用user4登录之后可以添加用户的bin组里,其他用户则不能添加

结论:groupmems 和 gpasswd 还是有区别的,虽然都可以添加用户和删除用户,但用法则不一样, 这必须多练习才能掌握好。


在终端中切换临时组为基本组

 newgrp命令

newgrp:临时切换指定的组为基本组,如果组设定有密码需输入密码才能完成切换,但如果组没有密码无论如何都切换不进去。因为切换组必须得有密码才能完成切换。

用法:newgrp [-] [group]

 其中:“ - ”表示如果使用之后会模拟用户登录的程序,以便初始化工作环境