基本概念
在 Linux 系统中,su - miduser
和 su miduser
的主要区别在于 登录环境 的加载方式:
su - miduser
(或等价的su -l miduser
/su --login miduser
)- 模拟完整的登录过程。
- 系统会创建一个全新的、干净的登录环境,就像用户
miduser
通过终端或 SSH 首次登录一样。 - 它会读取并执行目标用户 (
miduser
) 的 Shell 启动配置文件:- 对于 Bash Shell:通常是
~/.bash_profile
,~/.bash_login
,~/.profile
(按顺序读取第一个存在的),并且 可能 会读取~/.bashrc
(取决于前面文件中的配置)。 - 对于 Zsh Shell:通常是
~/.zprofile
或~/.zlogin
。 - 对于其他 Shell:读取其对应的登录配置文件。
- 对于 Bash Shell:通常是
- 环境变量:目标用户 (
miduser
) 的配置文件设置的环境变量(如HOME
,USER
,LOGNAME
,PATH
,SHELL
,MAIL
等)会被完全初始化。 - 工作目录:切换到目标用户 (
miduser
) 的家目录 (/home/miduser
或/home/miduser
指定的目录)。 - 结果:你获得的环境与
miduser
用户自己登录系统后得到的环境几乎完全相同。所有用户自定义的设置和路径都生效。
su miduser
- 非登录切换。
- 系统不会模拟完整的登录过程。
- 它不会读取目标用户 (
miduser
) 的 Shell 登录配置文件 (~/.bash_profile
,~/.profile
,~/.zprofile
等)。 - 环境变量:大部分环境变量会从当前用户(执行
su
命令的用户)的环境中继承过来。关键的例外是USER
,HOME
,SHELL
会被设置为目标用户miduser
的值。 - 工作目录:保持当前目录不变,不会切换到
miduser
的家目录。 - 可能读取非登录配置文件:对于像 Bash 这样的 Shell,它通常会读取目标用户 (
miduser
) 的~/.bashrc
文件(如果存在),因为~/.bashrc
通常用于定义交互式非登录 Shell 的设置(别名、函数、提示符等)。但这不是su
命令本身的行为,而是由新启动的 Shell 决定的。 - 结果:你获得了
miduser
用户的身份权限 (uid
,gid
),但环境变量(尤其是PATH
)和当前工作目录仍然保留自切换前的用户。用户miduser
在登录配置文件中设置的环境变量(如自定义的PATH
,JAVA_HOME
等)不会生效,除非它们恰好在~/.bashrc
中定义并被读取。
关键区别
特性 | su - miduser (或 su -l miduser ) | su miduser |
---|---|---|
登录类型 | 登录 Shell | 非登录 Shell |
环境 | 全新环境 | 继承当前环境 (部分覆盖) |
配置文件 | 读取目标用户的登录配置文件 | 不读取目标用户的登录配置文件 |
.bashrc | 通常不直接读取 (可能间接加载) | 通常会读取 |
环境变量 | 目标用户的完整设置 (PATH , HOME 等) | USER , HOME , SHELL 被覆盖;其他变量(尤其是 PATH )继承自原用户 |
工作目录 | 切换到目标用户的家目录 | 保持切换前的当前目录 |
模拟程度 | 模拟完整用户登录 | 仅切换用户身份 |
使用哪种?
- 使用
su - miduser
:- 当你需要以
miduser
身份执行任务,并且希望环境(特别是PATH
和其他环境变量)与miduser
自己登录时完全一致。 - 当你需要确保脚本或命令在
miduser
的标准环境中运行。 - 当你需要操作
miduser
家目录下的文件,切换目录更方便。 - 这是最常用、最推荐的方式,因为它能提供目标用户预期的完整环境。
- 当你需要以
- 使用
su miduser
:- 当你只需要
miduser
的权限来执行一两条命令,并且明确希望保留当前的环境变量(尤其是PATH
)和当前工作目录。 - 这种情况相对少见,通常用于特定的调试或临时提权场景。容易因为环境不一致(如错误的
PATH
)导致命令找不到或行为异常。
- 当你只需要
简单记忆:
- 带
-
(短横线): 表示login
,代表完整的登录环境。获得用户的家目录和干净的配置文件设置。 - 不带
-
: 只切换用户身份,不改变环境(除了USER
,HOME
,SHELL
)和当前目录。环境变量(尤其是PATH
)是旧的,可能导致问题。
因此,在绝大多数情况下,su - miduser
是正确且推荐的选择,因为它能提供一个干净、符合预期的目标用户环境。