/etc/passwd 文件

Linux 系统用专门的文件来将用户登录名和UID进行匹配。它就是 /etc/passwd 文件

  1. # cat /etc/passwd
  2. root:x:0:0:root:/root:/bin/bash
  3. bin:x:1:1:bin:/bin:/sbin/nologin
  4. ...
  5. mysql:x:1001:1001::/home/mysql:/sbin/nologin
  6. www:x:1002:1002::/home/www:/bin/bash
  7. admin:x:1003:1003::/home/admin:/bin/bash

其中root 用户是超级管理员,固定UID是0。 Linux 为系统账户预留了500以下的UID,普通用户会从500开始(CentOS7 上是1000)。

/etc/passwd 文件字段解析

admin:x:1003:1003::/home/admin:/bin/bash
字段1 admin 为用户登录名
字段2 x 用户密码,并不是x,而是为了避免安全隐患,将密码加密的内容转移到了 /etc/shadow
字段3 1003,用户UID
字段4 1003,用户组GID
字段5 空值,一般为用户文本描述(备注)
字段6 /home/admin,用户家目录
字段7 /bin/bash,用户默认的shell

注意:/etc/passwd 是一个标准的文本文件,我们可以用文本编辑器直接对用户进行编辑。但这样比较危险,一旦文件损坏,可能会导致用户无法正常登陆,包括root。所以一般建议使用用户管理命令。

/etc/shadow 文件

/etc/shadow 文件存储了Linux的系统密码记录,只有root用户才能访问,因为它默认权限是000,这样是为了更安全。

  1. # ll /etc/shadow
  2. ---------- 1 root root 1017 Jan 4 14:21 /etc/shadow
  3. # cat /etc/shadow
  4. root:$6$/99E2a1/1$utK89EmrgXaJGP2.eMNaX4t51ZQBTFypNHDoUeZLxxAyQhRkYDFcGgG4B/B6cZEJjeN7kFKIOUhR0YzV38vkg0:18957:0:99999:7:::
  5. bin:*:17110:0:99999:7:::
  6. daemon:*:17110:0:99999:7:::
  7. adm:*:17110:0:99999:7:::
  8. ...
  9. www:$6$6wRs3FCT$vZlbcmxi98OT8Va/.9uulw/XTqvf5mTKr62M7kDZlRDRp0Op2FkXvP52/1EwD/qvpDedLnm7pOEb.xoIIenzw1:18611:0:99999:7:::
  10. admin:$6$etpqjYQF$172mh8b8hASX.ZZYkCtgo.WXWl5lH6E1jZlkKgd0iP19Z5HYGf3wClMBxu98y4qfAzi9H306d38TMFN/nd.HU0:18734:0:99999:7:::

/etc/shadow 文件字段解析

root:$6$/99E2a1/1$utK89EmrgXaJGP2…:18957:0:99999:7:::
字段1 root 为 passwd 文件对应的用户登录名
字段2 加密后的密码
字段3 18957,上次改密码的日期(自1970年1月1日开始计算到改密码日期的天数)
字段4 0,多少天后才可以改密码
字段5 99999,多少天后必须改密码
字段6 7,密码过期提前多少天提醒用户更改密码
字段7 空值,密码过期后多少天禁用用户账户
字段8 用户账户被禁用的日期,(自1970年1月1日开始计算到当天的天数)
字段9 预留字段给将来使用

/etc/group 文件

与/etc/passwd类似,/etc/group文件包含了系统上用户组的信息。

  1. # cat /etc/group
  2. root:x:0:
  3. bin:x:1:
  4. daemon:x:2:
  5. sys:x:3:
  6. adm:x:4:

/etc/group 文件字段解析

root:x:0:
有4个字段:
字段1 组名
字段2 组密码 (允许非组内成员通过组密码临时成为该组成员,但使用不多)
字段3 GID
字段4 空,属于该组的用户列表。虽然很多都是空值,但用户在/etc/passwd中指定某个组为默认组时,将不在/etc/group文件中列出。

注意:千万不能通过直接修改/etc/group文件来添加用户到一个组。要使用usermod命令操作,添加用户到不同的组之前,用groupadd创建新组。

用户管理命令

对用户的管理,如同其他很多对象的管理一样,无非都是:增、删、改、查。
我们来看:

增,添加用户: useradd

useradd bob
这个命令会添加用户bob,但是默认不会为bob创建家目录(新版可能不一样,CentOS7测试可以创建家目录)。
如要连家目录一起创建则是:
useradd -m bob

useradd 创建用户时会有一些系统默认值,我们可以用useradd -D来查看

  1. # useradd -D
  2. GROUP=100 #新用户会被添加到GID为100的公共组
  3. HOME=/home #新用户的家目录在/home
  4. INACTIVE=-1 #密码过期后不禁用
  5. EXPIRE= #账号未设置过期日期
  6. SHELL=/bin/bash #默认shell为bash
  7. SKEL=/etc/skel #系统会将/etc/skel目录下的内容复制到用户家目录下
  8. CREATE_MAIL_SPOOL=yes #系统会为用户在mail目录下创建一个用于接收“系统内邮件”的文件

另外还有一个 adduser 命令,网上有看到比较两个用户创建命令之间的区别:
adduser: 会自动为创建的用户指定主目录、系统shell版本,会在创建时输入用户密码。
useradd:需要使用参数选项指定上述基本设置,如果不使用任何参数,则创建的用户无密码、无主目录、没有指定shell版本。
但本人CentOS7上测试并没有这个区别,推测和发行版以及命令版本有关

删,删除用户 userdel

userdel bob
这个命令默认情况下只删除 /etc/passwd 文件中的用户信息,而不会删除系统中属于该账户的任何文件。
如果有需要删除家目录,则加上 -r 选项:
userdel -r bob
然而这个要慎用,需确定用户家目录下没有任何重要文件,包括可能的依赖文件和程序。

改,修改用户属性,有多种工具

  1. usermod 修改用户账户字段,还可以指定用户组
  2. passwd 修改已有用户的密码
  3. chpasswd 从文件读取登录名密码对,并更新密码
  4. chage 修改密码的过期日期
  5. chfn 修改账户的备注信息
  6. chsh 修改账户的默认登录shell

usermod 可以修改 /etc/passwd 中的大部分字段:

  • -l 修改用户登录名:usermod -l banana apple, 将apple用户的登录名改为banana,家目录路径仍然不变
  • -p 修改账户密码:usermod -p PassW0rd apple (测试后发现原来是将密文直接写入/etc/shadow)
  • -g 修改默认登录组
  • -L 锁定账户,禁止登录
  • -U 解除锁定

PS:-L和-U搭配起来很实用

passwd 和 chpasswd
passwd apple 用交互式命令修改用户apple的密码(只有root才有权限修改别人的密码)
直接执行passwd修改当前用户密码
passwd -e apple : -e 选项能强制用户下次登陆时修改密码

chpasswd 能从标准输入中读取登录名和密码对(userid:passwd),给密码加密,然后为用户设置密码
chpasswd < users.txt

创建组、修改组、删除组

创建新组:groupadd
修改组:groupmod
删除组:groupdel

  1. # groupadd sharing
  2. # cat /etc/group | grep shar
  3. sharing:x:1004:
  4. # groupmod -n shared sharing
  5. # cat /etc/group | grep shar
  6. shared:x:1004:
  7. # groupdel shared
  8. # cat /etc/group | grep shar
  9. #

创建和修改组都不能将用户分配到组,还是用usermod来做:
usermod -g shared apple :将apple用户的主要组改为shared
usermod -G shared apple :将apple用户附加到shared组,主要属组不变