Linux 用户管理

用户管理

针对用户的新增,删除,修改操作.

新增用户

可以使用 useradd 命令来新建用户。命令用法如下:

useradd [-u UID] [-g 初始组] [-G 次要组] [-nM] [-c 说明] [-d 主目录绝对路径] [-a shell] 用户名

主要参数如下:

参数 说明
-u 接 UID 数字,直接指定一个特定的 UID 号码
-g 接组名或 GID,设置初始用户组
-G 接组名或 GID,设置用户的附加组
-M 不创建用户主文件夹(系统账号默认值)
-m 创建用户主文件夹(一般账号默认值)
-c 用户说明文字内容
-d 指定用户主目录位置,必须使用绝对路径
-r 创建一个系统账号,UID 会有限制
-s 接指定的 shell,默认为 /bin/bash
-e 接日期格式 “YYYY-MM-DD”,设置账号失效日
-f 指定密码是否失效,0 为立刻失效,-1 为永不失效
-N 不创建同名的组
-p 设置密码

例如,新建立用户 user1,密码为 user1:

[root@101c7 bin]$ useradd -p user1 user1

设置一个 2040 年 1 月 13 日过期的临时用户 user2:

[root@101c7 bin]$ useradd -p passwd -e 2040-01-13 user2

修改密码

可以使用 passwd 命令来进行密码设置功能。主要参数如下:

参数 说明
-l 锁定密码,设置密码失效
-i 接日期,设置密码失效日期
-u 解锁密码
-n 设置修改密码限制周期
-x 设置密码使用最长天数
-w 密码过期前的警告天数

passwd 后不接账户名为设置当前账户密码。root 给别账号设置密码可以无视密码规则:

[root@101c7 bin]$ passwd user1

passwd 支持 --stdin 参数,使得可以在脚本中批量建立账户:

[root@101c7 bin]$ echo "abc" | passwd --stdin user1
Changing password for user user1.
passwd: all authentication tokens updated successfully.

可以用 chage 查看密码策略。例如查看 user1 的参数:

[root@101c7 bin]$ chage -l user1
Last password change                                    : Sep 13, 2021
Password expires                                        : never
Password inactive                                       : never
Account expires                                         : never
Minimum number of days between password change          : 0
Maximum number of days between password change          : 99999
Number of days of warning before password expires       : 7

另外 chage 还可以修改密码策略,例如修改密码最后修改时间为 0,用户下次登录时会被要求强制修改密码:

[root@101c7 bin]$ chage -d 0 user1

修改用户参数

可以使用 usermod 命令来修改已存在的用户设置,命令使用参数可参考 useradd 命令。

例如,修改用户 user7 的用户名为 user07,并修改用户主目录:

[root@server1 ~]$ usermod -d /home/user07 -m -l user07 user7

再例如,将用户 user1 的 shell 设置为 id,这样用户只能运行 id 命令:

[root@101c7 bin]$ usermod -s /usr/bin/id user1
[root@101c7 bin]$ su user1
uid=1000(user1) gid=1000(user1) groups=1000(user1) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

切换到 user1 时直接运行了 id 命令。修改 shell 还可以使用 chsh 命令来操作。

将 shell 指定为 /sbin/nologin 表示不能登录,并将尝试登录记录到 syslog 后台程序。可以修改 /etc/nologin.txt 文件来为 nologin 用户展示信息。

删除用户

可以使用userdel命令来删除用户和用户相关数据,指定-r参数可以连同用户主目录和邮件一起删除:

[root@101c7 ~]$ userdel -r user1

一般更建议先将用户停用,使用usermod -e 1让用户立即过期。

用户组管理

针对用户组的新增,修改,删除。

新增用户组

使用 groupadd 命令新建用户组,例如新建组 group1:

[root@101c7 ~]$ groupadd group1

修改用户组

可以通过 groupmod 命令来修改已存在的组名或 GID。比如将组 group1 改名为 newgroup:

[root@101c7 ~]$ groupmod -n newgroup group1

将组 user7 的 GID 改为 10007:

[root@server1 ~]$ groupmod -g 10007 user7
[root@server1 ~]$ tail /etc/group | grep user7
user7:x:10007:

删除用户组

使用 groupdel 可以删除无人使用的用户组(目标不能是初始用户组)。例如删除组 group2:

[root@101c7 ~]$ groupdel group2

用户组管理员

用户组管理员是设置一个组内的成员为管理用,专门管理哪些账号可以加入/移出该组。

管理用户组成员使用 gpasswd 命令。例如将 user2 设置为组 group2 的管理员:

[root@101c7 ~]$ gpasswd -A user2 group2

设置组密码:

[root@101c7 ~]$ gpasswd user2
Changing the password for group user2
New Password: 
Re-enter new password: 

管理员可以使用 -a 参数将其他用户加入到管理的小组。比如将 user3 加入到 group2:

[root@101c7 ~]$ gpasswd -a user3 group2
Adding user user3 to group group2

查询信息

可以使用多种命令来查询用户和组的详细信息。

查询用户信息

通过id命令可以查询到用户的 UID 和 GID 信息,例如查询用户user2:

[root@101c7 ~]$ id user2
uid=1001(user2) gid=1001(user2) groups=1001(user2)

可以使用whoami命令显示当前登录的用户名,等同于id -un:

[root@101c7 ~]$ whoami
root

查询用户属组信息可以使用groups命令,例如查询user1的所属组:

[root@101c7 ~]$ groups user1
user1 : user1 root

finger命令是一般用户可以使用的用户信息数据查询工具,例如查询root用户的信息:

[root@101c7 ~]$ finger root
Login: root                             Name: root
Directory: /root                        Shell: /bin/bash
On since Sat Sep 11 09:35 (EDT) on tty1    1 day 20 hours idle
On since Sat Sep 11 07:08 (EDT) on pts/0 from 192.168.2.101
   3 seconds idle
Last login Mon Sep 13 05:48 (EDT) on pts/1
No mail.
No Plan.

如果不加参数,finger查询出来的是目前在系统上登录的用户与登录时间。

[root@101c7 ~]$ finger
Login     Name       Tty      Idle  Login Time   Office     Office Phone   Host
root      root       tty1       1d  Sep 11 09:35           
root      root       pts/0          Sep 11 07:08                           (192.168.2.101)

修改用户附加信息

若要修改 finger 命令输出结果中的 Office、Phone 等信息,可以使用 chfn 命令。

输入 chfn 命令后,会进入交互式输入页面:

[root@101c7 ~]$ chfn
Changing finger information for root.
Name [root]: assassing
Office []: STU
Office Phone []: 010-8515834
Home Phone []: none

Finger information changed.

修改的内容实际存放在 /etc/passwd 文件中第五个字段中。

查询用户登录信息

使用who命令可以简单查看当前在线的用户:

[root@101c7 ~]$ who
root     tty1         2021-09-11 09:35
root     pts/0        2021-09-13 08:19 (192.168.2.101)
root     pts/1        2021-09-13 11:38 (192.168.2.101)

使用w命令可以看到更详细的在线用户信息,包括系统资源使用和最后执行的命令:

[root@101c7 ~]$ w
11:38:55 up 3 days, 20:30,  3 users,  load average: 0.01, 0.02, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty1                      Sat09    2days  0.01s  0.01s -bash
root     pts/0    192.168.2.101    08:19    7.00s  0.11s  0.00s w
root     pts/1    192.168.2.101    11:38   45.00s  0.01s  0.00s -bash

要查询用户的登录动作记录,可以使用last命令:

[root@101c7 ~]$ last
root     pts/1        192.168.2.101    Mon Sep 13 11:38   still logged in   
root     pts/0        192.168.2.101    Mon Sep 13 08:19   still logged in   
root     tty1                          Sat Sep 11 09:35   still logged in   
root     pts/1        192.168.2.101    Sat Sep 11 08:58 - 06:09 (1+21:10)

想知道每个账号最后登录时间可以使用lastlog命令,它会去读取/var/log/lastlog文件:

[root@101c7 ~]$ lastlog
Username         Port     From             Latest
root             pts/1    192.168.2.101    Mon Sep 13 11:38:10 -0400 2021
bin                                        **Never logged in**
daemon                                     **Never logged in**

配置检查工具

使用pwck命令可以检查 /etc/passwd 文件是否正确:

[root@101c7 ~]$ pwck
user 'ftp': directory '/var/ftp' does not exist
pwck: no changes

pwconv 命令将 /etc/passwd 内的账号与密码移动到 /etc/shadow 中,用来迁移早期 Linux 的用户数据。

pwunconvpwconv 的反向操作。

chpasswd 用来读入未加密前的密码,并将加密后的密码写入到 /etc/shadow 中。例如修改 user1 的密码:

[root@101c7 ~]$ echo "user1:newpassword" | chpasswd 

用户交流

Linux 内置的几个命令可以直接和系统内其他用户交流。

在线交流

例如使用write可以直接将信息传给其他在线用户:

[root@101c7 ~]$ write root
write: root is logged in more than once; writing to pts/1
my message1

输入完毕用Ctrl+d结束并发送,对面会立即收到信息。

[user1@101c7 ~]$ 
Message from root@101c7 on pts/0 at 11:45 ...
my message1
EOF

想要关闭消息接受可以使用mesg n命令(重新打开用mesg y)。

群发消息

使用wall命令能发送广播,让所有在线的用户都收到消息:

[user1@101c7 ~]$ wall "911"
[user1@101c7 ~]$ 
Broadcast message from user1@101c7 (pts/1) (Mon Sep 13 11:52:06 2021):

911

用户切换

在用户间切换使用su命令(switch user)。一般用户切换到 root 需要 root 的密码。命令格式为:

su [-lm] [-c 命令] [用户名]

可用参数如下:

参数 说明
- 代表使用 login-shell 的变量文件读取方式来登录
-l 也是 login-shell 的方式,后面需要加账号
-m 使用目前的环境设置,而不读取新用户的配置文件
-c 仅运行一次命令,后面加要执行的命令

non-login shell

使用su命令仅切换用户身份时,将以非登录 Shell 方式登录,此方式不会读取用户配置文件。例如,切换到user1

[root@101c7 dir2]$ su user1
[user1@101c7 dir2]$ env | grep 'root'
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
MAIL=/var/spool/mail/root
PWD=/root/sdb4m/dir1/dir2

可以看到,PATHMAIL等变量并没有切换到user1

login shell

要使用登录 Shell 的方式登录需要记得使用 -(切换到 root)或 -l 参数:

[root@101c7 dir2]$ su -l user1
Last login: Mon Sep 13 08:11:48 EDT 2021 on pts/0

使用 -c 参数能很方便地使用其他账户身份运行命令而并不需要登录:

[root@101c7 dir2]$ su -l user1 -c 'whoami'
user1

用 sudo 执行命令

通过 sudo 命令,能让在 /etc/sudoers 文件中列出的用户使用其他用户的身份(包括 nologin 的系统用户)来执行命令。使用方法如下:

sudo [-b] [-u 其他用户名]

例如,以 user2 的身份在 /tmp 目录下新建名为 us2 的文件:

[root@101c7 ~]$ sudo -u user2 touch /tmp/us2 ; ll -l /tmp/us2
-rw-r--r--. 1 user2 user2 0 Sep 13 08:24 /tmp/us2

如果要运行一连串命令,使用 sh -c 将命令用双引号括起来:

[root@101c7 ~]$ sudo -u user2 sh -c "touch /tmp/us1; mv /tmp/us1 /tmp/us3";ll /tmp/us3
-rw-r--r--. 1 user2 user2 0 Sep 13 08:29 /tmp/us3

设置 sudoers

使用 visudo 命令设置 sudo 配置文件 /etc/sudoers。例如,将 user1 加入到 sudoers 中:

[root@101c7 ~]$ visudo
## Allow root to run any commands anywhere
root     ALL=(ALL)       ALL
user1    ALL=(ALL)       ALL

第二段 (ALL)=(ALL) 表示登录者的来源主机名=(可切换的身份),第三段表示可执行的命令。必须使用绝对路径指定。

切换到 user1 使用 sudo 运行命令:

[user1@101c7 root]$ sudo ll /root

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.
[sudo] password for user1: 
sudo: ll: command not found

输入 user1 的密码后可以自由使用 sudo。如果两次 sudo 操作的间隔超过 5 分钟,需要重新输入一次密码。

设置用户组 %group2 可以不需要密码使用 sudo

[root@101c7 ~]$ visudo
root       ALL=(ALL)       ALL
%group2    ALL=(ALL)       NOPASSWD:ALL

可以通过 User_AliasCmnd_alias 配置来设置别名,配置使用的别名一定要使用大写。

例如,将 ADMUSER 指向用户 user1user2ADMPW 指向 /usr/bin/passwd,并排除掉直接运行 passwdpasswd root 命令(都为给 root 修改密码):

[root@101c7 ~]$ visudo
User_Alias ADMUSER = user1, user2
Cmnd_Alias ADMPW = /usr/bin/passwd [A-za-z]*, !/usr/bin/passd, !/usr/bin/passwd root
ADMUSER   ALL=(root)       NOPASSWD:ADMPW

使用 sudo -l 可以查询当前 sudo 权限设置情况:

[root@server1 ~]$ sudo -l
Matching Defaults entries for root on server1:
    !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME
    HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE
    LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE",
    env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin

User root may run the following commands on server1:
    (ALL) ALL