sudo -su user1 与 su - user1 都可以让当前用户切换到 user1 的身份执行命令或进入该用户的交互式 shell。但它们在权限认证方式、环境变量继承和 shell 初始化过程等方面存在一些差异。
权限认证方式
su - user1
su是 “switch user” 的缩写,默认情况下需要你输入目标用户 (user1) 的密码(如果你当前是非 root 用户)。- 如果你是 root 用户执行
su - user1,则无需输入密码。
sudo -su user1
sudo是根据/etc/sudoers配置文件来判断是否有权限以user1的身份执行命令。- 当你使用
sudo -su user1时,不需要知道user1的密码,而是需要当前用户对sudo的授权(通常输入当前用户自己的密码,或在无密码配置的 sudo 情况下无需密码)。
环境和 shell 初始化
su - user1
- 带
-的su会启动一个仿真登录(login shell),类似于login用户过程。 - 这意味着它会读取
user1的登录 shell 初始化文件(例如.bash_profile、.profile等),并清空大部分环境变量,用user1的默认环境变量替换。 - 换句话说,是以
user1完整登录环境启动 shell,会切换到user1的主目录,并以user1的 shell 配置为准。
sudo -su user1
- 这里的
sudo -su user1实际上等价于sudo -s -u user1,-s选项告诉sudo启动一个交互式 shell,但这个 shell 不一定是一个“登录 shell”。 sudo默认会保留调用者的一些环境变量(除非你使用sudo -i来模拟登录)。- 因此,与
su - user1相比,sudo -su user1启动的 shell 环境更接近原先用户的环境,而不是完全清空和重新载入user1的登录配置。
总结对比
认证方式:
su - user1:需要user1的密码(除非当前是 root)。sudo -su user1:需要当前用户在sudoers中有权限,以自身认证方式(当前用户密码或无密码sudo)切换,无需user1的密码。
环境初始化:
su - user1:像登录user1一样初始化 shell 环境,清空并使用user1的环境变量和启动文件。sudo -su user1:以sudo的方式切换用户,但不完全模拟登录,会保留一些原用户环境变量,shell 初始化不如su - user1的完整。
如果你的目标是完全以 user1 的身份和环境进入新 shell(包括环境变量、主目录、初始化文件等),su - user1 更接近一个“干净”的登录环境。
如果只是需要以 user1 的权限执行命令且无需 user1 的密码,那么使用 sudo -su user1 会更加方便。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论