PRF: #10487 # 10594 完成校对

This commit is contained in:
pityonline 2018-10-05 09:39:08 +08:00
parent 46493ca9fb
commit 95a1f9a881
No known key found for this signature in database
GPG Key ID: 89C97C8DF02C633E

View File

@ -1,14 +1,15 @@
管理 Linux 系统中的用户 管理 Linux 系统中的用户
====== ======
![](https://images.idgesg.net/images/article/2017/09/charging-bull-100735753-large.jpg) ![](https://images.idgesg.net/images/article/2017/09/charging-bull-100735753-large.jpg)
也许你的 Lniux 用户并不是愤怒的公牛,但是当涉及管理他们的账户的时候,能让他们一直开心也是一种挑战。监控他们当前正在访问的东西,追踪他们他们遇到问题时的解决方案,并且保证能把他们在使用系统时出现的重要变动记录下来。这里有一些方法和工具可以使这份工作轻松一点。 也许你的 Linux 用户并不是愤怒的公牛,但是当涉及管理他们的账户的时候,能让他们一直满意也是一种挑战。你需要监控他们的访问权限,跟进他们遇到问题时的解决方案,并且把他们在使用系统时出现的重要变动记录下来。这里有一些方法和工具可以让这个工作轻松一点。
### 配置账户 ### 配置账户
添加和移除账户是管理用户中最简单的一项,但是这里面仍然有很多需要考虑的选项。无论你是用桌面工具或是命令行选项,这都是一个非常自动化的过程。你可以使用命令添加一个新用户,像是 `adduser jdoe`,这同时会触发一系列的事情。使用下一个可用的 UID 可以创建 John 的账户,或许还会被许多用以配置账户的文件所填充。当你运行 `adduser` 命令加一个新的用户名的时候,它将会提示一些额外的信息,同时解释这是在干什么。 添加和删除账户是管理用户中比较简单的一项,但是这里面仍然有很多需要考虑的方面。无论你是用桌面工具或是命令行选项,这都是一个非常自动化的过程。你可以使用 `adduser jdoe` 命令添加一个新用户,同时会触发一系列的反应。在创建 John 这个账户时会自动使用下一个可用的 UID并有很多自动生成的文件来完成这个工作。当你运行 `adduser` 后跟一个参数时(要创建的用户名),它会提示一些额外的信息,同时解释这是在干什么。
``` ```
$ sudo adduser jdoe $ sudo adduser jdoe
Adding user 'jdoe' ... Adding user 'jdoe' ...
Adding new group `jdoe' (1001) ... Adding new group `jdoe' (1001) ...
@ -20,21 +21,21 @@ Retype new UNIX password:
passwd: password updated successfully passwd: password updated successfully
Changing the user information for jdoe Changing the user information for jdoe
Enter the new value, or press ENTER for the default Enter the new value, or press ENTER for the default
Full Name []: John Doe Full Name []: John Doe
Room Number []: Room Number []:
Work Phone []: Work Phone []:
Home Phone []: Home Phone []:
Other []: Other []:
Is the information correct? [Y/n] Y Is the information correct? [Y/n] Y
``` ```
像你看到的那样,`adduser` 将添加用户的信息(到 `/etc/passwd``/etc/shadow` 文件中),创建新的家目录,并用 `/etc/skel` 里设置的文件填充家目录,提示你分配初始密码和认信息,然后确认这些信息都是正确的,如果你在最后的提示 “Is the information correct” 处的答案是 “n”它将回溯你之前所有的回答,允许修改任何你想要修改的地方。 如你所见,`adduser` 会添加用户的信息(到 `/etc/passwd``/etc/shadow` 文件中),创建新的<ruby>家目录<rt>home directory</rt></ruby>,并用 `/etc/skel` 里设置的文件填充家目录,提示你分配初始密码和认信息,然后确认这些信息都是正确的,如果你在最后的提示 “Is the information correct?” 处的回答是 “n”它会回溯你之前所有的回答,允许修改任何你想要修改的地方。
创建好一个用户后,你可能会想要确认一下它是否是你期望的样子,更好的方法是确保在添加第一个帐户**之前**,“自动”选择与您想要查看的内容相匹配。默认有默认的好处,它对于你想知道他们定义在哪里有所用处,以防你想作出一些变动 —— 例如,你不想家目录在 `/home` 里,你不想用户 UID 从 1000 开始,或是你不想家目录下的文件被系统上的**每个人**都可读。 创建好一个用户后,你可能会想要确认一下它是否是你期望的样子,更好的方法是确保在添加第一个帐户**之前**,“自动”选择与你想要查看的内容是否匹配。默认有默认的好处,它对于你想知道他们定义在哪里很有用,以便你想做出一些变动 —— 例如,你不想让用户的家目录在 `/home` 里,你不想让用户 UID 从 1000 开始,或是你不想让家目录下的文件被系统中的**每个人**都可读。
`adduser` 如何工作的一些细节设置在 `/etc/adduser.conf` 文件里。这个文件包含的一些设置决定了一个新的账户如何配置,以及它之后的样子。注意,注释和空白行将会在输出中被忽略,因此我们可以更加集中注意在设置上面。 `adduser` 的一些配置细节设置在 `/etc/adduser.conf` 文件里。这个文件包含的一些配置项决定了一个新的账户如何配置,以及它之后的样子。注意,注释和空白行将会在输出中被忽略,因此我们更关注配置项。
``` ```
$ cat /etc/adduser.conf | grep -v "^#" | grep -v "^$" $ cat /etc/adduser.conf | grep -v "^#" | grep -v "^$"
DSHELL=/bin/bash DSHELL=/bin/bash
DHOME=/home DHOME=/home
@ -55,45 +56,45 @@ DIR_MODE=0755
SETGID_HOME=no SETGID_HOME=no
QUOTAUSER="" QUOTAUSER=""
SKEL_IGNORE_REGEX="dpkg-(old|new|dist|save)" SKEL_IGNORE_REGEX="dpkg-(old|new|dist|save)"
``` ```
可以看到,我们有了一个默认的 shell`DSHELL`UID`FIRST_UID`)的开始数值,家目录(`DHOME`)的位置,以及启动文件(`SKEL`)的来源位置。这个文件也会指定分配给家目录(`DIR_HOME`)的权限。 可以看到,我们有了一个默认的 shell`DSHELL`UID`FIRST_UID`)的起始值,家目录(`DHOME`)的位置,以及启动文件(`SKEL`)的来源位置。这个文件也会指定分配给家目录(`DIR_HOME`)的权限。
其中 `DIR_HOME` 是最重要的设置,它决定了每个家目录被使用的权限。这个设置分配给用户创建的目录权限是 `755`,家目录的权限将会设置为 `rwxr-xr-x`。用户可以读其他用户的文件,但是不能修改和移除们。如果你想要更多的限制,你可以更改这个设置为 `750`(用户组外的任何人都不可访问)甚至是 `700`(除用户自己外的人都不可访问)。 其中 `DIR_HOME` 是最重要的设置,它决定了每个家目录被使用的权限。这个设置分配给用户创建的目录权限是 755家目录的权限将会设置为 `rwxr-xr-x`。用户可以读其他用户的文件,但是不能修改和移除们。如果你想要更多的限制,你可以更改这个设置为 750用户组外的任何人都不可访问甚至是 700除用户自己外的人都不可访问
任何用户账号在创建之前都可以进行手动修改。例如,你可以编辑 `/etc/passwd` 或者修改家目录的权限,开始在新服务器上添加用户之前配置 `/etc/adduser.conf` 可以确保一定的一致性,从长远来看可以节省时间和避免一些麻烦。 任何用户账号在创建之前都可以进行手动修改。例如,你可以编辑 `/etc/passwd` 或者修改家目录的权限,开始在新服务器上添加用户之前配置 `/etc/adduser.conf` 可以确保一定的一致性,从长远来看可以节省时间和避免一些麻烦。
`/etc/adduser.conf` 的修改将会在之后创建的用户上生效。如果你想以不同的方式设置某个特定账户,除了用户名之外,你还可以选择使用 `adduser` 命令提供账户配置选项。或许你想为某些账户分配不同的 shell请求特殊的 UID完全禁用登录。`adduser` 的帮助页将会为你显示一些配置个人账户的选择。 `/etc/adduser.conf` 的修改将会在之后创建的用户上生效。如果你想以不同的方式设置某个特定账户,除了用户名之外,你还可以选择使用 `adduser` 命令提供账户配置选项。或许你想为某些账户分配不同的 shell分配特殊的 UID或完全禁用该账户登录。`adduser` 的帮助页将会为你显示一些配置个人账户的选择。
``` ```
adduser [options] [--home DIR] [--shell SHELL] [--no-create-home] adduser [options] [--home DIR] [--shell SHELL] [--no-create-home]
[--uid ID] [--firstuid ID] [--lastuid ID] [--ingroup GROUP | --gid ID] [--uid ID] [--firstuid ID] [--lastuid ID] [--ingroup GROUP | --gid ID]
[--disabled-password] [--disabled-login] [--gecos GECOS] [--disabled-password] [--disabled-login] [--gecos GECOS]
[--add_extra_groups] [--encrypt-home] user [--add_extra_groups] [--encrypt-home] user
``` ```
每个 Linux 系统现在都会默认把每个用户放入对应的组中。作为一个管理员,你可能会选择以不同的方式去做事。你也许会发现把用户放在一个共享组中可以让你的站点工作的更好,这时,选择使用 `adduser``--gid` 选项去选择一个特定的组。当然,用户总是许多组的成员,因此也有一些选项去管理主要和次要的组。 每个 Linux 系统现在都会默认把每个用户放入对应的组中。作为一个管理员,你可能会选择以不同的方式。你也许会发现把用户放在一个共享组中更适合你的站点,你就可以选择使用 `adduser``--gid` 选项指定一个特定的组。当然,用户总是许多组的成员,因此也有一些选项来管理主要和次要的组。
### 处理用户密码 ### 处理用户密码
一直以来,知道其他人的密码都是一个不好的念头,在设置账户时,管理员通常使用一个临时密码,然后在用户第一次登录时运行一条命令强制他修改密码。这里是一个例子: 一直以来,知道其他人的密码都不是一件好事,在设置账户时,管理员通常使用一个临时密码,然后在用户第一次登录时运行一条命令强制他修改密码。这里是一个例子:
``` ```
$ sudo chage -d 0 jdoe $ sudo chage -d 0 jdoe
``` ```
当用户第一次登录的时候,会看到像这样的事情: 当用户第一次登录时,会看到类似下面的提示:
``` ```
WARNING: Your password has expired. WARNING: Your password has expired.
You must change your password now and login again! You must change your password now and login again!
Changing password for jdoe. Changing password for jdoe.
(current) UNIX password: (current) UNIX password:
``` ```
### 添加用户到副组 ### 添加用户到副组
添加用户到副组中,你可能会用如下所示的 `usermod` 命令 —— 添加用户到组中并确认已经做出变动。 添加用户到副组中,你可能会用如下所示的 `usermod` 命令添加用户到组中并确认已经做出变动。
``` ```
$ sudo usermod -a -G sudo jdoe $ sudo usermod -a -G sudo jdoe
@ -101,54 +102,54 @@ $ sudo grep sudo /etc/group
sudo:x:27:shs,jdoe sudo:x:27:shs,jdoe
``` ```
记住在一些组,像是 `sudo` 或者 `wheel` 组中,意味着包含特权,一定要特别注意这一点。 记住在一些组意味着特别的权限,如 sudo 或者 wheel 组,一定要特别注意这一点。
### 移除用户,添加组等 ### 移除用户,添加组等
Linux 系统也提供了移除账户,添加新的组,移除组等一些命令。例如,`deluser` 命令,将会从 `/etc/passwd``/etc/shadow` 中移除用户记录,但是会完整保留其家目录,除非你添加了 `--remove-home` 或者 `--remove-all-files` 选项。`addgroup` 命令会添加一个组,默认按目前组的次序分配下一个 id在用户组范围内除非你使用 `--gid` 选项指定 id。
Linux 系统也提供了命令去移除账户、添加新的组、移除组等。例如,`deluser` 命令,将会从 `/etc/passwd``/etc/shadow` 中移除用户登录入口,但是会完整保留他的家目录,除非你添加了 `--remove-home` 或者 `--remove-all-files` 选项。`addgroup` 命令会添加一个组,按目前组的次序给他下一个 ID在用户组范围内除非你使用 `--gid` 选项指定 ID。
``` ```
$ sudo addgroup testgroup --gid=131 $ sudo addgroup testgroup --gid=131
Adding group `testgroup' (GID 131) ... Adding group `testgroup' (GID 131) ...
Done. Done.
``` ```
### 管理特权账户 ### 管理特权账户
一些 Linux 系统中有一个 wheel 组,它给组中成员赋予了像 root 一样运行命令的能力。在这种情况下,`/etc/sudoers` 将会引用该组。在 Debian 系统中,这个组被叫做 `sudo`,但是以相同的方式工作,你在 `/etc/sudoers` 中可以看到像这样的引用: 一些 Linux 系统中有一个 wheel 组,它给组中成员赋予了像 root 一样运行命令的权限。在这种情况下,`/etc/sudoers` 将会引用该组。在 Debian 系统中,这个组被叫做 sudo但是原理是相同的你在 `/etc/sudoers` 中可以看到像这样的信息:
``` ```
%sudo ALL=(ALL:ALL) ALL %sudo ALL=(ALL:ALL) ALL
``` ```
个基础的设定意味着,任何在 wheel 或者 sudo 组中的成员,只要在他们运行的命令之前添加 `sudo`,就可以以 root 的权限去运行命令。 行基本的配置意味着任何在 wheel 或者 sudo 组中的成员只要在他们运行的命令之前添加 `sudo`,就可以以 root 的权限去运行命令。
你可以向 `sudoers` 文件中添加更多有限的特权 —— 也许给特定用户运行一两个 root 的命令。如果这样做,您还应定期查看 `/etc/sudoers` 文件以评估用户拥有的权限,以及仍然需要提供的权限。 你可以向 sudoers 文件中添加更多有限的权限 —— 也许给特定用户几个能以 root 运行的命令。如果你是这样做的,你应该定期查看 `/etc/sudoers` 文件以评估用户拥有的权限,以及仍然需要提供的权限。
在下面显示的命令中,我们看到在 `/etc/sudoers` 中匹配到的行。在这个文件中最有趣的行是,包含能使用 `sudo` 运行命令的路径设置,以及两个允许通过 `sudo` 运行命令的组。像刚才提到的那样,单个用户可以通过包含在 `sudoers` 文件中来获得权限,但是更有实际意义的方法是通过组成员来定义各自的权限。 在下面显示的命令中,我们过滤了 `/etc/sudoers` 中有效的配置行。其中最有意思的是,它包含了能使用 `sudo` 运行命令的路径设置,以及两个允许通过 `sudo` 运行命令的组。像刚才提到的那样,单个用户可以通过包含在 sudoers 文件中来获得权限,但是更有实际意义的方法是通过组成员来定义各自的权限。
``` ```
# cat /etc/sudoers | grep -v "^#" | grep -v "^$" # cat /etc/sudoers | grep -v "^#" | grep -v "^$"
Defaults env_reset Defaults env_reset
Defaults mail_badpass Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin" Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
root ALL=(ALL:ALL) ALL root ALL=(ALL:ALL) ALL
%admin ALL=(ALL) ALL <== admin group %admin ALL=(ALL) ALL <== admin group
%sudo ALL=(ALL:ALL) ALL <== sudo group %sudo ALL=(ALL:ALL) ALL <== sudo group
``` ```
### 登录检查 ### 登录检查
你可以通过以下命令查看用户的上一次登录: 你可以通过以下命令查看用户的上一次登录:
``` ```
# last jdoe # last jdoe
jdoe pts/18 192.168.0.11 Thu Sep 14 08:44 - 11:48 (00:04) jdoe pts/18 192.168.0.11 Thu Sep 14 08:44 - 11:48 (00:04)
jdoe pts/18 192.168.0.11 Thu Sep 14 13:43 - 18:44 (00:00) jdoe pts/18 192.168.0.11 Thu Sep 14 13:43 - 18:44 (00:00)
jdoe pts/18 192.168.0.11 Thu Sep 14 19:42 - 19:43 (00:00) jdoe pts/18 192.168.0.11 Thu Sep 14 19:42 - 19:43 (00:00)
``` ```
如果你想查看每一个用户上一次的登录情况,你可以通过一个像这样的循环来运行 `last` 命令: 如果你想查看每一个用户上一次的登录情况,你可以通过一个像这样的循环来运行 `last` 命令:
``` ```
$ for user in `ls /home`; do last $user | head -1; done $ for user in `ls /home`; do last $user | head -1; done
@ -157,21 +158,21 @@ jdoe pts/18 192.168.0.11 Thu Sep 14 19:42 - 19:43 (00:03)
rocket pts/18 192.168.0.11 Thu Sep 14 13:02 - 13:02 (00:00) rocket pts/18 192.168.0.11 Thu Sep 14 13:02 - 13:02 (00:00)
shs pts/17 192.168.0.11 Thu Sep 14 12:45 still logged in shs pts/17 192.168.0.11 Thu Sep 14 12:45 still logged in
```
此命令仅显示自当前 `wtmp` 文件变为活跃状态以来已登录的用户。空白行表示用户自那以后从未登录过,但没有将其调出。一个更好的命令是过滤掉在这期间从未登录过的用户的显示:
``` ```
$ for user in `ls /home`; do echo -n "$user ";last $user | head -1 | awk '{print substr($0,40)}'; done
此命令仅显示自当前 wtmp 文件登录过的用户。空白行表示用户自那以后从未登录过,但没有将他们显示出来。一个更好的命令可以明确地显示这期间从未登录过的用户:
```
$ for user in `ls /home`; do echo -n "$user"; last $user | head -1 | awk '{print substr($0,40)}'; done
dhayes dhayes
jdoe pts/18 192.168.0.11 Thu Sep 14 19:42 - 19:43 jdoe pts/18 192.168.0.11 Thu Sep 14 19:42 - 19:43
peanut pts/19 192.168.0.29 Mon Sep 11 09:15 - 17:11 peanut pts/19 192.168.0.29 Mon Sep 11 09:15 - 17:11
rocket pts/18 192.168.0.11 Thu Sep 14 13:02 - 13:02 rocket pts/18 192.168.0.11 Thu Sep 14 13:02 - 13:02
shs pts/17 192.168.0.11 Thu Sep 14 12:45 still logged shs pts/17 192.168.0.11 Thu Sep 14 12:45 still logged
tsmith tsmith
``` ```
这个命令会打印很多,但是可以通过一个脚本使它更加清晰易用。 这个命令要打很多字,但是可以通过一个脚本使它更加清晰易用。
``` ```
#!/bin/bash #!/bin/bash
@ -180,13 +181,13 @@ for user in `ls /home`
do do
echo -n "$user ";last $user | head -1 | awk '{print substr($0,40)}' echo -n "$user ";last $user | head -1 | awk '{print substr($0,40)}'
done done
``` ```
有时,此类信息可以提醒您用户角色的变动,表明他们可能不再需要相关帐户。 有时这些信息可以提醒你用户角色的变动,表明他们可能不再需要相关帐户
### 与用户沟通 ### 与用户沟通
Linux 提供了许多方法和用户沟通。你可以向 `/etc/motd` 文件中添加信息,当用户从终端登录到服务器时,将会显示这些信息。你也可以通过例如 `write`(通知单个用户)或者 `wall``write` 给所有已登录的用户)命令发送通知。 Linux 提供了许多和用户沟通的方法。你可以向 `/etc/motd` 文件中添加信息,当用户从终端登录到服务器时,将会显示这些信息。你也可以通过例如 `write`(通知单个用户)或者 `wall`write 给所有已登录的用户)命令发送通知。
``` ```
$ wall System will go down in one hour $ wall System will go down in one hour
@ -194,30 +195,30 @@ $ wall System will go down in one hour
Broadcast message from shs@stinkbug (pts/17) (Thu Sep 14 14:04:16 2017): Broadcast message from shs@stinkbug (pts/17) (Thu Sep 14 14:04:16 2017):
System will go down in one hour System will go down in one hour
``` ```
重要的通知应该通过多个管道传递因为很难预测用户实际会注意到什么。mesage-of-the-daymotd`wall` 和 email 通知可以吸引用户大部分的注意力。 重要的通知应该通过多个渠道传达因为很难预测用户实际会注意到什么。mesage-of-the-daymotd`wall` 和 email 通知可以吸引用户大部分的注意力。
### 注意日志文件 ### 注意日志文件
更多地注意日志文件上也可以帮你理解用户活动。事实上,`/var/log/auth.log` 文件将会为你显示用户的登录和注销活动,组的创建等。`/var/log/message` 或者 `/var/log/syslog` 文件将会告诉你更多有关系统活动的事情。 多注意日志文件也可以帮你理解用户的活动情况。尤其 `/var/log/auth.log` 文件将会显示用户的登录和注销活动,组的创建记录等。`/var/log/message` 或者 `/var/log/syslog` 文件将会告诉你更多有关系统活动的日志。
### 追踪问题和请求 ### 追踪问题和需求
无论你是否在 Linux 系统上安装了票务系统,跟踪用户遇到的问题以及他们提出的请求都非常重要。如果请求的一部分久久不见回应,用户必然不会高兴。即使是纸质日志也可能是有用的,或者更好的是,有一个电子表格,可以让你注意到哪些问题仍然悬而未决,以及问题的根本原因是什么。确保解决问题和请求非常重要,日志还可以帮助您记住你必须采取的措施来解决几个月甚至几年后重新出现的问题。 无论你是否在 Linux 系统上安装了事件跟踪系统,跟踪用户遇到的问题以及他们提出的需求都非常重要。如果需求的一部分久久不见回应,用户必然不会高兴。即使是记录在纸上也是有用的,或者最好有个电子表格,这可以让你注意到哪些问题仍然悬而未决,以及问题的根本原因是什么。确认问题和需求非常重要,记录还可以帮助你记住你必须采取的措施来解决几个月甚至几年后重新出现的问题。
### 总结 ### 总结
在繁忙的服务器上管理用户帐户部分取决于从配置良好的默认值开始,部分取决于监控用户活动和遇到的问题。如果用户觉得你对他们的顾虑有所回应并且知道在需要系统升级时会发生什么,他们可能会很高兴。 在繁忙的服务器上管理用户帐号,部分取决于配置良好的默认值,部分取决于监控用户活动和遇到的问题。如果用户觉得你对他们的顾虑有所回应并且知道在需要系统升级时会发生什么,他们可能会很高兴。
----------- --------------------------------------------------------------------------------
via: https://www.networkworld.com/article/3225109/linux/managing-users-on-linux-systems.html via: https://www.networkworld.com/article/3225109/linux/managing-users-on-linux-systems.html
作者:[Sandra Henry-Stocker][a] 作者:[Sandra Henry-Stocker][a]
译者:[dianbanjiu](https://github.com/dianbanjiu) 译者:[dianbanjiu](https://github.com/dianbanjiu)
校对:[wxy](https://github.com/wxy) 校对:[wxy](https://github.com/wxy)、[pityonline](https://github.com/pityonline)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://www.networkworld.com/author/Sandra-Henry_Stocker/ [a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/