Linux用户管理

用户简介

用户分为两类,普通用户和管理员。普通用户又可以分为登录用户和系统用户。用户都有一个用户标识(UID),用户标识使用一个16位二制数表示,它的范围是0-65535。其中管理员的UID为0,系统用户的UID范围为1-999,登录用户的UID范围为1000-60000。

passwd文件

每个用户还有一个用户名,用户名和UID之间可以相互转换,这个过程被称为名称解析。Linx按解析库解析用户名,也就是/etc/passwd文件。

$cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
cat:x:501:501::/home/cat:/bin/bash
...

上例中用:分隔的每一列都存储了用户某方面的信息,每一列的用法如下:

  • 第1个字段(列)记录的是这个用户的名字(在创建用户时root用户起的)。
  • 第2个字段(列)如果是x,表示该用户登录Linux系统时必须使用密码;如果为空,则该用户在登录系统时无须提供密码。
  • 第3个字段(列)记录的是这个用户的uid。
  • 第4个字段(列)记录的是这个用户所组gid。
  • 第5个字段(列)记录的是有关这个用户的注释信息(如全名或通信地址)。
  • 第6个字段(列)记录的是这个用户的家目录的路径。
  • 第7个字段(列)记录的是这个用户登录后,第一个要执行的进程。

如果用文本编辑器将这个文件中cat用户记录的第2列x去掉,则cat用户登录Linux系统时将不再需要密码而可以直接登录。

/etc/passwd并未存储用户的密码,它存放在/etc/shadow文件中。

/etc/shadow文件中,每个字段(列)也是由冒号分隔。

lily:$6$.n.:17736:0:99999:7:::
[--] [----] [---] - [---] ----
|      |      |   |   |   |||+-----------> 9. Unused
|      |      |   |   |   ||+------------> 8. Expiration date
|      |      |   |   |   |+-------------> 7. Inactivity period
|      |      |   |   |   +--------------> 6. Warning period
|      |      |   |   +------------------> 5. Maximum password age
|      |      |   +----------------------> 4. Minimum password age
|      |      +--------------------------> 3. Last password change
|      +---------------------------------> 2. Encrypted Password
+----------------------------------------> 1. Username
  • 第1个字段(列)也是用户名,它是与/etc/passwd文件中的内容相对应的。
  • 第2列则是加密后的密码,密码使用$type$salt$hashed格式。$type是方法加密哈希算法,可以具有以下值:
    • $1$ – MD5
    • $2a$ – Blowfish
    • $2y$ – Eksblowfish
    • $5$ – SHA-256
    • $6$ – SHA-512 如果密码字段包含星号(*)或感叹号(!),则用户将无法使用密码身份验证登录系统。 仍然允许其他登录方法,例如基于密钥的身份验证或切换到用户。
  • 上次修改密码。 这是上次更改密码的日期。 从 1970 年 1 月 1 日(纪元日期)开始计算天数。
  • 最小密码使用期限。 在可以更改用户密码之前必须经过的天数。 通常将其设置为零,这意味着没有最短密码期限。
  • 密码最长使用期限。 必须更改用户密码后的天数。 默认情况下,此数字设置为 99999。
  • 警告期。 密码到期前警告用户必须更改密码的天数。
  • 失效期。 用户密码过期后,用户帐户被禁用之前的天数。 通常此字段为空。
  • 截止日期。 帐户被禁用的日期。 它表示为纪元日期。
  • 没用过。 该字段被忽略。 它保留供将来使用。

使用useradd命令来创建或更新用户信息。

以下内容将详细分析用户组和家目录相关的选项。并且以示例的方式介绍常用的 useradd命令写法。

语法和基本选项

useradd [option] username

主要的选项[option]:

  • -d <家目录>:指定用户时的家目录。
  • -g <用户组>:初始用户组。
  • -G <用户组>: 非初始用户组。
  • -m: 如果指定的家目录不存在,将自动创建。
  • -M: 不要创建用户的家目录。
  • -N 不要创建以用户名称为名的用户组。
  • -s 指定用户登入后所使用的shell。

创建用户时指定用户组

/etc/passwd文件中,每行的第四个字段指定的就是用户的初始用户组。用户登录后立即就拥有了所属用户组的权限。

下面我们将演示有关用户组的选项的用法:

添加用户时创建同名的用户组

$ sudo useradd user1

上例没有使用任何用户组相关的参数,默认在创建用户user1的同时会创建一个同名的用户组。用户user1的用户组就是这个新建的用户组。

添加用户时指定所属用户组

$ sudo useradd user2 -g sudo

当我们希望创建一个权限非常高的管理员时,可以把这个用户的用户组指定为sudo,以上命令创建用户user2的同时,将用户组加入到这个用户组。我们可以查看一下 /etc/passwd/etc/group文件,发现没有新的用户组被创建。 user2的用户组被设置成了sudo

添加用户时创建同名的用户组,并指定其它用户组

$ sudo useradd user3 -G sudo

和上一条命令相比我们只是把小写的g替换成了大写的G。但结果切相差很多,因为这次不仅创建了用户组user3,它还是用户user3的初始用户组。和创建user1的命令唯一不同是user3被加入了到了sudo用户组。

创建用户时指定家目录

在大多数Linux系统上,用户主目录以用户名命名并创建在/home目录下。

$ sudo useradd user1

让我们重新看看创建用户user1这条命令。它会为用户user1创建名为user1的目录作为家目录(有的发行版不会自动创建家目录),打开/etc/passwd文件,user1的记录中包含了家目录/home/user1

user1:x:1005:1005::/home/user1:/bin/bash

创建用户时创建用户的家目录

$ sudo useradd -m user4

有的发行版不会自动创建家目录,若要在创建用户的同时创建用户的家目录,可以指定-m选项。

创建用户时指定用户的家目录

$ sudo useradd  -d /home/abc user5

指定家目录,此时不生成目录abc

$ sudo useradd -d /home/abcd -m user6

此时生成创建目录abcd,并且创建用户的默认文件

创建用户时指定用户的默认shell

$ sudo useradd -m -s /bin/bash user1

指定用户使用Bash shell。

$ sudo useradd -s /sbin/nologin user2

创建一个不能登录的用户

使用userdel命令删除用户

如果一个用户的账号不再使用,可以从系统中删除。删除用户账号会将/etc/passwd/etc/shadow等系统文件中的该用户记录删除,必要时还可以删除用户的主目录及其下的文件。

userdel命令的格式如下:

userdel 选项 用户名

如删除用户user1

# userdel user1

使用-r选项,它的作用是把用户的主目录一起删除。

# userdel -r user1

使用usermod命令修改用户信息

usermod命令可用于修改用户的相关信息,如用户ID、主目录、用户组、默认Shell等。

只有root或具有sudo访问权限的用户才能调用usermod命令并修改用户帐户。 成功后,该命令不会显示任何输出。

将用户添加到组

用户组分为:主用户组和附加用户组。

usermod最典型的使用场景是将用户添加到组中。 要将现有用户添加到附加用户组,请使用-a -G选项:

$ sudo usermod -a -G GROUP USER

将用户添加到新组时,请始终使用 -a(追加)选项。 如果省略-a选项,用户将从 -G选项后未列出的组中删除。也就是用户的主用户组会被替换。

修改用户信息

使用usermod命令的-c选项,修改用户信息。

$ sudo usermod -c "user for test" user2

修改用户家目录

如果出于某种原因,您想更改用户的主目录,请使用-d选项调用usermod命令,后跟新主目录的绝对路径和用户名:usermod -d HOME_DIR USER

$ sudo usermod -d /var/www mywebsit

默认情况下,该命令不会将用户主目录的内容移动到新目录。 要移动内容,请使用 -m选项。 如果新目录不存在,则创建它:

$ sudo usermod -d /var/www -m mywebsit

修改用户的默认Shell

修改用户的默认shell,运行带有-s选项的命令,后跟shell的绝对路径和用户名:usermod -s SHELL USER

例如,将用户user2的默认Shell修改为/bin/sh

$ sudo usermod -s /bin/sh user2

修改用户的UID

修改用户的UID,运行带有-u选项的命令,后跟新的UID和用户名:usermod -u UID USER

例如,将用户user2的UID修改为1050

$ sudo usermod -u 1050 user2

此命令会自动更改位于家目录下的文件,用户的邮箱文件的UID。 所有其他文件的所有权必须手动更改。

修改用户的用户名

虽然不常用,某些时候您可能需要修改用户的用户名,运行带有-l选项的命令,后跟新的用户名和旧的用户名:usermod -l NEW_USER USER

例如,将用户user2的UID修改为testUser

$ sudo usermod -l testUser user2

锁定和解锁用户

使用命令-L选项锁定用户;-U选项解锁用户。

$ sudo usermod -L user2
$ sudo usermod -U user2