我来管理用户和组
我来管理用户和组
我是root , 我怕谁~
写在开头
此篇着详细讲解了用户与组管理。学完此篇,你可以
- 创建用户和组
- 修改用户和组信息
- 给用户和组设置密码
- 查看用户信息
- 删除用户和组
- 登录用户和组
用户
开始之前
在我们开始之前,得先知道的一些东西。当我们创建了一个用户时(当然这指的是你并没有给用户任何选项,只是给了一个用户名),默认会为用户在/home目录下创建一个同名的家目录,并且在此家目录中准备好用户的个人bash配置文件。系统为什么这么聪明,能够自动为我们创建呢?这是因为系统上已经存在了这么一个模板目录:
- /etc/skel
[root@localhost ~]ls -al /etc/skel/
总用量 24
drwxr-xr-x. 2 root root 59 5月 25 12:28 .
drwxr-xr-x. 76 root root 8192 6月 1 10:47 ..
-rw-r--r--. 1 root root 18 6月 10 2014 .bash_logout
-rw-r--r--. 1 root root 193 6月 10 2014 .bash_profile
-rw-r--r--. 1 root root 231 6月 10 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。
有两种方式可以修改创建用户时的这些默认信息:
- useradd命令的-D选项
- 直接修改/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 6月 1 11:56 .
drwxr-xr-x. 76 root root 8192 6月 1 11:55 ..
-rw-r--r--. 1 root root 18 6月 10 2014 .bash_logout
-rw-r--r--. 1 root root 193 6月 10 2014 .bash_profile
-rw-r--r--. 1 root root 231 6月 10 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 6月 1 11:56 .
drwxr-xr-x. 76 root root 8192 6月 1 11:55 ..
-rw-r--r--. 1 root root 18 6月 10 2014 .bash_logout
-rw-r--r--. 1 root root 193 6月 10 2014 .bash_profile
-rw-r--r--. 1 root root 231 6月 10 2014 .bashrc
drwxr-xr-x. 3 root root 19 6月 1 11:56 mydir1
-rw-r--r--. 1 root root 0 6月 1 11:56 myfile1.txt
[root@localhost skel]useradd gentoo
[root@localhost skel]ls -al /home/gentoo
总用量 12
drwx------. 3 gentoo gentoo 90 6月 1 11:56 .
drwxr-xr-x. 4 root root 31 6月 1 11:56 ..
-rw-r--r--. 1 gentoo gentoo 18 6月 10 2014 .bash_logout
-rw-r--r--. 1 gentoo gentoo 193 6月 10 2014 .bash_profile
-rw-r--r--. 1 gentoo gentoo 231 6月 10 2014 .bashrc
drwxr-xr-x. 3 gentoo gentoo 19 6月 1 11:56 mydir1
-rw-r--r--. 1 gentoo gentoo 0 6月 1 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 个字段:
用户名 | 密码 | UID | GID | 备注信息 | 家目录 | shell |
---|---|---|---|---|---|---|
admin | x | 1000 | 1000 | admin | /home/admin | /bin/bash |
gentoo | x | 10001 | 10001 | /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 6月 1 13:11 .
drwxr-xr-x. 5 root root 43 6月 1 13:11 ..
-rw-r--r--. 1 fedora fedora 18 6月 10 2014 .bash_logout
-rw-r--r--. 1 fedora fedora 193 6月 10 2014 .bash_profile
-rw-r--r--. 1 fedora fedora 231 6月 10 2014 .bashrc
drwxr-xr-x. 3 fedora fedora 19 6月 1 11:56 mydir1
-rw-r--r--. 1 fedora fedora 0 6月 1 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 6月 1 13:30 .
drwxr-xr-x. 77 root root 8192 6月 1 13:29 ..
drwxr-xr-x. 3 root root 19 6月 1 13:30 mydir1
-rw-r--r--. 1 root root 0 6月 1 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 6月 1 13:31 .
drwxr-xr-x. 6 root root 54 6月 1 13:31 ..
drwxr-xr-x. 3 suse suse 19 6月 1 13:30 mydir1
-rw-r--r--. 1 suse suse 0 6月 1 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 6月 1 15:05 .
drwxr-xr-x. 8 root root 81 6月 1 14:07 ..
-rw-------. 1 centos gentoo 103 6月 1 15:05 .bash_history
-rw-r--r--. 1 centos gentoo 18 6月 10 2014 .bash_logout
-rw-r--r--. 1 centos gentoo 193 6月 10 2014 .bash_profile
-rw-r--r--. 1 centos gentoo 231 6月 10 2014 .bashrc
drwxr-xr-x. 3 centos gentoo 19 6月 1 11:56 mydir1
-rw-r--r--. 1 centos gentoo 0 6月 1 11:56 myfile1.txt
[root@localhost ~]ls -al /tmp/centos/
总用量 4
drwxrwxr-x. 2 1103 centos 38 6月 1 14:59 .
drwxrwxrwt. 8 root root 4096 6月 1 14:59 ..
-rw-rw-r--. 1 1103 centos 0 6月 1 14:59 a
-rw-rw-r--. 1 1103 centos 0 6月 1 14:59 b
-rw-rw-r--. 1 1103 centos 0 6月 1 14:59 c
-rw-rw-r--. 1 1103 centos 0 6月 1 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 6月 1 15:39 .
drwxr-xr-x. 7 root root 69 6月 1 15:52 ..
-rw-r--r--. 1 centos gentoo 0 6月 1 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 6月 1 15:39 .
drwxr-xr-x. 7 root root 73 6月 1 15:58 ..
-rw-r--r--. 1 centos gentoo 0 6月 1 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
上一次登录:五 6月 1 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
上一次登录:五 6月 1 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
上一次登录:五 6月 1 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 6月 2 09:58 .
drwxr-xr-x. 5 root root 4.0K 6月 2 09:58 ..
-rw------- 1 root root 18 6月 2 09:58 .bash_logout
-rw------- 1 root root 193 6月 2 09:58 .bash_profile
-rw------- 1 root root 231 6月 2 09:58 .bashrc
-rw------- 1 root root 658 6月 2 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 6月 2 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 6月 2 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 6月 2 09:19 .
drwxr-xr-x. 4 root root 4096 6月 2 09:19 ..
-rw-r--r-- 1 hadoop hadoop 18 6月 2 09:19 .bash_logout
-rw-r--r-- 1 hadoop hadoop 193 6月 2 09:19 .bash_profile
-rw-r--r-- 1 hadoop hadoop 231 6月 2 09:19 .bashrc
-rw-r--r-- 1 hadoop hadoop 658 6月 2 09:19 .zshrc
写在最后
此篇着详细讲解了用户与组管理,但不涉及权限的讲解。但是用户和组的管理离不开权限,两者相结合才能你才能真正体会到什么是“管理”。权限的讲解我将会放在我的下一篇博文详细讲解。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 876208453@qq.com
文章标题:我来管理用户和组
本文作者:Cai Jun
发布时间:2018-06-02, 03:13:18
最后更新:2019-02-22, 13:19:59
原始链接:http://johncaijun.github.io/2018-06-02-我来管理用户和组/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。