• Linux实战教学笔记14:用户管理初级(上)


    第十四节 用户管理初级(上)

    标签(空格分隔): Linux实战教学笔记-陈思齐

    ---更多资料点我查看

    1,账号管理

    1.1 管理用户命令汇总

    命令注释说明(特殊颜色的必须掌握)
    useradd增 同adduser命令,执行此命令可在系统中添加用户。(更改4个用户文件)
    userdel删 执行此命令可删除用户及相关用户的配置或文件(更改4个用户文件)
    passwd 执行此命令可为用户设置或修改密码。更改/etc/shadow文件
    chage 修改用户密码属性。管理/etc/shadow文件
    usermod改 修改用户信息的命令,可以通过usermod来修改登录名,用户的家目录等等
    id查 查看用户的UID,GID及所归属的用户组
    su 用户角色切换工具。su -
    sudo sudo是通过另一个用户来执行命令,su 是用来切换用户,然后通过切换到的用户来完成相应的任务,但sudo能在命令后面直接接命令执行,比如sudo ls /root,不需要root密码就可以执行只有root才能执行的相应命令或具备的目录权限;这个权限需要通过visudo命令或者直接编辑/etc/sudoers来实现
    visudo visudo配置sudo权限的编辑命令;也可以不用这个命令,直接用vi来编辑/etc/sudoers实现。但推荐用visudo来操作(会自动检查语法)
    pwcov 同步用户从/etc/passwd到/etc/shadow
    pwck pwck是校验用户配置文件/etc/passwd和/etc/shadow文件内容是否合法或完整
    pwunconv 是pwcov的立逆向操作,是从/etc/shadow和/etc/passwd创建/etc/passwd,然后会删除/etc/shadow文件
    finger 查看用户信息工具

    1.2 管理用户组命令汇总

    命令注释说明(特殊颜色标记需要掌握)
    groupadd 添加用户组
    groupdel 删除用户组
    groupmod 修改用户组信息
    gpasswd 为用户组设置密码
    groups 显示用户所属的用户组
    newgrp 更改用户所属的有效用户组

    1.3 /etc/skel目录

    /etc/skel目录是用来存放新用户环境变量文件的目录,当我们添加新用户时,这个目录下的所有文件会自动被复制到新添加的用户的家目录下:默认情况下,/etc/skel目录下的所有文件都是隐藏文件(以.点开头的文件);通过修改,添加,删除/etc/skel目录下的文件,我们可为新创建的用户提供统一的,标准的,初始化用户环境。

    下面我们就看下/etc/skel目录的内容:

    [root@chensiqi1 ~]# ls -al /etc/skel/
    total 20
    drwxr-xr-x.  2 root root 4096 Dec 23 20:25 .
    drwxr-xr-x. 78 root root 4096 Feb  4 09:13 ..
    -rw-r--r--.  1 root root   18 May 10  2016 .bash_logout
    -rw-r--r--.  1 root root  176 May 10  2016 .bash_profile
    -rw-r--r--.  1 root root  124 May 10  2016 .bashrc
    [root@chensiqi1 ~]# cd /etc/skel/
    [root@chensiqi1 skel]# touch readme
    [root@chensiqi1 skel]# ls -la
    total 20
    drwxr-xr-x.  2 root root 4096 Feb 11 02:21 .
    drwxr-xr-x. 78 root root 4096 Feb  4 09:13 ..
    -rw-r--r--.  1 root root   18 May 10  2016 .bash_logout
    -rw-r--r--.  1 root root  176 May 10  2016 .bash_profile
    -rw-r--r--.  1 root root  124 May 10  2016 .bashrc
    -rw-r--r--.  1 root root    0 Feb 11 02:21 readme
    [root@chensiqi1 skel]# useradd chensiqi2
    [root@chensiqi1 skel]# su - chensiqi2
    [chensiqi2@chensiqi1 ~]$ ls -la
    total 20
    drwx------. 2 chensiqi2 chensiqi2 4096 Feb 11 02:22 .
    drwxr-xr-x. 5 root      root      4096 Feb 11 02:22 ..
    -rw-r--r--. 1 chensiqi2 chensiqi2   18 May 10  2016 .bash_logout
    -rw-r--r--. 1 chensiqi2 chensiqi2  176 May 10  2016 .bash_profile
    -rw-r--r--. 1 chensiqi2 chensiqi2  124 May 10  2016 .bashrc
    -rw-r--r--. 1 chensiqi2 chensiqi2    0 Feb 11 02:21 readme
    
    命令说明:
    在/etc/skel/目录下创建一个文件readme,然后我们创建一个新用户,发现在用户的家目录里也默认有一个readme。因此,得出结论,/etc/skel/目录下的所有文件都会默认出现在新建用户的家目录里。

    1.4 企业面试题:请问如下登录故障的原理及解决办法?

    -bash-4.1$
    -bash-4.1$

    解答:

    [root@chensiqi1 ~]$su - chensiqi2
    [chensiqi2@chensiqi1 ~]$ rm -rf /*
    [chensiqi2@chensiqi1 ~]$ exit
    logout
    [root@chensiqi1 ~]# su - chensiqi2
    -bash-4.1$ 
    
    命令说明:普通用户强制删除了家目录里的变量文件就会出现这种问题。

    恢复:

    [chensiqi2@chensiqi1 ~]$ exit
    logout
    [root@chensiqi1 ~]# su - chensiqi2
    -bash-4.1$ cp /etc/skel/.bash* ~
    -bash-4.1$ exit
    logout
    [root@chensiqi1 ~]# su -chensiqi2
    bash: hensiqi2: command not found
    [root@chensiqi1 ~]# su - chensiqi2
    [chensiqi2@chensiqi1 ~]$ 
    
    命令说明:
    我们去把/etc/skel/目录下的变量文件复制回来就好了

    知识扩展*和.*的问题

    [root@chensiqi1 ~]# cp /etc/skel/* /tmp/
    [root@chensiqi1 ~]# ls /tmp/
    readme
    [root@chensiqi1 ~]# ls -la /tmp/
    total 12
    drwxrwxrwt.  3 root root 4096 Feb 11 02:39 .
    dr-xr-xr-x. 27 root root 4096 Feb 10 02:32 ..
    drwxrwxrwt.  2 root root 4096 Jan 11 22:07 .ICE-unix
    -rw-r--r--.  1 root root    0 Feb 11 02:39 readme
    [root@chensiqi1 ~]# ls -la /etc/skel/
    total 20
    drwxr-xr-x.  2 root root 4096 Feb 11 02:21 .
    drwxr-xr-x. 78 root root 4096 Feb 11 02:22 ..
    -rw-r--r--.  1 root root   18 May 10  2016 .bash_logout
    -rw-r--r--.  1 root root  176 May 10  2016 .bash_profile
    -rw-r--r--.  1 root root  124 May 10  2016 .bashrc
    -rw-r--r--.  1 root root    0 Feb 11 02:21 readme
    [root@chensiqi1 ~]# #cp /etc/skel/.*  
    
    命令说明:
    *不复制隐藏文件,那么在运行cp /etc/skel/.*之前,我们先看看.*里都有什么东西?
    
    [root@chensiqi1 ~]# ls /etc/skel/.*
    /etc/skel/.bash_logout  /etc/skel/.bash_profile  /etc/skel/.bashrc
    
    /etc/skel/.:
    readme
    
    /etc/skel/..:
    ConsoleKit               inputrc                       quotatab
    DIR_COLORS               iproute2                      rc
    DIR_COLORS.256color      issue                         rc.d
    DIR_COLORS.lightbgcolor  issue.bak                     rc.local
    NetworkManager           issue.net                     rc.sysinit
    X11                      issue.net.bak                 rc0.d
    abrt                     kdump-adv-conf                rc1.d
    acpi                     kdump.conf                    rc2.d
    adjtime                  krb5.conf                     rc3.d
    aliases                  latrace.conf                  rc4.d
    aliases.db               latrace.d                     rc5.d
    alsa                     ld.so.cache                   rc6.d
    东西太多以下省略....
    
    
    命令说明:
    我们可以发现,.*连etc下的东西都复制出来了,这是为什么呢?别忘了,目录下都还有些什么东西,还有.和..
    
    [root@chensiqi1 ~]# ls -la /etc/skel
    total 20
    drwxr-xr-x.  2 root root 4096 Feb 11 02:21 .
    drwxr-xr-x. 78 root root 4096 Feb 11 02:22 ..
    -rw-r--r--.  1 root root   18 May 10  2016 .bash_logout
    -rw-r--r--.  1 root root  176 May 10  2016 .bash_profile
    -rw-r--r--.  1 root root  124 May 10  2016 .bashrc
    -rw-r--r--.  1 root root    0 Feb 11 02:21 readme
    
    命令说明:
    .代表当前目录,..代表上级目录。因此.*就把上级目录的所有文件也复制了。所以我们在复制隐藏文件的时候不能用.*来代表所有。

    2,用户管理命令详解

    2.1 添加用户命令useradd

    • 添加用户的命令有useradd和adduser,这两个命令所能达到的效果是一样的。当然除了useradd和adduser命令以外,我们还能通过修改用户配置文件/etc/passwd和/etc/group及手动创建文件的办法来直接添加用户,不过这里并不推荐,这里建议大家统一使用useradd命令,本文也仅会针对useradd命令进行举例讲解。
    • 当使用useradd命令不加参数选项,后面直接跟所添加用户名时,系统首先会读取配置文件/etc/login.defs和/etc/default/useradd中所定义的参数或规则,根据设置的规则添加用户,同时会向/etc/passwd和/etc/group文件内添加新建用户和用户组记录。
    • 当然/etc/passwd和/etc/group的加密资讯文件/etc/shadows和/etc/gshadow也会同步生成记录,同时系统还会根据/etc/default/useradd文件中所配置的信息建立用户的家目录,并复制/etc/skel中的所有文件(包括隐藏的环境配置文件)到新用户的家目录中。

    useradd语法:

    [root@chensiqi ~]# man useradd #下面的内容源于此命令帮助的结果,对于部分地方做了修改
    名称:
        useradd - 账号建立或更新新用户资讯的工具
    语法:
        useradd [-c comment] [-d home_dir]
                [-e expire_date] [-f inactive_time]
                [-g initial_group] [-G group[,....]]
                [-m [-k skeleton_dir] | -M] [-s shell]
                [-u uid[-o][-n][-r] login]
        
        useradd -D  [-g default_group] [-b default_home]
                    [-f default_inactive] [-e default_expire_date]
                    [-s default_shell]
                    
    描述:
        新账号建立
        当不加-D 参数时,useradd指令使用命令列来指定新账号的设定值和使用系统上的预设值(指前文提到的/etc/login.defs和/etc/default/useradd等配置文件)。新用户账号将产生一些系统档案,如用户目录的建立,拷贝起始档案等,这些均可以利用命令列选项指定。此版本为Red Hat Linux 提供,可帮每个新加入的用户建立和用户同名的group,要达到这个目的,不能添加-n选项。

    为了方便查看,我们用表格的方式把useradd可使用的参数选项展现给大家如下所示:
    |useradd 参数选项|注释说明(特殊颜色的需要掌握)|
    |--|--|
    |-c comment|新账号password档的说明栏|
    |-d home_dir|新账号每次登入时所使用的home_dir.预设值为default_home内login名称,并当成登入时目录名称|
    |-e expire_date|账号终止日期。日期的指定格式为MM/DD/YY或者YYYY-MM-DD|
    |-f inactive_day|账号过期几日后永久停权。当值为0时账号则立刻被停权。而当值为-1时则关闭此功能,预设值-1|
    |-g initial_group|group 名称以数字来作为用户登入起始用户组(group)。用户组名须为系统现有存在的名称。用户组数字也须为现有存在的用户组,预设的用户组数字为1.|
    |-G group,[...]|定义此用户为多个不同groups的成员,每个用户组使用“,”逗号分隔。用户组名同-g选项的限制。默认值为用户的起始用户组。|
    |-m|用户目录如不存在则自动建立。|
    |-M|不建立用户家目录,优先于/etc/login.defs文件的设定。一般创虚拟用户时不建立家目录,部署服务时需要创建虚拟用户。|
    |-n|默认情况用户的用户组与用户的名称会相同。如果命令加了-n参数,就不会生成和用户同名的用户组了。|
    |-r| 此参数是用来建立系统账号。|
    |-s shell|用户登入后使用的shell名称。默认值不填写,这样系统会帮你指定预设的登入shell(根据/etc/default/useradd预设的值)。cat /etc/shells系统支持的shell|
    |-u uid|用户的ID值。这个值必须是唯一的,除非用-o选项。数字不可为负值|

    示例1:useradd -c,-u,-G,-s,-d,-m多个参数组合例子,自定义用户家目录。

    QQ20170212-133223@2x.png-205.1kB

    示例2:新建用户默认的账号终止日期

    QQ20170212-134155@2x.png-194.6kB

    示例3:添加用户时的默认shell类型/bin/bash改为/bin/sh

    [root@chensiqi1 ~]# cat /etc/shells #查看当前系统支持的shell种类 
    /bin/sh
    /bin/bash
    /sbin/nologin
    /bin/dash
    /bin/tcsh
    /bin/csh
    [root@chensiqi1 ~]# grep SHELL /etc/default/useradd #查看当前默认的shell配置
    SHELL=/bin/bash
    [root@chensiqi1 ~]# useradd -D -s /bin/sh  #修改为/bin/sh
    [root@chensiqi1 ~]# grep SHELL /etc/default/useradd #查看修改结果
    SHELL=/bin/sh #修改成功

    特别提示,这里仅更改了配置文件的默认值,仅对之后建立的新用户生效,和老用户无关。

    2.2 添加用户组命令groupadd

    前问我们讲解了添加用户的命令useradd的使用,本节我们来熟悉下添加用户组的命令groupadd,groupadd后面可指定用户组名称来建立新的用户组。

    提示:
    groupadd命令的使用非常简单,但在生产环境中使用的不多,因此,会简单应用即可。

    与groupadd命令有关的文件有:
    /etc/group :用户组相关文件
    /etc/gshadow :用户组加密相关文件

    groupadd命令语法

    [root@chensiqi ~]# man groupadd #查看groupadd命令的帮助信息
    名称:
        groupadd -建立新的用户组
    语法:
        groupadd 【-g gid [-o][-r][-f]】 groupname
    描述:
        groupadd可指定用户组名称来建立新的用户组账号。需要时可从系统种取得新用户组值。

    为了方便阅读和查看相关参数,我依然用表格的方式把groupadd参数选项展现给大家如下所示:
    |groupadd参数选项|注释说明(带特殊颜色的表示重要,需要掌握)|
    |--|--|
    |-g gid|指定用户组GID值。除非接-o参数(如:groupadd -g 1234 -o chensiqi),否则ID值必须是唯一的数字(不能负数)。如果不指定-g参数,则预设值会从500开始|
    |-r|建立系统用户组。GID值会比/etc/login.defs中定义的UID_MIN值小。|
    |-f|新增一个账户,强制覆盖一个已经存在的用户组账号|

    2.2.1 groupadd命令实例

    在生产环境中,一般增加用户组的用法都是非常简单的,比如下面的例子,添加GID为802的用户组chensiqi

    [root@chensiqi ~]# groupadd -g 802 chensiqi #未必一定要指定GID。一般需求不加也可以

    如果不需要指定用户组ID值,可以直接执行

    [root@chensiqi ~]# groupadd chensiqi

    提示:未提到的groupadd的参数,大家可以暂时忽略掉,在实际工作中用的比较少。

    2.2.2 用户密码相关命令passwd

    前文我们已经学会如何添加用户和用户组了,本节我们来学习设置或修改用户的密码。passwd命令的用户很多,但大多数用法在平时工作中都不经常使用,这里我们挑选一些生产环境工作中常用的用法加以说明。

    passwd命令介绍

    普通用户和超级用户都可以运行passwd命令,但普通用户只能更改自身的用户密码,超级用户root则可以设置或修改所有用户的密码。

    当直接执行passwd命令后面不接任何参数或用户名时,则表示修改当前登录用户的密码,请看下面的例子:

    [root@chensiqi1 ~]# passwd #root用户下直接执行passwd,后面不接任何用户表示修改root用户的密码:下面也有提示。
    Changing password for user root.
    New password:  #输入新密码 
    Retype new password:  #再次输入新密码
    passwd: all authentication tokens updated successfully. #成功修改root密码

    提示:
    普通用户只能修改自身的密码。如果想更改自身的密码,同样是直接运行passwd命令;比如当前操作系统用户是chensiqi:

    [chensiqi@chensiqi1 ~]$ passwd #普通用户也输入passwd修改密码
    Changing password for user chensiqi.
    Changing password for chensiqi.
    (current) UNIX password: #普通用户必须先输入旧密码才能更改
    New password: 
    Password unchanged #新密码不能和旧密码相同。
    New password: 
    Password unchanged
    New password: 
    

    passwd 命令参数选项

    [chensiqi@chensiqi1 ~]$ passwd --help
    Usage: passwd [OPTION...] <accountName>
      -k, --keep-tokens       keep non-expired authentication tokens
                              #保留即将过期的用户在期满后仍能使用
      -d, --delete            delete the password for the named account (root only)
                              #删除用户密码,仅能以root权限操作
      -l, --lock              lock the password for the named account (root only)
                              #锁住用户无权更改密码,仅能通过root权限操作。
      -u, --unlock            unlock the password for the named account (root only)
                              #解除锁定;
      -f, --force             force operation
                              #强制操作:仅root权限才能操作
      -x, --maximum=DAYS      maximum password lifetime (root only)
      #两次密码修正的最大天数,后面接数字:仅root权限操作
      -n, --minimum=DAYS      minimum password lifetime (root only)
      #两次密码修改的最小天数,后面接数字,仅能root权限操作
      -w, --warning=DAYS      number of days warning users receives before password expiration (root only)     #在距多少天提醒用户修改密码:仅能root权限操作
      -i, --inactive=DAYS     number of days after password expiration when an account becomes disabled(root only) #在距多少天提醒用户修改密码:仅能root全县操作
      -S, --status            report password status on the named account (root only)                 #查询用户的密码状态,仅能root用户操作。

    为了方便查看,我们用表格方式把passwd命令的常用参数选项列表显示,如下表所示:

    passwd参数注释说明(带特殊颜色的表示重要,需要掌握)
    -k --keep-tokens 保留即将过期的用户在期满后仍能使用
    -d --delete 删除用户密码,仅能以root权限操作
    -l, --lock 锁住用户无权更改密码,仅能通过root全县操作
    -u, --unlock 解除锁定
    -f, --force 强制操作:仅root权限才能操作
    -x,--maximum=DAYS 两次密码修改的最大天数,后面接数字:仅能root权限操作
    -n --minimum=DAYS 两次密码修改的最小天数,后面接数字,仅能root权限操作
    -w --warning=DAYS 在距多少天提醒用户修改密码:仅能root权限操作
    -l --inactive=DAYS 在密码过期后多少天,用户被禁掉,仅能以root操作
    -S --status 查询用户的密码状态,仅能root用户操作
    --stdin 从stdin读入密码

    2.2.3 passwd命令实例

    • 示例1:我们用-l参数来锁定chensiqi用户,使之不能修改密码,然后再用-u参数来解除锁定。
    [root@chensiqi1 ~]# passwd -S chensiqi   #锁定前chensiqi用户的状态信息
    chensiqi PS 2017-02-11 0 99999 7 -1 (Password set, SHA512 crypt.)
    [root@chensiqi1 ~]# grep chensiqi /etc/shadow #查看密码加密文件chensiqi用户信息的变化
    chensiqi:$6$pvpd8XR8$20OnOjqQNLhQMEURXxCmF9VzGMv4tA8hXo5WTQzko7DiwFVrv8wNIXY3gId0b..OrbYf/lOgBCgkxtStY4b3M.:17209:0:99999:7:::
    [root@chensiqi1 ~]# passwd -l chensiqi #锁定用户chensiqi, 使之不能更改密码。
    Locking password for user chensiqi.
    passwd: Success   #锁定成功
    [root@chensiqi1 ~]# grep chensiqi /etc/shadow
    chensiqi:!!$6$pvpd8XR8$20OnOjqQNLhQMEURXxCmF9VzGMv4tA8hXo5WTQzko7DiwFVrv8wNIXY3gId0b..OrbYf/lOgBCgkxtStY4b3M.:17209:0:99999:7:::     #密码信息前边多了两个叹号!
    [root@chensiqi1 ~]# passwd -S chensiqi  #查看用户状态
    chensiqi LK 2017-02-11 0 99999 7 -1 (Password locked.)
    [root@chensiqi1 ~]# su - chensiqi #切到chensiqi下更改密码测试
    [chensiqi@chensiqi1 ~]$ passwd
    Changing password for user chensiqi.
    Changing password for chensiqi.
    (current) UNIX password:    #输入旧密码
    passwd: Authentication token manipulation error  #失败不让修改
    [chensiqi@chensiqi1 ~]$ exit
    logout
    [root@chensiqi1 ~]# passwd -u chensiqi #通过-u参数,解除对用户chensiqi的锁定。
    Unlocking password for user chensiqi.
    passwd: Success   #接触成功
    [root@chensiqi1 ~]# passwd  -S chensiqi
    chensiqi PS 2017-02-11 0 99999 7 -1 (Password set, SHA512 crypt.)
    [root@chensiqi1 ~]# grep chensiqi /etc/shadow  #查看密码文件chensiqi用户信息
    chensiqi:$6$pvpd8XR8$20OnOjqQNLhQMEURXxCmF9VzGMv4tA8hXo5WTQzko7DiwFVrv8wNIXY3gId0b..OrbYf/lOgBCgkxtStY4b3M.:17209:0:99999:7:::   #叹号消失
    • 示例2:举一个组合参数-x-n-w-i控制密码时效的例子
    [root@chensiqi1 ~]# date +%F    #显示当前系统时间
    2017-02-16
    [root@chensiqi1 ~]# chage -l chensiqi  #查看当前账户状态
    Last password change                    : Feb 12, 2017
    Password expires                    : Apr 13, 2017   
    Password inactive                   : May 13, 2017
    Account expires                     : never      #从不
    Minimum number of days between password change      : 7   #7天后才能修改密码
    Maximum number of days between password change      : 60 #60天后必须再次修改密码
    Number of days of warning before password expires   : 10 #快过期提前10天通知用户
    • 示例3:下面要求chensiqi用户7天内不能更改密码,60天以后必须修改密码,过期前10天通知用户,过期后30天禁止用户登录
    [root@chensiqi1 ~]# passwd -n 7 -x 60 -i 30 -w 10 chensiqi
    Adjusting aging data for user chensiqi.
    passwd: Success
    #chage -m 7 -M 60 -W 10 -I 30 chensiqi 命令也可以实现同样功能,只是参数的写法不同。
    [root@chensiqi1 ~]# chage -l chensiqi  #查看修改后的结果
    Last password change                    : Feb 12, 2017 #最后一次修改密码
    Password expires                    : Apr 13, 2017  #密码过期时间
    Password inactive                   : May 13, 2017 #密码被禁用
    Account expires                     : never
    Minimum number of days between password change      : 7   #7天内禁止修改密码
    Maximum number of days between password change      : 60 #60天以后必须修改新密码
    Number of days of warning before password expires   : 10 #密码过期前10天开始提醒
    • 示例4:【必会】我们用--stdin参数实现非交互式的批量设置或修改密码
    [root@chensiqi1 ~]# useradd chensiqi2   #创建用户
    Creating mailbox file: File exists
    [root@chensiqi1 ~]# echo "123123" | passwd --stdin chensiqi2
    Changing password for user chensiqi2. #免交互输出设置chensiqi2密码
    passwd: all authentication tokens updated successfully.
    [root@chensiqi1 ~]# history -c
    #将上面历史命令清空,上面设置密码虽然不需要交互了,但是密码会以明文的方式保存在历史记录里,这点需要大家注意一下。一般批量设置密码分发给管理员后,有强制大家更改密码。

    实现批量创建用户,且批量创建用户随机密码的例子。

    #!/bin/env bash
    # -*- conding:utf-8 -*-
    # author:chensiqi
    # qq:215379068
    
    Userchars="chensiqi"    #用户字符串,就是用户名的前面部分。
    for num in `seq 3`      #seq 3 表示1-3即,用户名后缀为1,2,3来区分不同用户
    do
        useradd $Userchars$num   #创建用户的命令
        passwd=`echo $RANDOM|md5sum|cut -c3-20`     #按照随机数(RANDOM)的md5加密取3-20之间的字符做为用户密码。此处要注意,密码部分应该事先定义好变量,否则取值变化,导致密码生成错误。
        echo "$passwd"|passwd --stdin $Userchars$num    #这行就是利用--stdin无交互设置密码的参数
        echo -e "user:$userchars$num	passwd:$passwd">>/tmp/user.log    #输出创建的用户和密码到user.log文件
    done
    ---------------------------分界线
    [root@chensiqi1 ~]# cat /tmp/user.log  #查看用户的账号和密码
    user:chensiqi1  passwd:0e07e85b8ff84f04d9
    user:chensiqi2  passwd:2362c5ade9629b2782
    user:chensiqi3  passwd:7f17100a32ddf668f3
    
    #提示:有关shell编程,后面的章节会详细讲解,这里不太理解也没关系

    2.2.4 passwd特殊权限说明

    [root@chensiqi1 ~]# which passwd #查看passwd完成路径
    /usr/bin/passwd
    [root@chensiqi1 ~]ls -l /usr/bin/passwd 
    -rwsr-xr-x. 1 root root 30768 Nov 23  2015 /usr/bin/passwd #发现属主权限位带了个s(setuid位)
    [root@chensiqi1 ~]# ls -l /etc/passwd
    -rw-r--r--. 1 root root 1301 Feb 17 21:41 /etc/passwd #/etc/passwd从权限上看仅允许root用户更改。
    为什么其他用户可以更改/etc/passwd自己的密码呢?

    我们看到/usr/bin/passwd文件的属主权限里呆了s权限,这是setuid权限位,这表示允许普通用户以/usr/bin/passwd属主root的权限来执行普通用户本来无法执行的功能。比如:普通用户是没有权限修改/etc/passwd的(从上文可以看到)。因为/usr/bin/passwd命令文件已经设置了setuid权限位(也就是-rwsr-xr-x中的s),所以普通用户在执行/usr/bin/passwd命令时能够使用root用户的权限,间接的修改/etc/passwd文件,以达到修改自己口令的目的。

    总结:

    • 有关passwd命令的用法暂时就介绍这些,在实际工作中,最常用的用法就是直接使用passwd加用户名设置和修改密码,其次是加--stdin参数批量无交互设置密码,其他的参数用的很少(包括-l-u-S等),大家如果想了解更多参数,可参考man passwd或passwd --help
    • 最后提醒下同学们,在生产环境中,我们设置密码时应尽可能的复杂且无规律,但又利用用户自己记忆。比较好的密码是数字字母(包括大小写)及特殊符号的组合,并且8位以上。

    2.2.5 修改用户密码有效期限相关命令chage

    前文我们在管理用户和用户组时,曾使用过chage命令,chage命令是用来修改用户密码有效期限的。(chage - change user password expiry information),本节我们来学习这个命令。

    1)chage说明

    chage命令的用法很多,和passwd等命令功能也有不少是重复的,这里我们还是挑选一些工作中常用的用法加以说明;如果想了解更多,请执行man chage 或chage --help

    2)chage语法

    [root@chensiqi ~]# chage --help
    用法:chage [选项] 用户名

    为了方便同学们查看,我们用表格的方式把chage命令的常用参数列表显示,如下表所示:
    |chage 参数选项|注释说明(带特殊颜色的表示重要,需要掌握)|
    |--|--|
    |-d,--lastday 最近日期|将最近一次密码设置时间设为“最近日期”|
    |-E,--expiredate过期日期|将账户过期时间设为“过期日期”|
    |-h,--help|显示此帮助信息并退出|
    |-l,--inactive失效密码|在密码过期后多少天,用户被禁掉,仅能以root操作|
    |-l,--list|显示账户年龄信息|
    |-m,--mindays最小天数|将两次改变密码之间间距的最小天数设为“最小天数”|
    |-M,--maxdays最大天数|将两次改变密码之间间距的最大天数设为“最大天数”|
    |-W,-warndays警告天数|将过期警告天数设为“警告天数”|

    3)chage 实例

    示例1:chage -l 查看账户信息

    [root@chensiqi1 ~]# chage -l chensiqi
    Last password change                : Feb 12, 2017 #对应参数-d
    Password expires                    : Apr 13, 2017 
    Password inactive                   : May 13, 2017 #对应参数-I
    Account expires                     : never #对应-E参数
    Minimum number of days between password change      : 7 #对应m参数
    Maximum number of days between password change      : 60 #对应M参数
    Number of days of warning before password expires   : 10 #对应W参数

    示例2:举一个组合参数-m,-M,-W,-I控制密码时效的例子(同passwd命令示例)

    [root@chensiqi1 ~]# chage -l chensiqi
    Last password change                    : Feb 12, 2017
    Password expires                    : never #从不
    Password inactive                   : never #从不
    Account expires                     : never #从不
    Minimum number of days between password change      : 0 #随时可以改密码
    Maximum number of days between password change      : 99999 #99999天后必须修改密码
    Number of days of warning before password expires   : 7 #过期前提前7天提醒chensiqi用户

    示例3:下面求chensiqi用户7天内不能更改密码,60天后必须修改密码,过期前提前10天通知chensiqi用户,过期后30天后禁止用户登录。

    [root@chensiqi1 ~]# chage -m 7 -M 60 -W 10 -I 30 chensiqi
    [root@chensiqi1 ~]# chage -l chensiqi #查看修改后的结果
    Last password change                    : Feb 12, 2017
    Password expires                    : Apr 13, 2017
    Password inactive                   : May 13, 2017
    Account expires                     : never
    Minimum number of days between password change      : 7 #7天内禁止修改密码
    Maximum number of days between password change      : 60 #60天内必须修改新密码
    Number of days of warning before password expires   : 10 #密码过期前10天开始提醒
    提示:经过对比,我们发现修改后和前面讲解的passwd -n 7 -x 60 -W 10 -i 30 chensiqi命令修改结果一摸一样

    总结:

    在平时生产场景工作中,偶尔会用到chage的-l和-E参数,其他的参数,使用就很少了,这里不多介绍(知识是无限的,对于初学者,学会科学的取舍知识很重要)。当然,如果想了解更多,请参考man chage和chage --help。另外,有关账户实际过期的实际结论,在前文讲解useradd命令时就详细讲解过了,这里就不介绍了。

    4)有关用户密码时效

    • 根据前文的讲解,我们知道passwd和chage等均可以设置或更改指定账户密码的安全信息(有效期等),我们也可以通过/etc/login.defs配置文件或/etc/default/useradd针对所有账户全局修改。
    • 设置用户密码的时效有利有弊:优点是可以防止运维人员离职一段时间后发现用户还可以登录(也可能不是自己的用户),如果设置了账户有效期,即使用户未被清理,那么,一段时间内也会因为过期而无法登陆了,另外,在服务器数量很多的情况,更改密码是很大的工作量。所以,对于用户密码的时效功能,我们根据实际的工作需求,综合运用。在大规模的运维环境中,使用LDAP服务(微软活动目录)对linux账户统一认证,批量管理,也是不错的方法。

    2.2.6 删除用户相关命令userdel

    从userdel命令名称就可以知道,它的功能就是删除用户及用户相关的信息,与这个命令有关的文件有:

    • /etc/passwd :用户账号资料文件
    • /etc/shadow :用户账号资讯加密文件
    • /etc/group : 用户组资讯文件
    • /etc/gshadow :用户组密码资讯文件

    1)userdel 语法

    [root@chensiqi ~]# man userdel
    名称:
        userdel -删除系统用户账号及相关目录及文件
    语法:
        userdel [-r] 用户名
        userdel 用户名,用户名必须是系统已存在的
        -r 用户目录下的档案一并移除。在其他位置上的相关文件也将一一找出并删除。
    相关文件
        /etc/passwd : 用户账号资料文件
        /etc/shadow : 用户账号咨询加密文件
        /etc/group : 用户组资讯文件
    提示:使用userdel命令的结果实际上就是在更改维护以上的文件。

    2.2.7 企业场景删除用户处理方法:

    一般不能确认用户相关目录有没有重要数据就不能用-r
    删除经验:

    1. vi /etc/passwd,然后注释掉用户,观察1个月,这样出问题可以还原。相当于操作前备份。
    2. 把登录shell /bin/bash 改成 /sbin/nologin.
    3. openldap(类似活动目录)账号统一管理的,ldap库里干掉用户。所有服务器全部都没了。
      提示:只要修改和删除都要小心谨慎!

    2)userdel实例

    示例1:删除指定账户ett

    [root@chensiqi1 ~]# grep chensiqi2 /etc/passwd 
    chensiqi:x:808:808:num3 chensiqi:/chensiqi2017-02-11:/bin/bash
    chensiqi2:x:810:810::/home/chensiqi2:/bin/bash
    [root@chensiqi1 ~]# userdel chensiqi2 #删除账户,但不删除家目录
    [root@chensiqi1 ~]# ls /home  #家目录仍旧存在
    chensiqi  chensiqi1  chensiqi2  chensiqi3  mysql
    [root@chensiqi1 ~]# grep chensiqi2 /etc/passwd  #账户已经没了
    chensiqi:x:808:808:num3 chensiqi:/chensiqi2017-02-11:/bin/bash

    总结:

    • 使用“userdel 用户名”,这样的方法删除用户时,仅会删除用户本身,其家目录及相关文件并不会被删除。一般生产场景种,当无法确定被删除用户家目录是否有用或者有不规范用户已在家目录下跑了脚本或程序的时候,就不要使用“userdel -r 用户名”这样的危险命令,而直接使用”userdel 用户名“命令删除即可。
    • 当然,我们还可以直接使用vi编辑/etc/passwd,找到要处理的用户,先注释一段时间,确认真的没问题了,然后在清理其家目录,注释的作用和userdel命令删除的效果一样,就是实现了被注释的用户无法登录了(注释掉用户当前行即可),注释有类似回收站的作用,一旦发现问题,我们可以进行恢复工作。当然对于对门户上千台服务器大规模运维的情况,我们可以使用ldap等服务实现账户统一认证,批量的添加删除管理。

    示例2:userdel -r 用户名 方式删除
    如果在userdel命令后加参数-r,表示在删除该用户的同时,一并把用户的家目录及本地邮件存储的目录和文件也一同删除。因此,要谨慎使用。

    [root@chensiqi1 ~]#  grep chensiqi3 /etc/passwd  
    chensiqi3:x:811:811::/home/chensiqi3:/bin/bash
    [root@chensiqi1 ~]# ll /home/chensiqi3
    total 0
    -rw-r--r--. 1 chensiqi3 chensiqi3 0 Feb 11 02:21 readme
    [root@chensiqi1 ~]# userdel -r chensiqi3  #删除用户包含它的家目录
    userdel: /var/spool/mail/chensiqi3 not owned by chensiqi3, not removing
    [root@chensiqi1 ~]# ll /home/chensiqi3  #用户家目录已经被删除
    ls: cannot access /home/chensiqi3: No such file or directory

    总结:

    • 直接在/etc/passwd中注释或删除想要删除用户的记录的方法也是生产环境中常用的方法,但是在操作时一定要小心,/etc/passwd是非常重要的系统文件,如果不小心操作失误,就会引起很多麻烦,选择先注释而不删除用户记录在工作场景也是个明智选择,注释有类似回收站的作用,这样不但达到了目的,而且在出问题时可以进行恢复(这种操作方法并不规范,一般适合中小型公司使用)。当然,操作前备份也是必要的。操作前备份在任何场合都是一个运维人员优秀的习惯。
    • 当然对于门户网上上千台服务器以上的大规模运维中,我们可以使用ldap等服务实现账户统一认证,批量的添加删除管理用户。
    • 以上3个实例的用法,在生产环境中都有使用,请大家在使用前,多思考,操作前备份文件及数据,毕竟有关账户的操作都是很关键重要的。

    2.2.8 删除用户组相关命令groupdel

    groupdel是用来删除用户组的,要求用户组必须是已存在的。用groupdel删除用户组实际就是修改/etc/group(用户组文件)和/etc/gshadow(用户组加密文件)文件。

    语法格式:groupdel 用户组

    [root@chensiqi1 ~]# groupadd zhangsan #创建用户组
    [root@chensiqi1 ~]# grep zhangsan /etc/group  #查看文件有记录
    zhangsan:x:810:
    [root@chensiqi1 ~]# grep zhangsan /etc/gshadow #查看文件有记录
    zhangsan:!::
    [root@chensiqi1 ~]# groupdel zhangsan #删除用户组
    [root@chensiqi1 ~]# grep zhangsan /etc/group #无记录
    [root@chensiqi1 ~]# grep zhangsan /etc/gshadow #无记录

    总结:
    groupdel 比较简单,工作中是啊用的频率1非常少,大家会以上简单应用就可以了。

    2.2.9 用户信息修改相关命令usermod

    usermod命令功能十分强大,在生产场景中使用频率虽然不是很多,但还是比较重要的。它不仅能更改用户的shell类型,所归属用户组,还能改用户密码的有效期,登录名等很多用户的信息。
    与usermod命令有关的文件有:

    • /etc/passwd :用户账号资料文件
    • /etc/shadow :用户账号资讯加密文件
    • /etc/group :用户组资讯文件
    • /etc/gshadow :组密码文件

    1)usermod语法
    |usermod参数选项|注释说明(带特殊颜色的表示重要,需要掌握)|
    |--|--|
    |-c comment|增加用户账号/etc/passwd中的注解说明栏(第5栏)。这个-c参数功能也可以使用chfn命令来修改,当然也可以手工修改/etc/passwd文件来实现|
    |-d home_dir|更新用户新的家目录。如果给定-m选项,用户旧的家目录会搬到新的家目录去,如旧的家目录不存在则建个新的。|
    |-e expire_date|加上用户账号停止日期。日期格式为:MM/DD/YY|
    |-f inactive_days|账号过期几日后永久停权。当值为0时账号则立刻被停权。而当值为-1时则关闭此功能。预设值-1|
    |-g initial_group|更新用户新的起始登入用户组。用户组名需已存在。用户组ID必须参照既有的用户组。用户组ID预设值为1|
    |-G group【...】|定义用户为一堆groups的成员。每个用户组使用“,”逗号隔开。用户组名同-g选项的限制|
    |-l login_name|变更用户login时的名称为login_name.其余信息不变|
    |-s shell|指定新登入shell。如此栏留白,系统将选用系统预设shell。这个-s参数功能也可以使用chsh命令来修改。当然也可以手工修改/etc/passwd文件来实现|
    |-u uid|指定用户UID值。除非接-o参数,否则ID值必须是唯一的数字(不能是负数)|
    |-L|冻结用户的密码,使之无法登录,实际就是间接修改/etc/shadow的密码栏。在密码栏的开头加上“!”号,即表示冻结。这个冻结密码的功能和usermod -e,useradd -e,chage -E或passwd -l等命令参数都有类似的功效,那就是让用户无法正常登陆。|
    |-U|取消冻结用户的密码,使之恢复登录,实际同样是修改/etc/shadow的密码栏。在密码栏的开头取消“!”号,即表示恢复。|

    2)usermod实例

    实例1:使用不同的方法修改/etc/passwd中用户的说明栏

    [root@chensiqi1 ~]# tail -1 /etc/passwd #修改前查看一下
    chensiqi1:x:809:809::/home/chensiqi1:/bin/bash
    [root@chensiqi1 ~]# usermod -c 00chensiqi1 chensiqi1 #修改账户的注释说明信息
    [root@chensiqi1 ~]# tail -1 /etc/passwd #查看修改结果
    chensiqi1:x:809:809:00chensiqi1:/home/chensiqi1:/bin/bash
    [root@chensiqi1 ~]# chfn -f information chensiqi1  #chfn也可以修改
    Changing finger information for chensiqi1.
    Finger information changed.
    [root@chensiqi1 ~]# tail -1 /etc/passwd 
    chensiqi1:x:809:809:information:/home/chensiqi1:/bin/bash

    提示:实例1的用法,仅在这里说明用,真正工作中使用的不多,属于了解内容。

    由于有前面useradd命令的讲解基础了,这里就不过多演示了。

    2.3 用户管理命令小结

    1,和用户相关的配置文件知识点:
    /etc/passwd 账号文件及不同列内容
    /etc/shadow 账号密码文件及不同列内容
    /etc/group 组的文件及不同列内容
    /etc/gshadow 组密码文件及不同列内容
    2,用户管理命令
    useradd -u -g -G -s -M -e -c -d
    初始化用户对应的几个文件/etc/skel,/etc/default/useradd,/etc/login.defs
    userdel -r
    usermod -L -U
    chage -l(小写) -E
    passwd --stdin
    3,组管理命令
    groupadd -g

    金牌IT职业再教育培训机构,欢迎来校资源。QQ:215379068
  • 相关阅读:
    Python之转换py文件为无需依赖python环境的exe文件的方法
    Python之回调函数
    Python之静态语法检查
    Ubuntu中一次更改用户名带来的连锁反应
    Python之FTP传输
    qemu 源码调试
    Lattice Reduction (LLL) 算法C代码实现
    一道Apple公司(中国)的面试题目
    github免密码设置
    HiHo Coder字典树 TrieTree
  • 原文地址:https://www.cnblogs.com/skyhu365/p/10649844.html
Copyright © 2020-2023  润新知