用户状态查看基础
了解当前系统用户状态是Linux系统管理的基本功。当多个用户同时登录系统时,管理员需要清楚谁在系统中、他们在做什么以及他们拥有什么权限。这些信息对于系统安全审计和故障排查都至关重要。
系统提供了多种命令来获取用户信息。whoami
简单直接,告诉你当前用户的身份;id
命令更详细,显示用户UID、GID以及所属的所有组;who
和w
命令则展示当前登录系统的所有用户,包括他们的登录时间和活动状态。掌握这些命令的组合使用,可以全面了解系统用户状态。
用户身份切换实战
使用su切换用户
su
命令是切换用户身份的基本工具。 任务要求:以root用户登录进行测试运行,①创建deng用户;②切换到deng用户并加载其环境变量;③查看当前的工作目录;④登出deng用户;⑤不加载环境变量的切换到deng用户;⑥再次查看当前的工作目录
bash
useradd deng # ①创建deng用户
su - deng # ②切换到deng用户并加载其环境变量
[deng@localhost ~]$ pwd # ③ 查看当前的工作目录
# **运行结果示例**
# /home/deng
[deng@study ~]$ exit # ④登出deng用户
su deng # ⑤不加载环境变量的切换到deng用户
[deng@study root]$ pwd
# **运行结果示例**
# /root
功能解析:
su - deng
:完整登录到用户 deng 的会话,完整登录到用户 deng 的会话,完整登录到用户 deng 的会话。su deng
:完整登录到用户 deng 的会话,只切换用户身份(UID 和 GID),不加载目标用户的配置文件和环境变量,不改变当前工作目录
使用sudo授权特定命令
sudo
机制提供了更精细的权限控制,避免直接分享root密码: 任务要求:以root用户登录进行测试运行。①创建lina用户;②授权lina用户无需密码执行useradd命令;③切换到lina用户并加载其环境变量;④添加new_user用户;⑤查看/etc/passwd文件中new_user用户的信息。
bash
useradd lina # ①创建lina用户
# ②授权lina用户无需密码执行useradd命令
visudo
# 按`i`进入编辑模式,将光标移动在文件末尾,添加:
lina ALL=(ALL) NOPASSWD: /usr/sbin/useradd
# 按`Esc`退出编辑模式,输入`:wq`保存并退出文件编辑
su - lina # ③切换到lina用户并加载其环境变量
[lina@localhost ~]$ sudo useradd new_user # ④添加new_user用户
grep new_user /etc/passwd # ⑤查看/etc/passwd文件中new_user用户的信息
# **运行结果示例**
# new_user:x:1002:1002::/home/new_user:/bin/bash
安全实践 :生产环境中应该限制sudo权限仅授予必要的命令,并尽可能指定参数范围。比如/usr/sbin/useradd -g dev*
只允许创建dev开头的组用户。
查看用户登录状态
了解当前登录用户情况有助于系统监控: 任务要求:继续上一案例。①查看当前登录信息;②查看详细活动信息;③退出deng账号回到root用户
bash
# ①查看当前登录信息
[lina@study ~]$ who
# **运行结果示例**
# root pts/0 2023-03-15 09:30 (192.168.1.100)
# deng pts/1 2023-03-15 10:15 (192.168.1.101)
# ②查看详细活动信息
[lina@study ~]$ w
# **运行结果示例**
# 22:03:07 up 1:01, 2 users, load average: 0.00, 0.01, 0.05
# USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
# root tty1 146月25 38days 0.02s 0.02s -bash
# root pts/0 192.168.226.1 21:21 3.00s 0.03s 0.01s w
[lina@study ~]$ exit # ③退出deng账号回到root用户
信息解读 :who
命令显示基本的登录会话信息,而w
命令额外提供了用户正在执行的命令和系统负载情况,对排查系统性能问题很有帮助。
案例与代码解析
su
的基本用法
任务要求:继续上一案例。①设置deng用户额密码;②切换到deng用户并加载其环境变量;③切换到root用户并加载其环境变量;④显示当前登录的用户;⑤退出root用户;⑥以root身份执行单条命令(不切换用户);⑦切换到deng用户并加载其环境变量;⑧显示当前登录的用户
bash
passwd deng # ①设置deng用户额密码
新的 密码:******
重新输入新的 密码:******
su - deng # ②切换到deng用户并加载其环境变量
su - root # ③切换到root用户并加载其环境变量
密码:****** # 输入root用户的登录密码
whoami # ④显示当前登录的用户 # 输出:root
exit # ⑤退出root用户
# ⑥以root身份执行单条命令(不切换用户)
[deng@study ~]$ su -c "ls /root"
密码:****** # 输入root用户的登录密码 # 输出:anaconda-ks.cfg
[deng@study ~]$ su - deng # ⑦切换到deng用户并加载其环境变量
密码: ****** # 输入deng用户的密码
[deng@study ~]$ whoami # ⑧显示当前登录的用户 # 输出:deng
解析:
su - root
:加载root
的环境变量(如$PATH
)。exit
:退出当前用户会话。su -c "命令"
:直接执行命令后退出,无需手动退出。
sudo
的基本用法与权限配置
任务要求 :继续上一案例。①以root身份执行命令ls -l /root
;②切换到root用户并加载其环境变量;③配置deng用户sudo权限;④切换到deng用户并加载其环境变量;⑤以root身份执行命令ls -l /root
bash
[deng@study ~]$ sudo ls -l /root # ①以root身份执行命令`ls -l /root`
[sudo] deng 的密码:****** # 输入deng用户密码,不能执行deng用户①以root身份执行命令没有sudo权
[deng@study ~]$ su - root # ②切换到root用户并加载其环境变量
密码:****** # root用户的密码
# ③配置deng用户sudo权限
sudo visudo # 编辑/etc/sudoers文件
# 按`i`进入编辑模式,将光标移动在文件末尾,添加:
deng ALL=(ALL) NOPASSWD:ALL # 允许demo_user无需密码执行所有命令
# 按`Esc`退出编辑模式,输入`:wq`保存并退出文件编辑
su - deng # ④切换到deng用户并加载其环境变量
[deng@study ~]$ sudo ls -l /root # ⑤以root身份执行命令`ls -l /root` # 输出:-rw-------. 1 root root 1228 8月 26 2021 anaconda-ks.cfg
解析:
visudo
:安全编辑/etc/sudoers
,避免语法错误导致sudo
不可用。NOPASSWD:ALL
:允许用户免密执行命令(需谨慎使用)。
常见问题解决方案
-
su认证失败
makefilesu: 认证失败
解决 :确认目标用户存在且密码正确;检查
/etc/shadow
中用户密码状态,确保未被锁定;尝试用root用户切换(无需密码) -
sudo命令找不到
bashsudo: useradd: command not found
解决 :使用完整路径
sudo /usr/sbin/useradd
;检查visudo
配置中是否指定了正确路径;确认该命令在PATH环境变量中 -
权限不足 lina is not in the sudoers file. 解决 :root用户需要先用
visudo
命令将lina添加到sudoers文件;或临时用su切换到root用户操作 -
环境变量错误 ~/.bashrc: Permission denied 解决 :使用
su -
完全切换用户;检查目标用户家目录权限是否正确(应为755);确认.bashrc文件属主正确
实战练习
理论题
- 解释
su -
与su
的区别 答案 :su -
会完全模拟目标用户登录,加载其环境变量和工作目录;而su
仅切换用户身份,保留原用户的环境设置 - 如何配置才能使lina用户无需密码执行
/sbin/shutdown
命令? 答案 :在sudoers文件中添加lina ALL=(ALL) NOPASSWD: /sbin/shutdown
,使用visudo
命令编辑确保语法正确 w
命令输出中的"JCPU"和"PCPU"分别表示什么? 答案:JCPU是该终端所有进程使用的CPU时间,PCPU是当前活动进程使用的CPU时间
实操题
-
当前是root用户,请完成:①切换到用户deng并加载完整环境;②验证当前用户和工作目录;③返回root用户 操作步骤:
bashsu - deng # ①切换到用户deng并加载完整环境 whoami && pwd # ②验证当前用户和工作目录 exit # ③返回root用户
-
当前是root用户,请完成:①创建testuser用户;②允许testuser用户执行useradd、userdel、usermod命令。 操作步骤:
bashuseradd testuser # ①创建testuser用户 # ②允许testuser用户执行useradd、userdel、usermod命令 visudo # 添加: testuser ALL=(ALL) /usr/sbin/useradd, /usr/sbin/userdel, /usr/sbin/usermod
-
当前是root用户,请完成:①显示当前登录用户;②显示用户活动详情;③显示自己的UID和所有组
操作步骤:
bashwho # ①显示当前登录用户 w # ②显示用户活动详情 id # ③显示自己的UID和所有组
总结
用户状态查看和身份切换是Linux系统管理的日常操作。su
命令适合需要完全切换身份的场合,而sudo
提供了更精细的临时权限提升。实际工作中,应该遵循最小权限原则,仅授予必要的sudo权限。查看用户状态时,w
命令比who
提供更多有用信息,特别是在排查系统负载问题时。环境变量问题经常困扰新手,记住su -
和su
的区别能避免很多麻烦。安全无小事,每次授予sudo权限前都应该仔细考虑可能带来的风险。良好的用户权限管理习惯,是维护系统安全的重要保障。