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 的用户数据。
pwunconv
是 pwconv
的反向操作。
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
可以看到,PATH
和MAIL
等变量并没有切换到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_Alias
和 Cmnd_alias
配置来设置别名,配置使用的别名一定要使用大写。
例如,将 ADMUSER
指向用户 user1
和 user2
,ADMPW
指向 /usr/bin/passwd
,并排除掉直接运行 passwd
和 passwd 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