我应该在脚本中使用 sudo 还是对整个脚本使用 sudo?

我应该在脚本中使用 sudo 还是对整个脚本使用 sudo?

我为学生运行了一小组 macOS 机器(大约 20 台),它们都需要安装 homebrew 和其他软件包和应用程序。我正在编写一个 bash 脚本来自动在每台计算机上安装所需的所有东西。我将使用的某些命令需要以 root 身份运行,但大多数命令不需要。

我想知道是单独对脚本中的每个命令执行 sudo 更好,还是将 sudo 排除在脚本之外并对整个脚本执行 sudo。我想知道哪一个更安全(安全方面),并且更适合我的情况。我宁愿在整个脚本中不提示输入密码,但我也不想以 root 身份运行脚本中的每一行,因为这不安全。

答案1

遵循最小权限原则,尽可能少地以 root 身份运行。因此,请在脚本内使用 sudo。

请注意,第一次执行需要 sudo 的命令时,系统可能会提示您输入密码。(如果您在 /etc/sudoers 中使用 NOPASSWD,则不会出现这种情况,因为许多人会避开这种技术,因为它也不安全。)但是,当您运行 sudo 并提供密码时,sudo 会在一段时间内记住成功。默认情况下,这段时间为五分钟。因此,如果您运行“sudo echo hi”,输入密码,然后很快运行脚本,那么在运行脚本时就不需要提示您输入密码。更现实的是,如果您只运行脚本,您可能只会被要求输入一次 sudo...假设您的脚本在几分钟内完成剩余任务。

我可能不会担心一些echo命令,但如果有大量内容可以在没有额外权限的情况下完成,那么为了安全起见,我通常喜欢以最小的权限最大化地完成工作。

作为最小化权限的示例,让我向您展示另一个示例场景。而不是:
sudo -c "sample-command >> /var/log/output.txt"

我喜欢使用:
sample-command | sudo tee -a /var/log/output.txt >> /dev/null

通过这样做,整个命令无需 sudo 即可运行,最终具有增强权限的唯一部分是需要增强权限的部分,即写入文件的部分。

显然,我的目标是尽量减少提升的次数。同样,如果您的整个脚本不需要提升,那么首选方法(从安全角度来看)是尽量减少提升的次数。

答案2

取决于命令是什么。对于从互联网上下载的命令,最好不要以 root 身份运行它们。但其他命令应该可以以 root 身份运行。我会将命令分成两个脚本:一个用于非 root 命令,一个用于 root 命令

如果我能获得命令列表,也许我可以提供更多帮助。

答案3

通常,(我假设)您希望脚本像任何其他命令/应用程序/实用程序一样被处理。在这种情况下,通常不会提示您输入密码来提升您的权限;您只会被拒绝,并收到错误。类似:
Permission denied, 或者Operation not permitted

但是,您特别提到:
“...不想以 root 身份运行脚本中的每一行...”
因此,我实际上没有看到sudo除了在相关的特定代码行中明确且专门地调用之外的替代方法。

您还提到您将:
“...在整个脚本过程中不要提示输入密码...”
而且很可能你不会。除非操作之间间隔了相当长的时间,否则每次调用 sudo 时都不会提示你。

答案4

root这里有一个解决方案:使用以原始用户身份运行脚本sudo,并使用 运行任何不需要提升权限的命令sudo -u $SUDO_USER <command>

以下是一个示例脚本example.sh

#!/bin/bash

if [ "$(whoami)" != "root" ] ; then
    echo "Run this script with sudo" >&2
    exit 1
fi

sudo -u "${SUDO_USER:-$USER}" this_command_run_as_user
this_command_run_as_root
this_command2_run_as_root

你可以像这样运行它:

sudo ./example.sh

这样做的好处是,脚本开始时最多只会请求一次用户密码。您无需担心超时sudo

相关内容