在Linux系统中,用户切换是一项常见且重要的操作,无论是系统管理员进行权限管理,还是普通用户临时执行特定权限的任务,都需要掌握正确的用户切换方法,Linux提供了多种切换用户的命令,每种命令的适用场景、权限要求和行为特点各不相同,合理选择这些命令能够有效提升系统操作的安全性和效率,本文将详细解析Linux中切换用户的核心命令,包括其语法、参数、使用场景及注意事项,并通过表格对比不同方法的差异,最后针对常见问题提供解答。

使用su命令切换用户
su(substitute user或switch user)是Linux中最基础的切换用户命令,允许当前用户切换至其他用户身份,包括普通用户之间切换、普通用户切换至root用户,以及root用户切换至任意普通用户。
基本语法
su [选项] [目标用户]
- 选项:控制切换行为(如是否加载目标用户环境变量、是否执行命令等);
- 目标用户:可选参数,默认切换至root用户(若当前非root用户)。
常用选项及示例
-
切换至root用户(不加载环境变量):
直接输入su,系统会提示输入目标用户(默认root)的密码,切换后,当前目录、环境变量等仍继承自原用户,仅用户身份和权限发生变化。su # 输入root密码后切换,$提示符可能不变(需通过`whoami`确认)
-
完全切换至root用户(加载目标用户环境变量):
使用或-l选项,会重新加载root用户的环境变量(如~/.bash_profile、~/.bashrc),模拟root用户的登录状态,推荐使用此方式以避免环境变量冲突。su - # 或 su -l root,输入密码后,提示符变为#,环境变量完全切换
-
切换至指定普通用户:
若当前为root用户,可直接切换至任意普通用户,无需输入目标用户密码;若当前为普通用户,需输入目标用户密码。su -l test # 切换至test用户,加载其环境变量,提示符变为$
-
切换用户并执行单条命令:
使用-c选项,可在切换用户身份后执行指定命令,执行完毕后自动返回原用户身份,适合临时需要特定权限的场景。su -l test -c "ls /home/test" # 以test用户身份执行ls命令,无需切换会话
-
保留当前环境变量切换:
使用-m或-p选项,切换后仍保留当前用户的环境变量,可能导致权限问题(如某些命令依赖特定环境变量),需谨慎使用。
su -m test # 切换至test用户,但环境变量不变
注意事项
- 普通用户切换至其他用户(包括root)时,必须知道目标用户的密码;
- root用户切换至任意用户无需密码,但建议仅在必要时使用root权限;
- 使用
su -或su -l可避免因环境变量缺失导致的命令执行错误,是更安全的选择。
使用sudo命令临时提升权限
sudo(superuser do)允许授权用户以其他用户身份(通常是root)执行命令,与su完全切换用户身份不同,sudo默认仅临时提升权限,且不切换环境变量,执行完命令后自动恢复原用户身份。
基本语法
sudo [选项] [命令]
- 选项:控制权限提升行为(如指定目标用户、是否输入密码等);
- 命令:需要以更高权限执行的命令。
常用选项及示例
-
以root身份执行命令:
默认情况下,授权用户执行sudo时,系统会提示输入当前用户的密码(而非root密码),验证通过后执行命令。sudo ls /root # 输入当前用户密码后,以root身份列出/root目录内容
-
以指定用户身份执行命令:
使用-u选项可指定目标用户(非root),需在sudoers文件中配置相关权限。sudo -u test cat /home/test/file.txt # 以test用户身份读取文件
-
模拟目标用户的登录shell:
使用-i选项,会加载目标用户的环境变量,并启动其登录shell,行为类似su -l,但权限仅限当前命令。sudo -i -u test # 模拟test用户的登录shell,输入当前用户密码后,提示符变为$
-
免密码执行命令:
在sudoers文件中配置NOPASSWD关键字,可使特定用户或命令免密码执行(需谨慎使用,避免安全风险)。echo "$USER ALL=(ALL) NOPASSWD: /usr/bin/apt" >> /etc/sudoers # 当前用户免密码执行apt sudo apt update # 无需输入密码
sudoers文件配置
sudo的权限通过/etc/sudoers文件控制,推荐使用visudo命令编辑(可避免语法错误导致权限失效),常见配置规则如下:

用户名 主机名=(目标用户) 命令:例如test ALL=(ALL) /bin/ls, /bin/cat,允许test用户在任何主机上以任意用户身份执行ls和cat命令;%组名 主机名=(目标用户) 命令:%sudo ALL=(ALL:ALL) ALL,允许sudo组内的用户执行所有命令(Ubuntu系统默认配置)。
与su的区别
su完全切换用户身份,需目标用户密码;sudo临时提升权限,需当前用户密码(或免密码);su会加载目标用户环境变量(若使用-l),sudo默认保留当前环境变量(除非使用-i);sudo权限更精细,可限制到特定命令,安全性更高;su权限无限制,适合长期需要目标用户身份的场景。
使用newgrp切换用户组
虽然newgrp主要用于切换用户组(而非用户身份),但在特定场景下(如用户需加入多个组并切换主组),可视为用户切换的补充操作。
基本语法
newgrp [目标用户组]
- 若用户已在目标组中,切换后无需输入密码;若不在,需输入目标组的组密码(通常不设置,避免安全风险)。
示例
groups # 查看当前用户所属组,如test : test sudo newgrp sudo # 切换主组为sudo,新创建的文件默认属组为sudo
用户切换方法对比
| 命令 | 切换对象 | 是否需密码 | 是否加载目标环境变量 | 适用场景 |
|---|---|---|---|---|
su |
用户身份 | 是(普通用户切换) | 否(默认)/ 是(-l) |
完全切换用户身份,长期操作 |
su - |
用户身份 | 是(普通用户切换) | 是 | 完全切换用户身份,需独立环境 |
sudo |
临时权限 | 是(可免密码) | 否(默认)/ 是(-i) |
执行特定特权命令,短期操作 |
newgrp |
用户组 | 可能(需组密码) | 是 | 切换主组,文件权限管理 |
注意事项
- 安全风险:root权限应严格限制,避免长期使用
su切换至root,优先使用sudo; - 环境变量:
su不加-l可能导致环境变量缺失,推荐使用su -; - 密码管理:定期更换用户密码,避免在
sudoers中配置不必要的免密码规则; - 退出切换:切换用户后,可通过
exit命令返回原用户身份,避免多用户会话混淆。
相关问答FAQs
Q1:su和sudo有什么根本区别?
A:su是完全切换用户身份,需目标用户密码,会加载目标用户环境变量(若使用-l),适合需要长期以目标用户身份操作的场景;sudo是临时提升权限,需当前用户密码(或免密码),默认保留当前环境变量,适合执行特定特权命令,权限可精细到具体命令,安全性更高。su是“变成目标用户”,sudo是“以目标用户权限执行命令”。
Q2:为什么用sudo切换用户时有时候不需要密码?
A:sudo是否需要密码取决于/etc/sudoers文件的配置,若配置了NOPASSWD关键字(如test ALL=(ALL) NOPASSWD: ALL),则该用户执行所有sudo命令均无需输入密码;或配置了timestamp_timeout(如Defaults:timestamp_timeout=30),则在30分钟内再次执行sudo无需重复输入密码,需注意,免密码配置可能带来安全风险,应谨慎使用。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/28882.html