如何以非 root 用户身份执行单个命令,同时脚本的其余部分以 root 权限运行?

如何以非 root 用户身份执行单个命令,同时脚本的其余部分以 root 权限运行?

我有一个脚本,用于检查我的系统上是否安装了 Java 版本 8。如果没有,脚本会安装它。此外,一旦确保安装了正确的 Java 版本,它就会检查$JAVA_HOME变量是否设置正确。

我通过将 JAVA_HOME 路径添加到我的文件来实现此目的/etc/environment。到目前为止,一切都正常。

然而,在下一步中,当我尝试/etc/environment使用source命令重新加载文件时,它不会加载新文件。

我认为这是由于用户运行脚本造成的。我以 root 用户身份运行脚本。但是我需要source /etc/environment以非 root 用户身份运行,然后让其余命令以 root 身份运行。

我尝试过使用 -u 命令执行 sudo 和使用 -u -c 命令执行 sudo,但都没有成功。任何关于如何执行此操作的提示都将非常有帮助。谢谢

答案1

我认为以 root 身份运行整个脚本(除了应该以其他用户身份运行的一个特定命令)的方法本质上是有缺陷的。我建议反过来做:以用户身份运行脚本,并在脚本中所有应该以 root 权限运行的命令前加上sudo

这样,你肯定不会偶然以 root 身份执行任何命令,而您本来可以以普通用户身份运行该命令。

请注意,脚本仍然只会询问您一次密码,因为在第一个 sudo 命令之后,sudo 会记住您的密码 15 分钟(默认情况下)。也就是说,除非您的脚本运行超过 15 分钟。即使这样,也可以增加 sudo 的默认超时时间,但这可能超出了这个问题的范围。

当然,这完全取决于你的情况。在某些情况下,反过来做可能更好:你也可以以 root 身份运行脚本,并通过在应该以 root 权限运行的命令前加上前缀来放弃 root 权限usernamesudo -u username另请参阅下面的评论这个答案简要讨论一下利弊。(请注意,上述答案本身就表明通常最好以 root 身份运行整个脚本并在需要时放弃权限,而不是以用户身份运行整个脚本并在需要时获取 root 权限。我不敢苟同。这当然完全取决于你的情况。从安全角度来看,后一种方法更安全。但如果这不是一个问题,前一种方法从技术角度来看有一些轻微的优势。请参阅链接答案下的讨论。)

相关内容