Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

4.3. 使用命令行工具

除了 第 4.2 节 “在图形环境中管理用户” 中描述的 用户设置工具(用于基本管理用户 )外,您还可以使用命令行工具管理 表 4.1 “管理用户和组的命令行工具” 中列出的用户和组。

表 4.1. 管理用户和组的命令行工具

工具描述

id

显示用户和组 ID.

useradd, usermod, userdel

用于添加、修改和删除用户帐户的标准实用程序.

groupaddgroupmodgroupdel

用于添加、修改和删除组的标准实用程序.

gpasswd

实用程序主要用于修改由 newgrp 命令使用的 /etc/g shadow 文件中的组密码。

pwck,grpck

可用于验证密码、组和相关影子文件的实用程序.

pwconv, pwunconv

实用程序,可用于将密码转换为影子密码,或者从影子密码转换回标准密码。

grpconv, grpunconv

与前面的 类似,这些实用程序可用于转换组帐户的影子信息。

4.3.1. 添加新用户

要在系统中添加新用户,以 root 用户身份在 shell 提示符后输入以下内容:

useradd options username

…其中选项是命令行选项,如 表 4.2 “常用 useradd 命令行选项” 所述。

默认情况下,user add 命令会创建一个锁定的用户帐户。要解锁帐户,以 root 用户身份运行以下命令来分配密码:

passwd username

(可选)您可以设置密码过期策略。请参阅 Red Hat Enterprise Linux 7 安全指南中 的密码安全部分

表 4.2. 常用 useradd 命令行选项

选项 

-c '评论'

注释可以被替换为任何字符串。此选项通常用于指定用户的全名。

-d home_directory

要使用的主目录,而不是默认的 /home/username/

-e date

以 YYYY-MM-DD 格式禁用的帐户的日期。

-f days

密码到期之后的天数,直到禁用帐户为止.如果指定了 0,则帐户会在密码过期后立即禁用。如果指定了 -1,则在密码过期后不会禁用帐户。

-g group_name

用户默认(主要)组的组名或组号。组必须在此处指定之前存在。

-G group_list

以逗号分开的额外(补充,非默认)组名或组号列表,用户是其中的成员。组必须在此处指定之前存在。

-m

如果主目录不存在,则创建该目录。

-M

不要创建主目录。

-N

不要为用户创建用户专用组。

-p password

通过 crypt 加密的密码

-r

创建 UID 小于 1000 且没有主目录的系统帐户。

-s

用户的登录 shell,默认为 /bin/bash

- UUID

用户的用户 ID,它必须唯一且大于 999。

重要

在 Red Hat Enterprise Linux 7 中,系统和普通用户的默认 ID 范围已从早期版本中更改。在以前的版本中,UID 1-499 用于系统用户和以上正常用户的值。系统用户的默认范围现在是 1-999。因为这个变化,当迁移到 Red Hat Enterprise Linux 7 时,如果有用户的 UID 和 GID 在 500 到 999 之间,则可能会造成问题。UID 和 GID 的默认范围可以在 /etc/login.defs 文件中更改。

解释进程

以下步骤演示了在启用了影子密码的系统上发出 useradd juan 命令时会发生什么情况:

  1. /etc/passwd 中为 juan 创建一个新行:

    juan:x:1001:1001::/home/juan:/bin/bash

    该行具有以下特征:

    • 它以用户名 juan 开始。
    • 密码字段有一个 x 表示系统正在使用 shadow 密码。
    • 创建大于 999 的 UID。在 Red Hat Enterprise Linux 7 下,1000 以下的 UID 保留给系统使用,不应分配给用户。
    • 创建大于 999 的 GID。在 Red Hat Enterprise Linux 7 下,1000 以下的 GID 保留给系统使用,不应分配给用户。
    • 可选的 GECOS 信息留空。GECOS 字段可用于提供有关用户的其他信息,如用户的全名或电话号码。
    • juan 的主目录设为 /home/juan/
    • 默认 shell 设置为 /bin/bash
  2. /etc/shadow 中为 juan 创建一个新行:

    juan:!!:14798:0:99999:7:::

    该行具有以下特征:

    • 它以用户名 juan 开始。
    • 两个感叹号(!!)显示在 /etc/shadow 文件的密码字段中,该字段将锁定帐户。

      注意

      如果使用 -p 标志传递加密的密码,则会将其放置在用户新行中的 /etc/shadow 文件中。

    • 密码设置为永不过期。
  3. /etc/group 中为名为 juan 的组创建一个新行:

    juan:x:1001:

    与用户同名的组称为用户专用组。有关用户私人组群的详情请参考 第 4.1.1 节 “用户专用组”

    /etc/group 中创建的行具有以下特征:

    • 它以组名 juan 开头。
    • 在密码字段中会出现 x,表示系统正在使用 shadow 组密码。
    • GID 与 /etc/passwd 中为 juan 的主组列出的匹配。
  4. /etc/gshadow 中为名为 juan 的组创建一个新行:

    juan:!::

    该行具有以下特征:

    • 它以组名 juan 开头。
    • 感叹号(!)显示在 /etc/gshadow 文件的密码字段中,该文件将锁定组。
    • 所有其他字段均为空。
  5. /home 目录中为用户 juan 创建一个目录:

    ~]# ls -ld /home/juan
    drwx------. 4 juan juan 4096 Mar 3 18:23 /home/juan

    该目录归用户 juan 和组 juan 所有。它 仅对 用户 juan 具有 读取写入 和执行 特权。所有其他权限都将被拒绝。

  6. /etc/skel/ 目录中的文件(包含默认用户设置)复制到新的 /home/juan/ 目录中:

    ~]# ls -la /home/juan
    total 28
    drwx------. 4 juan juan 4096 Mar 3 18:23 .
    drwxr-xr-x. 5 root root 4096 Mar 3 18:23 ..
    -rw-r--r--. 1 juan juan  18 Jun 22 2010 .bash_logout
    -rw-r--r--. 1 juan juan 176 Jun 22 2010 .bash_profile
    -rw-r--r--. 1 juan juan 124 Jun 22 2010 .bashrc
    drwxr-xr-x. 4 juan juan 4096 Nov 23 15:09 .mozilla

此时系统上存在名为 juan 的锁定帐户。要激活它,管理员接下来必须使用 passwd 命令为帐户分配密码,也可以设置密码过期指南(详情请参阅 Red Hat Enterprise Linux 7 安全指南中 的密码安全部分 )。

4.3.2. 添加新组

要在系统中添加新组,以 root 用户身份在 shell 提示符后输入以下内容:

groupadd options group_name

…其中选项是命令行选项,如 表 4.3 “常用 groupadd 命令行选项” 所述。

表 4.3. 常用 groupadd 命令行选项

选项描述

-f,--force

-g gidgid 搭配使用 时,groupadd 将为 选择另一个唯一。

-g gid

组的组 ID,它必须唯一且大于 999。

-k,--key key=value

覆盖 /etc/login.defs defaults。

-o,--non-unique

允许使用重复的 GID 创建组.

-p,--password password

将此加密密码用于新组。

-r

创建 GID 小于 1000 的系统组。

4.3.3. 将现有用户添加到现有组中

使用 usermod 实用程序将现有用户添加到现有的组中。

usermod 的各种选项对用户的主组以及他/她的补充组有不同影响。

要覆盖用户的主组群,以 root 用户身份运行以下命令:

~]# usermod -g group_name user_name

要覆盖用户的补充组,以 root 用户身份运行以下命令:

~]# usermod -G group_name1,group_name2,... user_name

请注意,在这种情况下,用户的所有前一个补充组都会被新组或多个新组替代。

要在用户的附加组中添加一个或多个组,以 root 用户身份运行以下命令之一:

~]# usermod -aG group_name1,group_name2,... user_name
~]# usermod --append -G group_name1,group_name2,... user_name

请注意,在这种情况下,新组会添加到用户的当前补充组中。

4.3.4. 创建组目录

系统管理员通常喜欢为每个主要项目创建组,并在需要访问该项目的文件时将人员分配给组。采用这种传统方案时,文件管理比较困难;当有人创建文件时,它与其所属的主要组相关联。当单个人处理多个项目时,将正确的文件与正确的组关联变得困难。但是,使用 UPG 方案时,组会自动分配到设置了 setgid 位的目录中创建的文件。setgid 位使得管理共享一个通用目录的组项目非常简单,因为用户在该目录中创建的任何文件都归拥有该目录的组所有。

例如,一组人需要处理 /opt/myproject/ 目录中的文件。些人信任修改此目录的内容,但不是每个人。

  1. root 用户身份,在 shell 提示符下键入以下内容来创建 /opt/myproject/ 目录:

    mkdir /opt/myproject
  2. 在系统中添加 myproject 组:

    groupadd myproject
  3. /opt/myproject/ 目录的内容与 myproject 组关联:

    chown root:myproject /opt/myproject
  4. 允许组中的用户在目录中创建文件并设置 setgid 位

    chmod 2775 /opt/myproject

    此时,myproject 的所有成员都可以在 /opt/myproject/ 目录中创建和编辑文件,无需管理员每次用户写入新文件时更改文件权限。要验证权限是否已正确设置,请运行以下命令:

    ~]# ls -ld /opt/myproject
    drwxrwsr-x. 3 root myproject 4096 Mar 3 18:31 /opt/myproject
  5. 将用户添加到 myproject 组:

    usermod -aG myproject username

4.3.5. 使用 umask为新文件设置默认权限

当进程创建文件时,该文件具有特定的默认权限,例如 -rw-rw-r--这些初始权限部分由文件模式创建掩码定义 ,也称为文件权限掩码或 umask。每个进程都有自己的 umask,例如,默认情况下 bash 具有 umask 0022。可以更改进程 umask

umask 包括什么

umask 由与标准文件权限对应的位组成。例如,对于 umask 0137,数字表示:

  • 0 = 无含义,它始终为 0 (umask 不影响特殊位)
  • 1 = 对于所有者权限,将设置执行位
  • 3 = 对于组权限,会设置执行位和写入位
  • 7 = 对于其他权限,将设置执行、写入和读取位

Umasks 可以用二进制、八进制或符号表示法表示。例如,八进制表示 0137 等于符号表示 u=rw-,g=r--,o=---。符号表示规格与八进制表示规范相反:它显示允许的权限,而不是禁止的权限。

umask 的工作原理

umask 禁止为文件设置权限

  • umask 中设置了一个位时,该文件中将取消设置。
  • umask 中未设置位时,可以在 文件中设置它,具体取决于其他因素。

下图显示了 umask 0137 如何影响新文件的创建。

图 4.3. 在创建文件时应用 umask

用户组 Umask 示例
重要

出于安全原因,在默认情况下,常规文件将不能拥有执行权限。因此,即使 umask 为0000 (不禁止任何权限),新的常规文件仍不具有执行权限。但是,可以创建具有执行权限的目录:

[john@server tmp]$ umask 0000
[john@server tmp]$ touch file
[john@server tmp]$ mkdir directory
[john@server tmp]$ ls -lh .
total 0
drwxrwxrwx. 2 john john 40 Nov 2 13:17 directory
-rw-rw-rw-. 1 john john 0 Nov 2 13:17 file

4.3.5.1. 在 Shell 中管理 umask

对于常用的 shell,如 bashkshzshtcshumask 使用 umask shell 内置 进行管理。从 shell 启动的进程继承其 umask。

显示当前掩码

使用数值表示法显示当前的 umask:

~]$ umask
0022

使用符号表示法显示当前的 umask:

~]$ umask -S
u=rwx,g=rx,o=rx
使用 umask 在 shell 中设置掩码

使用数值表示法运行为当前 shell 会话设置 umask:

~]$ umask octal_mask

用从 07 的四位或更少数字替换 octal_mask。提供三个或更少的数字时,权限会像命令包含前导零一样设置。例如,umask 7 转换为 0007

例 4.1. 使用 Octal 表示设置 umask

要禁止新文件拥有所有者和组的写入和执行权限,并且不允许其他人拥有任何权限:

~]$ umask 0337

或只需:

~]$ umask 337

使用符号表示法为当前 shell 会话设置 umask

~]$ umask -S symbolic_mask

例 4.2. 使用符号链接表示设置 umask

使用符号表示法设置 umask 0337

~]$ umask -S u=r,g=r,o=
使用默认的 shell umask

Shell 通常有一个配置文件,其中设置了其默认 umask。对于 bash,它是 /etc/bashrc。显示默认 bash umask:

~]$ grep -i -B 1 umask /etc/bashrc

输出显示是否设置了 umask,可使用 umask 命令或 UMASK 变量。在以下示例中,使用 umask 命令将 umask 设置为 022

~]$ grep -i -B 1 umask /etc/bashrc
  # By default, we want umask to get set. This sets it for non-login shell.
--
  if [ $UID -gt 199 ] && [ “id -gn” = “id -un” ]; then
    umask 002
  else
    umask 022

要更改 bash 的默认 umask,请在 /etc/bashrc 中更改 umask 命令调用或 UMASK 变量分配。本例将默认 umask 更改为 0227

  if [ $UID -gt 199 ] && [ “id -gn” = “id -un” ]; then
    umask 002
  else
    umask 227
使用特定用户的默认 shell umask

默认情况下,新用户的 bash umask 默认为 /etc/bashrc 中定义的 umask。

要为 特定用户更改 bash umask,请在用户的 $HOME/.bashrc 文件中添加对 umask 命令的调用。例如,将用户 john bash umask 更改为 0227

john@server ~]$ echo 'umask 227' >> /home/john/.bashrc
为新创建的主目录设置默认权限

要更改创建用户主目录的权限,请在 /etc/login.defs 文件中更改 UMASK 变量:

# The permission mask is initialized to this value. If not specified,
# the permission mask will be initialized to 022.
UMASK 077