#008 我来管理用户和组

我来管理用户和组

我是root , 我怕谁~

写在开头

此篇着详细讲解了用户与组管理。学完此篇,你可以

  1. 创建用户和组
  2. 修改用户和组信息
  3. 给用户和组设置密码
  4. 查看用户信息
  5. 删除用户和组
  6. 登录用户和组

用户

开始之前

在我们开始之前,得先知道的一些东西。当我们创建了一个用户时(当然这指的是你并没有给用户任何选项,只是给了一个用户名),默认会为用户在/home目录下创建一个同名的家目录,并且在此家目录中准备好用户的个人bash配置文件。系统为什么这么聪明,能够自动为我们创建呢?这是因为系统上已经存在了这么一个模板目录:

  • /etc/skel
[root@localhost ~]ls -al /etc/skel/
总用量 24
drwxr-xr-x.  2 root root   59 525 12:28 .
drwxr-xr-x. 76 root root 8192 61 10:47 ..
-rw-r--r--.  1 root root   18 610 2014 .bash_logout
-rw-r--r--.  1 root root  193 610 2014 .bash_profile
-rw-r--r--.  1 root root  231 610 2014 .bashrc

在此目录下,就已经分配好了每个用户必须的bash配置文件。当我们创建一个用户时,系统会自动复制这个目录到/home下并将目录名更改为用户名。

系统怎么会知道将此/etc/skel目录复制到家目录并重新命名呢?在这里还有一个与用户相关的配置文件:

  • /etc/default/useradd
[root@localhost ~]cat /etc/default/useradd
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

我们可以看到,这里定义了HOME=/home,SKEL=/etc/skel,,现在你明白了吧。而且创建用户后,用户默认的shell为/bin/bash。

有两种方式可以修改创建用户时的这些默认信息:

  1. useradd命令的-D选项
  2. 直接修改/etc/default/useradd配置文件

注意:使用useradd命令的-D选项,会更新/etc/default/useradd配置文件中的内容:

[root@localhost ~]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 ~]useradd -D --base-dir=/myhome
[root@localhost ~]cat /etc/default/useradd
# useradd defaults file
GROUP=100
HOME=/myhome
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

以下是-D选项可更改的默认值

   -b, --base-dirBASE_DIR
       新用户主目录的路径前缀。如果创建新账户时,没有使用 -d 选项,用户的名称将会缀在 BASE_DIR
       的后边形成新用户的主目录名。

       这个选择在 /etc/default/useradd 中设置 HOME 选项。

   -e, --expiredateEXPIRE_DATE
       禁用此用户账户的日期。

       此选项在 /etc/default/useradd 中设置 EXPIRE 变量。

   -f, --inactiveINACTIVE
       密码过期到账户被禁用之前的天数。

       这个选项在 /etc/default/useradd 中设置 INACTIVE 变量。

   -g, --gidGROUP
       新用户初始组的组名或 ID (使用了 -N/--no-user-group 或者 /etc/login.defs 中的变量 USERGROUPS_ENAB 设置为 no
       时)。给出的组必须存在,并且数字组 ID 必须有一个已经存在的项。

       这个选项在 /etc/default/useradd 中设置 GROUP 变量。

   -s, --shellSHELL
       新用户的登录 shell 名。

       这个选项在 /etc/default/useradd 设置 SHELL 变量。

注意:

系统管理员负责将默认的用户文件放在 /etc/skel/ 目录中(或者/etc/default/useradd 中指定的任何其它目录)。这意味着,如果你想每个创建的用户都拥有某a文件,则将这个文件放在/etc/skel目录下,则创建的所有用户都将拥有这个文件

看个例子就明白啦:

[root@localhost skel]ls -al
总用量 24
drwxr-xr-x.  2 root root   59 61 11:56 .
drwxr-xr-x. 76 root root 8192 61 11:55 ..
-rw-r--r--.  1 root root   18 610 2014 .bash_logout
-rw-r--r--.  1 root root  193 610 2014 .bash_profile
-rw-r--r--.  1 root root  231 610 2014 .bashrc
[root@localhost skel]touch myfile1.txt
[root@localhost skel]mkdir -pv mydir1/mydir2
mkdir: 已创建目录 "mydir1"
mkdir: 已创建目录 "mydir1/mydir2"
[root@localhost skel]ls -al
总用量 24
drwxr-xr-x.  3 root root   90 61 11:56 .
drwxr-xr-x. 76 root root 8192 61 11:55 ..
-rw-r--r--.  1 root root   18 610 2014 .bash_logout
-rw-r--r--.  1 root root  193 610 2014 .bash_profile
-rw-r--r--.  1 root root  231 610 2014 .bashrc
drwxr-xr-x.  3 root root   19 61 11:56 mydir1
-rw-r--r--.  1 root root    0 61 11:56 myfile1.txt
[root@localhost skel]useradd gentoo
[root@localhost skel]ls -al /home/gentoo
总用量 12
drwx------. 3 gentoo gentoo  90 61 11:56 .
drwxr-xr-x. 4 root   root    31 61 11:56 ..
-rw-r--r--. 1 gentoo gentoo  18 610 2014 .bash_logout
-rw-r--r--. 1 gentoo gentoo 193 610 2014 .bash_profile
-rw-r--r--. 1 gentoo gentoo 231 610 2014 .bashrc
drwxr-xr-x. 3 gentoo gentoo  19 61 11:56 mydir1
-rw-r--r--. 1 gentoo gentoo   0 61 11:56 myfile1.txt

以上都是系统默认帮我们创建的东西,一些具体的用户信息我们都是可以通过一系列选项自己进行设定的,对于一开始用户设置好的信息我们也可以进行修改。接下来就让我们尽情的玩转用户吧! ^_^

创建用户

使用 useradd 命令创建用户

useradd [options] LOGIN

我们知道使用useradd USERNAME命令创建的用户,系统会按照/etc/default/useradd这个配置文件自动帮我们创建某些默认的值。这是因为我们在创建时并没有指定用户的具体信息。那我们可以为用户设置哪些具体的值呢?

我们先看一下保存用户信息的文件:

  • /etc/passwd
[root@localhost skel]tail /etc/passwd
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
admin:x:1000:1000:admin:/home/admin:/bin/bash
gentoo:x:1001:1001::/home/gentoo:/bin/bash

在这个文件中,每一行分别存储了每一个用户的所有信息,将用户的每个信息用 :分割为了 7 个字段:

用户名密码UIDGID备注信息家目录shell
adminx10001000admin/home/admin/bin/bash
gentoox1000110001/home/gentoo/bin/bash

注意:

这里的密码全都显示为x,并不是代表用户的密码就是x,而是为了安全和便于管理,将密码重新定义在了一个新的文件中,稍后我在介绍设置用户密码时会讲到。

具体用法:

[root@localhost ~]useradd --help
用法:useradd [选项] 登录
      useradd -D
      useradd -D [选项]

选项:
  -b, --base-dir BASE_DIR         新账户的主目录的基目录
  -c, --comment COMMENT           新账户的 GECOS 字段
  -d, --home-dir HOME_DIR         账户的主目录
  -D, --defaults                  显示或更改默认的 useradd 配置
  -e, --expiredate EXPIRE_DATE    新账户的过期日期
  -f, --inactive INACTIVE         新账户的密码不活动期
  -g, --gid GROUP                 新账户主组的名称或 ID
  -G, --groups GROUPS             新账户的附加组列表
  -h, --help                      显示此帮助信息并推出
  -k, --skel SKEL_DIR             使用此目录作为骨架目录
  -K, --key KEY=VALUE             不使用 /etc/login.defs 中的默认值
  -l, --no-log-init               不要将此用户添加到最近登录和登录失败数据库
  -m, --create-home               创建用户的主目录
  -M, --no-create-home            不创建用户的主目录
  -N, --no-user-group             不创建同名的组
  -o, --non-unique                允许使用重复的 UID 创建用户
  -p, --password PASSWORD         加密后的新账户密码
  -r, --system                    创建一个系统账户
  -R, --root CHROOT_DIR           chroot 到的目录
  -s, --shell SHELL               新账户的登录 shell
  -u, --uid UID                   新账户的用户 ID
  -U, --user-group                创建与用户同名的组
  -Z, --selinux-user SEUSER       为 SELinux 用户映射使用指定 SEUSER

注意:

linux系统上用户分为两类:管理员和普通用户。普通用户又分为系统用户和登录用户。超级管理员的uid等于0,拥有至高无上的权利。系统用户id在CentOS 6上的数值范围在1-499,而在CentOS 7上的范围是1-999。登录用户在CentOS 6上的数值范围在500-65535,在CentOS 7上的范围是1000-65535。

所以一旦指定-r选项,UID的值,如果是CentOS 6 则 0-499 ,如果是CentOS 7 则 0-999。

示例:

#1. 创建用户fedora,其ID号为1100,备注信息为:i'm fedora,家目录为/home/linux,默认shell为/sbin/nologin

[root@localhost ~]useradd -u 1100 -c "i am fedora" -d /home/linux -s /sbin/nologin fedora^C
[root@localhost ~]ls -al /home/linux/
总用量 12
drwx------. 3 fedora fedora  90 61 13:11 .
drwxr-xr-x. 5 root   root    43 61 13:11 ..
-rw-r--r--. 1 fedora fedora  18 610 2014 .bash_logout
-rw-r--r--. 1 fedora fedora 193 610 2014 .bash_profile
-rw-r--r--. 1 fedora fedora 231 610 2014 .bashrc
drwxr-xr-x. 3 fedora fedora  19 61 11:56 mydir1
-rw-r--r--. 1 fedora fedora   0 61 11:56 myfile1.txt
[root@localhost ~]tail -1 /etc/passwd
fedora:x:1100:1100:i am fedora:/home/linux:/sbin/nologin                    

#2. 创建一个系统用户debian

[root@localhost ~]useradd -r debian
[root@localhost ~]id debian
uid=998(debian) gid=997(debian) 组=997(debian)

#3. 创建一个没有家目录的用户archlinux

[root@localhost ~]useradd -M archlinux
[root@localhost ~]ls /home/
admin  gentoo  linux
[root@localhost ~]tail -1 /etc/passwd
archlinux:x:1101:1101::/home/archlinux:/bin/bash

#4. 指定一个以新的模板/etc/myskel目录为用户的家目录的用户suse

[root@localhost ~]mkdir -p /etc/myskel
[root@localhost ~]cd /etc/myskel
[root@localhost myskel]touch myfile1.txt
[root@localhost myskel]mkdir -pv mydir1/mydir2
mkdir: 已创建目录 "mydir1"
mkdir: 已创建目录 "mydir1/mydir2"
[root@localhost myskel]ls -al
总用量 12
drwxr-xr-x.  3 root root   37 61 13:30 .
drwxr-xr-x. 77 root root 8192 61 13:29 ..
drwxr-xr-x.  3 root root   19 61 13:30 mydir1
-rw-r--r--.  1 root root    0 61 13:30 myfile1.txt
[root@localhost myskel]cd -
/root
[root@localhost ~]useradd -k /etc/myskel -m suse
[root@localhost ~]ls -al /home/suse/
总用量 0
drwx------. 3 suse suse 37 61 13:31 .
drwxr-xr-x. 6 root root 54 61 13:31 ..
drwxr-xr-x. 3 suse suse 19 61 13:30 mydir1
-rw-r--r--. 1 suse suse  0 61 13:30 myfile1.txt
[root@localhost ~]tail -1 /etc/passwd
suse:x:1102:1102::/home/suse:/bin/bash

#5. 创建一个附加组为redhat的用户centos

[root@localhost ~]groupadd redhat
[root@localhost ~]useradd -G redhat centos
[root@localhost ~]id centos
uid=1103(centos) gid=1104(centos) 组=1104(centos),1103(redhat)

#6. 创建一个基本组是opensuse的用户selinux

[root@localhost ~]groupadd opensuse
[root@localhost ~]useradd -g opensuse selinux
[root@localhost ~]id selinux
uid=1104(selinux) gid=1105(opensuse) 组=1105(opensuse)

第五、第六这两个例子,给用户添加的组都得事先存在。不用着急,待会儿就会讲到组管理。 ^_^

修改用户信息

使用 usermod 命令修改用户信息

usermod [options] LOGIN

具体用法:

[root@localhost ~]usermod --help
用法:usermod [选项] 登录

选项:
  -c, --comment 注释             GECOS 字段的新值
  -d, --home HOME_DIR           用户的新主目录
  -e, --expiredate EXPIRE_DATE  设定帐户过期的日期为 EXPIRE_DATE
  -f, --inactive INACTIVE       过期 INACTIVE 天数后,设定密码为失效状态
  -g, --gid GROUP               强制使用 GROUP 为新主组
  -G, --groups GROUPS           新的附加组列表 GROUPS
  -a, --append GROUP            将用户追加至上边 -G 中提到的附加组中,
                                并不从其它组中删除此用户
  -h, --help                    显示此帮助信息并推出
  -l, --login LOGIN             新的登录名称
  -L, --lock                    锁定用户帐号
  -m, --move-home               将家目录内容移至新位置 (仅于 -d 一起使用)
  -o, --non-unique              允许使用重复的(非唯一的) UID
  -p, --password PASSWORD       将加密过的密码 (PASSWORD) 设为新密码
  -R, --root CHROOT_DIR         chroot 到的目录
  -s, --shell SHELL             该用户帐号的新登录 shell
  -u, --uid UID                 用户帐号的新 UID
  -U, --unlock                  解锁用户帐号
  -Z, --selinux-user  SEUSER    用户账户的新 SELinux 用户映射

示例:

#1. 修改用户名(用户的名称将会从 LOGIN 修改为NEW_LOGIN。不会更改别的任何东西)

[root@localhost ~]cat /etc/passwd | grep centos
centos:x:1103:1104::/home/centos:/bin/bash
[root@localhost ~]ls /home/
centos
[root@localhost ~]id centos
uid=1103(centos) gid=1104(centos) 组=1104(centos),1103(redhat)
[root@localhost ~]usermod -l newcentos centos
[root@localhost ~]cat /etc/passwd | grep centos
newcentos:x:1103:1104::/home/centos:/bin/bash
[root@localhost ~]ls /home/
centos
[root@localhost ~]id centos
id: centos: no such user
[root@localhost ~]id newcentos
uid=1103(newcentos) gid=1104(centos) 组=1104(centos),1103(redhat)

#2. 修改用户uid和gid(用户主目录之外文件的属主属组必须手动修改。)

[centos@localhost tmp]mkdir centos
[centos@localhost tmp]cd centos/
[centos@localhost centos]touch a b c d
[centos@localhost centos]cd ~
[centos@localhost ~]ls -al
total 12
drwx------. 3 centos centos  90 Jun  1 13:34 .
drwxr-xr-x. 8 root   root    81 Jun  1 14:07 ..
-rw-r--r--. 1 centos centos  18 Jun 10  2014 .bash_logout
-rw-r--r--. 1 centos centos 193 Jun 10  2014 .bash_profile
-rw-r--r--. 1 centos centos 231 Jun 10  2014 .bashrc
drwxr-xr-x. 3 centos centos  19 Jun  1 11:56 mydir1
-rw-r--r--. 1 centos centos   0 Jun  1 11:56 myfile1.txt
[centos@localhost ~]ls -al /tmp/centos/
total 4
drwxrwxr-x. 2 centos centos   38 Jun  1 14:59 .
drwxrwxrwt. 8 root   root   4096 Jun  1 14:59 ..
-rw-rw-r--. 1 centos centos    0 Jun  1 14:59 a
-rw-rw-r--. 1 centos centos    0 Jun  1 14:59 b
-rw-rw-r--. 1 centos centos    0 Jun  1 14:59 c
-rw-rw-r--. 1 centos centos    0 Jun  1 14:59 d
[centos@localhost ~]logout
[root@localhost ~]cat /etc/group | grep gentoo
gentoo:x:1001:
[root@localhost ~]usermod -u 2000 -g 1001 centos
[root@localhost ~]ls -al /home/centos/
总用量 20
drwx------. 3 centos gentoo 4096 61 15:05 .
drwxr-xr-x. 8 root   root     81 61 14:07 ..
-rw-------. 1 centos gentoo  103 61 15:05 .bash_history
-rw-r--r--. 1 centos gentoo   18 610 2014 .bash_logout
-rw-r--r--. 1 centos gentoo  193 610 2014 .bash_profile
-rw-r--r--. 1 centos gentoo  231 610 2014 .bashrc
drwxr-xr-x. 3 centos gentoo   19 61 11:56 mydir1
-rw-r--r--. 1 centos gentoo    0 61 11:56 myfile1.txt
[root@localhost ~]ls -al /tmp/centos/
总用量 4
drwxrwxr-x. 2 1103 centos   38 61 14:59 .
drwxrwxrwt. 8 root root   4096 61 14:59 ..
-rw-rw-r--. 1 1103 centos    0 61 14:59 a
-rw-rw-r--. 1 1103 centos    0 61 14:59 b
-rw-rw-r--. 1 1103 centos    0 61 14:59 c
-rw-rw-r--. 1 1103 centos    0 61 14:59 d

#3. 修改用户的家目录(只是纯粹的修改/etc/passwd配置文件中的家目录)

[root@localhost ~]ls /home/
admin  centos  gentoo  selinux  suse
[root@localhost ~]cat /etc/passwd | grep centos
centos:x:2000:1001::/home/centos:/bin/bash
[root@localhost ~]usermod -d /home/new_centos centos
[root@localhost ~]ls /home/
admin  centos  gentoo  selinux  suse
[root@localhost ~]cat /etc/passwd | grep centos
centos:x:2000:1001::/home/new_centos:/bin/bash

#4. 将当前家目录(包括原来家目录下的所有文件)移动到一个新的家目录,并删除原有家目录。(前提是新的家目录不能存在)

[root@localhost ~]ls /home/
admin  centos  gentoo  selinux  suse
[root@localhost ~]ls -al /home/centos/
总用量 0
drwx------. 2 centos gentoo 19 61 15:39 .
drwxr-xr-x. 7 root   root   69 61 15:52 ..
-rw-r--r--. 1 centos gentoo  0 61 15:38 centos

#注意:这里如果写成-dm会出错
[root@localhost ~]usermod -md /home/new_centos centos
[root@localhost ~]cat /etc/passwd | grep centos
centos:x:2000:1001::/home/new_centos:/bin/bash
[root@localhost ~]ls /home/
admin  gentoo  new_centos  selinux  suse
[root@localhost ~]ls -al /home/new_centos/
总用量 0
drwx------. 2 centos gentoo 19 61 15:39 .
drwxr-xr-x. 7 root   root   73 61 15:58 ..
-rw-r--r--. 1 centos gentoo  0 61 15:38 centos
[root@localhost ~]

#5. 修改用户centos的备注信息为i am centos,登录shell为/sbin/nologin,添加附加组debian,archlinux(添加附加组-aG)

[root@localhost ~]tail /etc/group
debian:x:997:
archlinux:x:1101:
[root@localhost ~]usermod -c "i am centos" -s /sbin/nologin -aG debian,archlinux centos
[root@localhost ~]cat /etc/passwd | grep centos
centos:x:2000:1001:i am centos:/home/new_centos:/sbin/nologin

#6. 如果只给-G选项,则表示只将-G给与的附加组作为centos的附加组,原来的附加组会被删除

[root@localhost logout]id centos
uid=2000(centos) gid=1001(gentoo) 组=1001(gentoo),997(debian),1101(archlinux),1103(redhat)
[root@localhost logout]usermod -G redhat centos
[root@localhost logout]id centos
uid=2000(centos) gid=1001(gentoo) 组=1001(gentoo),1103(redhat)

用户密码管理

使用 passwd 命令管理用户的密码

passwd [options] [username]

还记得之前/etc/passwd中第二个字段x吗?为了安全和管理密码,密码有一个专门的映射文件:

  • /etc/shadow
[root@localhost ~]tail -3 /etc/shadow
suse:!!:17683:0:99999:7:::
selinux:!!:17683:0:99999:7:::
centos:$6$ae5vJiyr$C3dd5W0hh1SWZEIusvJ19hpl.I3AZk37nKHJ30FisRS9OjDcVH55Z7qQNbvx8OG2XkLFKlnRH.QB058X6IQjh0:17683:0:99999:7:::

此文件用 :分割为 9 个字段:

字段解释
1用户名系统上有效的用户
2加密了的密码以感叹号开头的密码字段意味着密码被锁定
3上次密码更改的日期表示为自1970年1月1日以来的天数。值0具有特殊的含义,即用户在下次登录系统时应更改密码。空字段意味着功能被禁用。
4密码最短期限是用户在被允许再次更改密码之前必须等待的天数
5密码最长期限到了此最长的天数,用户必须更改密码
6密码警告期密码将要到期的天数(请参阅上面的密码最长期限),在此期间应警告用户。空字段和值0表示没有密码警告期。
7密码过期期限密码过期后的天数(请参阅上面的密码最长期限),在此期间密码仍应被接受(并且用户应在下次登录时更新密码)。
8账户到期日期账户到期日期,以1970年1月1日以来的天数表示。
9保留字段

为用户创建密码(仅root用户):

[root@localhost ~]passwd centos
更改用户 centos 的密码 。
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。

[root@localhost ~]echo "centos" | passwd --stdin centos
更改用户 centos 的密码 。
passwd:所有的身份验证令牌已经成功更新。

具体用法:

[root@localhost ~]passwd --help
用法: passwd [选项...] <帐号名称>
  -k, --keep-tokens       保持身份验证令牌不过期
  -d, --delete            删除已命名帐号的密码(只有根用户才能进行此操作)
  -l, --lock              锁定指名帐户的密码(仅限 root 用户)
  -u, --unlock            解锁指名账户的密码(仅限 root 用户)
  -e, --expire            终止指名帐户的密码(仅限 root 用户)
  -f, --force             强制执行操作
  -n, --minimum=DAYS      密码的最短有效时限(只有根用户才能进行此操作),对应/etc/shadow 第 4 字段
  -x, --maximum=DAYS      密码的最长有效时限(只有根用户才能进行此操作),对应/etc/shadow 第 5 字段
  -w, --warning=DAYS      在密码过期前多少天开始提醒用户(只有根用户才能进行此操作),对应/etc/shadow 第 6 字段
  -i, --inactive=DAYS     当密码过期后经过多少天该帐号会被禁用(只有根用户才能进行此操作),对应/etc/shadow 第 7 字段
  -S, --status            报告已命名帐号的密码状态(只有根用户才能进行此操作)
  --stdin                 从标准输入读取令牌(只有根用户才能进行此操作)

示例(仅对root用户):

#1. 清除用户密码

[root@localhost ~]cat /etc/shadow | grep centos
centos:$6$eGr760p7$kZ5Ynf8NB02W5tPmVGKWq0foUF3ezzTRNi7qK9xmBvYs6WeCcP0xel70fENH/WxmzmxcCp2Bbf5zi9MB5LCT9/:17683:0:99999:7:::
[root@localhost ~]passwd -d centos
清除用户的密码 centos。
passwd: 操作成功
[root@localhost ~]cat /etc/shadow | grep centos
centos::17683:0:99999:7:::

#2. 强制使密码过期

[root@localhost ~]passwd -e centos
正在终止用户 centos 的密码。
passwd: 操作成功
#2.1 此时重新以centos用户身份登录系统
~ ➤ ssh centos@192.168.43.242
centos@192.168.43.242 `s password:
You are required to change your password immediately (root enforced)
Last login: Fri Jun  1 19:06:04 2018 from caijun
WARNING: Your password has expired.
You must change your password now and login again!
Changing password for user centos.
Changing password for centos.
(current) UNIX password:
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
Connection to 192.168.43.242 closed.
#2.2 使用新修改的密码登录系统
~ ➤ ssh centos@192.168.43.242
centos@192.168.43.242 `s password:                    
Last login: Fri Jun  1 19:10:16 2018 from caijun
[centos@localhost ~]

#3. 设置密码最短期限(在此天数内,不能修改密码)

[root@localhost ~]cat /etc/shadow | grep centos
centos:$6$GIrl3JdQ$BoMr.I31MNjv4kDWlwL3.EZ65wU11/nW0q2vFQjwgoU8sHdrhR3gwT0SMdxk6qfcy02Nhw.1.XKVTLnkFyzSi1:17683:0:99999:7:::
[root@localhost ~]passwd -n 1 centos
调整用户密码老化数据centos。
passwd: 操作成功
[root@localhost ~]cat /etc/shadow | grep centos
centos:$6$GIrl3JdQ$BoMr.I31MNjv4kDWlwL3.EZ65wU11/nW0q2vFQjwgoU8sHdrhR3gwT0SMdxk6qfcy02Nhw.1.XKVTLnkFyzSi1:17683:1:99999:7:::
[root@localhost ~]su - centos
上一次登录:五 61 19:11:28 EDT 2018从 caijunpts/2 上
[centos@localhost ~]passwd
Changing password for user centos.
Changing password for centos.
(current) UNIX password:
You must wait longer to change your password
passwd: Authentication token manipulation error

#4. 设置密码最长期限,警告期限,过期后仍然有效期限(超过此期限必须修改密码)

[root@localhost ~]passwd -x 5 -w 6 -i 7 centos
调整用户密码老化数据centos。
passwd: 操作成功
[root@localhost ~]cat /etc/shadow | grep centos
centos:$6$u/oBRvuU$QZYwaweUFF9i6Ri8aBcsURwIjY7uEk22x.t4.Ml9DiypeHN9okysnOC5O/DoqoKe8zJPnT7mdRksrxP4Zl8eF.:17683:0:5:6:7::

#5. 显示用户密码信息

[root@localhost ~]passwd -S centos
centos PS 2018-05-31 0 5 6 7 (密码已设置,使用 SHA512 算法。)

#6. 锁定用户并解锁

[root@localhost ~]echo "centos" | passwd --stdin centos
更改用户 centos 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@localhost ~]cat /etc/shadow | grep centos
centos:$6$f7K9PltK$Icmc8sv7lDHwpPYK.Rrx1uy7nGI51Dt0doD2Me037sB4MnfzeIN6dByeZfh5lusnxl0XW398FZ33e1n.tCYcN.:17683:0:5:6:7::
[root@localhost ~]passwd -l centos
锁定用户 centos 的密码 。
passwd: 操作成功
[root@localhost ~]cat /etc/shadow | grep centos
centos:!!$6$f7K9PltK$Icmc8sv7lDHwpPYK.Rrx1uy7nGI51Dt0doD2Me037sB4MnfzeIN6dByeZfh5lusnxl0XW398FZ33e1n.tCYcN.:17683:0:5:6:7::
[root@localhost ~]登出
Connection to 192.168.43.242 closed.

caijun@caijun:~ $ ssh centos@192.168.43.242
centos@192.168.43.242 `s password:
Permission denied, please try again.
centos@192.168.43.242 `s password:

caijun@caijun:~ $ ssh cen7
Last login: Fri Jun  1 19:05:47 2018 from caijun
[root@localhost ~]passwd -u centos
解锁用户 centos 的密码。
passwd: 操作成功
[root@localhost ~]cat /etc/shadow | grep centos
centos:$6$f7K9PltK$Icmc8sv7lDHwpPYK.Rrx1uy7nGI51Dt0doD2Me037sB4MnfzeIN6dByeZfh5lusnxl0XW398FZ33e1n.tCYcN.:17683:0:5:6:7::

[root@localhost ~]登出
Connection to 192.168.43.242 closed.
caijun@caijun:~ $ ssh centos@192.168.43.242
centos@192.168.43.242 `s password:
Warning: your password will expire in 5 days  #注意第五个例子显示的密码信息, 0 5 6 7
Last failed login: Fri Jun  1 19:48:38 EDT 2018 from caijun on ssh:notty
There were 2 failed login attempts since the last successful login.
Last login: Fri Jun  1 19:27:25 2018

除了 passwd 命令外,还有一个命令可修改密码到期信息

使用 chage 修改用户密码到期信息

chage [options] LOGIN

具体用法:

[root@localhost ~]chage
用法:chage [选项] 登录

选项:
  -d, --lastday 最近日期        将最近一次密码设置时间设为“最近日期”
  -E, --expiredate 过期日期     将帐户过期时间设为“过期日期”
  -h, --help                   显示此帮助信息并推出
  -I, --inactive INACITVE      过期 INACTIVE 天数后,设定密码为失效状态
  -l, --list                   显示帐户年龄信息
  -m, --mindays 最小天数        将两次改变密码之间相距的最小天数设为“最小天数”
  -M, --maxdays 最大天数        将两次改变密码之间相距的最大天数设为“最大天数”
  -R, --root CHROOT_DIR        chroot 到的目录
  -W, --warndays 警告天数       将过期警告天数设为“警告天数”

示例:

#1. 更改最近一次修改密码的时间,对应/etc/shadow第 3 字段

[root@localhost ~]cat /etc/shadow | grep centos
centos:$6$f7K9PltK$Icmc8sv7lDHwpPYK.Rrx1uy7nGI51Dt0doD2Me037sB4MnfzeIN6dByeZfh5lusnxl0XW398FZ33e1n.tCYcN.:17683:0:5:6:7::
[root@localhost ~]chage -d 2010-01-01 centos
[root@localhost ~]cat /etc/shadow | grep centos
centos:$6$f7K9PltK$Icmc8sv7lDHwpPYK.Rrx1uy7nGI51Dt0doD2Me037sB4MnfzeIN6dByeZfh5lusnxl0XW398FZ33e1n.tCYcN.:14610:0:5:6:7::

#2. 设置用户的过期日期,对应/etc/shadow第 8 字段

[root@localhost ~]cat /etc/shadow | grep centos
centos:$6$f7K9PltK$Icmc8sv7lDHwpPYK.Rrx1uy7nGI51Dt0doD2Me037sB4MnfzeIN6dByeZfh5lusnxl0XW398FZ33e1n.tCYcN.:14610:0:5:6:7::
[root@localhost ~]chage -E 30 centos
[root@localhost ~]cat /etc/shadow | grep centos
centos:$6$f7K9PltK$Icmc8sv7lDHwpPYK.Rrx1uy7nGI51Dt0doD2Me037sB4MnfzeIN6dByeZfh5lusnxl0XW398FZ33e1n.tCYcN.:14610:0:5:6:7:30:
#注意:当-E值为-1时,删除账户过期时间
[root@localhost ~]chage -E -1 centos
[root@localhost ~]cat /etc/shadow | grep centos
centos:$6$f7K9PltK$Icmc8sv7lDHwpPYK.Rrx1uy7nGI51Dt0doD2Me037sB4MnfzeIN6dByeZfh5lusnxl0XW398FZ33e1n.tCYcN.:14610:0:5:6:7::
[root@localhost ~]

#3. 设置用户到期后的宽限时间,对应于/etc/shadow第7字段
[root@localhost ~]cat /etc/shadow | grep centos
centos:$6$f7K9PltK$Icmc8sv7lDHwpPYK.Rrx1uy7nGI51Dt0doD2Me037sB4MnfzeIN6dByeZfh5lusnxl0XW398FZ33e1n.tCYcN.:14610:0:5:6:7::
[root@localhost ~]chage -I 9 centos
[root@localhost ~]cat /etc/shadow | grep centos
centos:$6$f7K9PltK$Icmc8sv7lDHwpPYK.Rrx1uy7nGI51Dt0doD2Me037sB4MnfzeIN6dByeZfh5lusnxl0XW398FZ33e1n.tCYcN.:14610:0:5:6:9::
[root@localhost ~]

查看用户信息

我们知道,用户的信息存在/etc/passwd这个文件中,此文件对于任何用户都是可读的(但是只有管理员可以修改)

[centos@localhost ~]ls -al /etc/passwd
-rw-r--r--. 1 root root 1260 Jun  1 19:39 /etc/passwd

所以任何用户都可通过此文件查看用户信息。

系统有查看用户信息的命令。

使用 id 命令查看用户ID,组ID,附加组ID等信息

#1. 不指定用户时,默认显示用户自己的信息

[root@localhost ~]id
uid=0(root) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

#2. 查看指定用户信息

[centos@localhost ~]id gentoo
uid=1001(gentoo) gid=1001(gentoo) groups=1001(gentoo)
[centos@localhost ~]su - gentoo
Password:
[gentoo@localhost ~]id centos
uid=2000(centos) gid=1001(gentoo) groups=1001(gentoo),997(debian),1101(archlinux),1103(redhat)

使用 finger 命令查看用户信息,但是 finger CentOS 7系统并不自带,你可能要先 install

yum install finger 

使用 finger 显示用户信息:

#1. 不带任何参数时,默认显示当前登录到系统的用户
[centos@localhost ~]finger
Login     Name       Tty      Idle  Login Time   Office     Office Phone   Host
root      root       pts/0          Jun  1 19:58                           (caijun)
root      root       pts/1    1:51  Jun  1 18:53                           (caijun)

#2. 指明用户,显示用户的具体信息
[centos@localhost ~]finger centos
Login: centos                   Name: i am centos
Directory: /home/new_centos             Shell: /bin/bash
Last login Fri Jun  1 20:41 (EDT) on pts/0
No mail.
No Plan.

删除用户

使用 userdel 命令删除用户

userdel [options] LOGIN

具体用法:

[root@localhost ~]userdel --help
用法:userdel [选项] 登录

选项:
  -f, --force                   force some actions that would fail otherwise
                                e.g. removal of user still logged in
                                or files, even if not owned by the user
  -h, --help                    显示此帮助信息并推出
  -r, --remove                  删除主目录和邮件池
  -R, --root CHROOT_DIR         chroot 到的目录
  -Z, --selinux-user            为用户删除所有的 SELinux 用户映射

示例:

[root@localhost ~]ls /home/
selinux  suse
[root@localhost ~]userdel suse
[root@localhost ~]userdel -r selinux
[root@localhost ~]ls /home
suse
[root@localhost ~]cat /etc/passwd | grep suse
[root@localhost ~]cat /etc/passwd | grep selinux
[root@localhost ~]

开始之前

与用户不同,创建组后不会有一个组目录,所以也不会有组的目录模板。它仅有两个文件:

  • /etc/group
[root@localhost ~]tail /etc/group
stapdev:x:158:
screen:x:84:
gentoo:x:1001:
fedora:x:1100:
debian:x:997:
archlinux:x:1101:
suse:x:1102:
redhat:x:1103:centos
centos:x:1104:
opensuse:x:1105:
  • /etc/gshadow
[root@localhost ~]tail /etc/gshadow
stapsys:!::
stapdev:!::
screen:!::
gentoo:!::
fedora:!::
debian:!::centos
archlinux:!::centos
redhat:!::centos
centos:!::
opensuse:!::

组是用来干什么的呢?在我看来,组是一个归类,通过将多个用户添加到一个组内,然后赋予组权限,从而使得组内的用户也拥有此权限,对于权限管理组的概念变得由为重要。此篇着重讲管理用户和组,不涉及权限操作,对于用户、组的权限操作,我会再下一次博客中进行详细说明。

先来剖析一下/etc/group文件,它被 :分割符分割为了 4 个字段:

字段1字段2字段3字段4
组名组密码组id将此组作为附加组的用户列表

/etc/gshadow文件,也有 4 个字段

字段1字段2字段3字段4
组名组密码管理员组将此组作为附加组的用户列表

用户列表中的成员可以在不提示输入密码的情况下访问该组。
管理员组可以修改组密码和组内成员。

注意:

组ID与用户ID相对应,组ID的分类遵从用户ID的分类。

创建组

使用 groupadd 创建组

groupadd [options] group

具体用法:

[root@localhost ~]groupadd --help
用法:groupadd [选项] 组

选项:
  -f, --force       如果组已经存在则成功退出
            并且如果 GID 已经存在则取消 -g
  -g, --gid GID                 为新组使用 GID
  -h, --help                    显示此帮助信息并推出
  -K, --key KEY=VALUE           不使用 /etc/login.defs 中的默认值
  -o, --non-unique              允许创建有重复 GID 的组
  -p, --password PASSWORD       为新组使用此加密过的密码
  -r, --system                  创建一个系统账户
  -R, --root CHROOT_DIR         chroot 到的目录

示例:

#1. 创建一个普通组、系统组

[root@localhost ~]groupadd sed
[root@localhost ~]groupadd -r awk
[root@localhost ~]tail -2 /etc/group
awk:x:996:
sed:x:1106:

修改组信息

使用 groupmod 命令

groupmod [options] GROUP

具体用法:

[root@localhost ~]groupmod --help
用法:groupmod [选项] 组

选项:
  -g, --gid GID                 将组 ID 改为 GID
  -h, --help                    显示此帮助信息并推出
  -n, --new-name NEW_GROUP      改名为 NEW_GROUP
  -o, --non-unique              允许使用重复的 GID
  -p, --password PASSWORD       将密码更改为(加密过的) PASSWORD
  -R, --root CHROOT_DIR         chroot 到的目录

示例:

#1. 修改组名和组ID

[root@localhost ~]tail -2 /etc/group
awk:x:996:
sed:x:1106:
[root@localhost ~]groupmod -g 300 -n new_awk awk
[root@localhost ~]tail -2 /etc/group
sed:x:1106:
new_awk:x:300:
[root@localhost ~]groupmod -g 2000 new_awk
[root@localhost ~]tail -2 /etc/group
sed:x:1106:
new_awk:x:2000:

组密码管理

使用 gpasswd 命令管理组密码和组用户

gpasswd [options] group

具体用法:

[root@localhost ~]gpasswd --help
用法:gpasswd [选项] 组

选项:
  -a, --add USER                向组 GROUP 中添加用户 USER
  -d, --delete USER             从组 GROUP 中添加或删除用户
  -h, --help                    显示此帮助信息并推出
  -Q, --root CHROOT_DIR         要 chroot 进的目录
  -r, --remove-password         移除组 GROUP 的密码
  -R, --restrict                向其成员限制访问组 GROUP
  -M, --members USER,...        设置组 GROUP 的成员列表
  -A, --administrators ADMIN,...    设置组的管理员列表
除非使用 -A 或 -M 选项,不能结合使用这些选项。

示例:

#1. 不带任何选项,指定组修改其密码

[root@localhost ~]gpasswd sed
正在修改 sed 组的密码
新密码:
请重新输入新密码:
[root@localhost ~]cat /etc/gshadow | grep sed
sed:$6$RfgcO/l9gsT6$F5.ciF10vcDcXqsuC5yaxogJszOrUO65pgqXcaQPJQjVXJuMs3fQqxO4aS/0Y/dBLXDD5hmifPwOLslty3ae80::


#2. 想组中添加用户

[root@localhost ~]gpasswd -a gentoo sed
正在将用户“gentoo”加入到“sed”组中
[root@localhost ~]cat /etc/group | grep sed
sed:x:1106:gentoo

#3. 从组中删除用户
[root@localhost ~]gpasswd -d gentoo sed
正在将用户“gentoo”从“sed”组中删除
[root@localhost ~]cat /etc/group | grep sed
sed:x:1106:

删除组

使用 groupdel 命令删除组

groupdel [options] GROUP

具体用法:

[root@localhost logout]groupdel --help
用法:groupdel [选项] 组

选项:
  -h, --help                    显示此帮助信息并推出
  -R, --root CHROOT_DIR         chroot 到的目录

  CAVEATS
       您不能移除现有用户的主组。在移除此组之前,必须先移除此用户。

       您需要手动检查所有文件系统,以确保没有遗留的属于此组的文件。

示例:

#1. 删除组,但是不能删除作为用户基本组的主

[root@localhost logout]groupadd sed
[root@localhost logout]usermod -g sed gentoo
[root@localhost logout]groupdel sed
groupdel:不能移除用户“gentoo”的主组
[root@localhost logout]usermod -g gentoo gentoo
[root@localhost logout]usermod -aG sed gentoo
[root@localhost logout]id gentoo
uid=1001(gentoo) gid=1001(gentoo) 组=1001(gentoo),2001(sed)
[root@localhost logout]groupdel sed
[root@localhost logout]id gentoo
uid=1001(gentoo) gid=1001(gentoo) 组=1001(gentoo)

登录

登录用户

使用 su 命令登录到组

su [options...] [-] [user [args...]]

具体用法;

[root@localhost logout]su --help

用法:
 su [选项] [-] [USER [参数]...]

将有效用户 id 和组 id 更改为 USER 的 id。
单个 - 视为 -l。如果未指定 USER,将假定为 root。

选项:
 -m, -p, --preserve-environment     不重置环境变量
 -g, --group <组>                指定主组
 -G, --supp-group <组>        指定一个辅助组

 -, -l, --login                 使 shell 成为登录 shell
 -c, --command <命令>            使用 -c 向 shell 传递一条命令
 --session-command <命令>        使用 -c 向 shell 传递一条命令
                                 而不创建新会话
 -f, --fast                      向shell 传递 -f 选项(csh 或 tcsh)
 -s, --shell <shell>             若 /etc/shells 允许,则运行 shell

 -h, --help     显示此帮助并退出
 -V, --version  输出版本信息并退出

示例:

#1. 指明 - ,会加载/etc/profile. 不指 - 则不会加载
[root@localhost logout]vim /etc/profile
[root@localhost logout]tail -2 /etc/profile
A=1
export A
[root@localhost logout]su centos
[centos@localhost logout]echo $A

[centos@localhost logout]exit
[root@localhost logout]su - centos
上一次登录:五 61 23:01:34 EDT 2018pts/0 上
[centos@localhost ~]echo $A
1

#2. 用户centos指定以基本组gentoo,附加组debian,登录shell为sh登录系统

[root@localhost logout]id centos
uid=2000(centos) gid=1001(gentoo) 组=1001(gentoo),1103(redhat)
[root@localhost logout]su -g gentoo -G debian -s /bin/sh - centos
上一次登录:五 61 20:41:26 EDT 2018pts/0 上
[centos@localhost ~]id
uid=2000(centos) gid=1001(gentoo) groups=1001(gentoo),997(debian) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[centos@localhost ~]echo $SHELL
/bin/sh

注意:

这里 [-] 存在代表了交互式登录,不存在则代表非交互式登录。

登录组

使用 newgrp 命令登录组

newgrp [-] [group]

具体用法;

[root@localhost ~]newgrp --help
用法:newgrp [-] [组]

示例:

#1. 当前用户root登录到组sed,所以root用户的组不再为root而变为sed

[root@localhost ~]newgrp - sed
[root@localhost ~]cd /tmp/
[root@localhost tmp]mkdir test
[root@localhost tmp]cd test/
[root@localhost test]touch a b c d
[root@localhost test]ls -al
total 4
drwxr-xr-x. 2 root sed    38 Jun  1 22:12 .
drwxrwxrwt. 9 root root 4096 Jun  1 22:12 ..
-rw-r--r--. 1 root sed     0 Jun  1 22:12 a
-rw-r--r--. 1 root sed     0 Jun  1 22:12 b
-rw-r--r--. 1 root sed     0 Jun  1 22:12 c
-rw-r--r--. 1 root sed     0 Jun  1 22:12 d

退出登录的组:Ctrl+D 或者 exit

[root@localhost logout]newgrp - sed
[root@localhost ~]exit
logout
[root@localhost logout]

我来试一试

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

#( 06/02/18@10:11上午 )( root@centos7 ):~
   cp -r /etc/skel /home/tuser1
#( 06/02/18@10:09上午 )( root@centos7 ):~
   chmod -R g=,o= /home/tuser1
#( 06/02/18@10:09上午 )( root@centos7 ):~
   la -al /home/tuser1
总用量 24K
drwx------  2 root root 4.0K 62 09:58 .
drwxr-xr-x. 5 root root 4.0K 62 09:58 ..
-rw-------  1 root root   18 62 09:58 .bash_logout
-rw-------  1 root root  193 62 09:58 .bash_profile
-rw-------  1 root root  231 62 09:58 .bashrc
-rw-------  1 root root  658 62 09:58 .zshrc

#2. 编辑/etc/group文件,添加组hadoop

#( 06/02/18@ 9:07上午 )( root@centos7 ):~
   cat /etc/group | grep hadoop
#( 06/02/18@ 9:07上午 )( root@centos7 ):~
   vim /etc/group
#( 06/02/18@ 9:08上午 )( root@centos7 ):~
   cat /etc/group | grep hadoop
hadoop:x:2000:

#3. 手动编辑/etc/passwd文件新增一行,添加用户hadoop,其基本组ID为hadoop组的id号;其家目录为/home/hadoop

#( 06/02/18@ 9:12上午 )( root@centos7 ):~
   cat /etc/passwd | grep hadoop
#( 06/02/18@ 9:13上午 )( root@centos7 ):~
   vim /etc/passwd
   #( 06/02/18@ 9:16上午 )( root@centos7 ):~
   cat /etc/passwd | grep hadoop
hadoop:x:2000:2000:hadoop:/home/hadoop:/bin/bash

#4. 复制/etc/skel目录为/home/hadoop,要求修改hadoop目录的属组和其它用户没有任何访问权限

#( 06/02/18@ 9:16上午 )( root@centos7 ):~
   cp -r /etc/skel /home/hadoop
#( 06/02/18@ 9:29上午 )( root@centos7 ):~
   ls -ald /home/hadoop
drwxr-xr-x 2 root root 4096 62 09:19 /home/hadoop
#( 06/02/18@ 9:29上午 )( root@centos7 ):~
   chmod g=,o= /home/hadoop
#( 06/02/18@ 9:29上午 )( root@centos7 ):~
   ls -ald /home/hadoop
drwx------ 2 root root 4096 62 09:19 /home/hadoop
#( 06/02/18@ 9:29上午 )( root@centos7 ):~

#5. 修改/home/hadoop目录及其内部所有文件的属主为hadoop,属组为hadoop

#( 06/02/18@ 9:33上午 )( root@centos7 ):~
   chown -R hadoop:hadoop /home/hadoop
#( 06/02/18@ 9:33上午 )( root@centos7 ):~
   ls -al /home/hadoop
总用量 24
drwx------  2 hadoop hadoop 4096 62 09:19 .
drwxr-xr-x. 4 root   root   4096 62 09:19 ..
-rw-r--r--  1 hadoop hadoop   18 62 09:19 .bash_logout
-rw-r--r--  1 hadoop hadoop  193 62 09:19 .bash_profile
-rw-r--r--  1 hadoop hadoop  231 62 09:19 .bashrc
-rw-r--r--  1 hadoop hadoop  658 62 09:19 .zshrc

写在最后

此篇着详细讲解了用户与组管理,但不涉及权限的讲解。但是用户和组的管理离不开权限,两者相结合才能你才能真正体会到什么是“管理”。权限的讲解我将会放在我的下一篇博文详细讲解。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值