sudo
使用和 使用有什么区别吗su -c
?在某些情况下应该使用其中一种而不是另一种?
我之前使用的 Ubuntusudo
似乎无处不在,但现在我尝试使用 Fedora 15,su -c
当我尝试学习如何做一些事情时,这个习惯用法经常出现,尽管我仍然偶尔看到它sudo
被使用。
答案1
sudo
和之间的区别su
在于它们执行身份验证的方式:
su
提示输入目标用户的密码。sudo
检查源用户是否有权运行该命令(授权在 中指定/etc/sudoers
)。根据配置,它可能会提示输入源用户的密码,这既可以降低无人值守控制台的风险,又可以提醒用户权限升级正在进行。
一旦授权,效果是相同的:以 root 身份运行命令(或者,如果在命令行上指定,则以其他用户身份运行命令)。
还有进一步的细微差别:它们不采用相同的选项,并且它们不以完全相同的方式为运行的命令设置环境。 “命令”的含义略有不同:forsu -c
是由目标用户的 shell 执行的字符串,而 forsudo
没有选项,它是带参数运行的程序。但对于常见用法来说,它们是相同的。
答案2
它们在语义上是不同的。
使用su
意味着您不希望被调用的进程知道您不是真正的目标用户。手册页建议始终选择 option su --login
。
使用的sudo
意思正好相反。sudo
甚至设置一个新的环境变量SUDO_UID
来告诉进程你到底是谁。
顺便说一句,su
适用于古老的unix显示管理器或shell配置文件,它设置只有少量的环境变量( HOME
、PATH
等) 在调用交互式 shell 之前。并将su
重置这些变量。
然而,现代初始化系统设置了更多的环境变量。例如Linux PAM 设置XDG_RUNTIME_DIR
,它不会被重置su
。因此,su --login
无法模拟真实的登录。看https://github.com/systemd/systemd/issues/7451#issuecomment-346787237