我需要在 shell 脚本中以特定用户身份运行一些命令行。
我发现了(至少)两种方法:
su user -c 'command'
runuser -l user -c 'command'
这两个命令之间有显著的区别吗?
答案1
正如问题评论中所写,runuser 基本上是一个不使用 PAM 堆栈的 su。
为了提供更多细节,博客文章Dan Walsh(runuser 的作者之一)认为,runuser 实际上是从 su 源编译而来,只不过编译时排除了 PAM 堆栈。不同之处在于,使用 runuser 而不是 su 可以避免一些 SELinux 错误。该帖子还说:
每当服务以 root 身份运行并想要使用 shell 更改 UID 时,它都应该使用 runuser。
当您以用户身份登录到 shell 并想要成为 root 时,您应该使用 su。(或者更好的是 sudo)
答案2
runuser 不是“没有 PAM 的 su”(至少在 2023 年不是)。摘自 2.37.2 手册页:
runuser 命令和 su 命令之间的区别在于,runuser 命令不需要输入密码(因为它只能由 root 用户执行),并且它使用不同的 PAM 配置。runuser 命令不需要安装 set-user-ID 权限。 https://manpages.ubuntu.com/manpages/jammy/man1/runuser.1.html