【问题标题】:Should bash scripts use sudo, or assume sudo?bash 脚本应该使用 sudo,还是假设 sudo?
【发布时间】:2014-07-25 05:37:04
【问题描述】:

哪种模式更可取:

#!/bin/bash
echo Installing blah
apt-get install -y blah

...如果在没有 root 权限的情况下运行会失败,或者:

#!/bin/bash
echo Installing blah
sudo apt-get install -y blah

...只要用户具有 sudo 访问权限,就会成功。

我倾向于使用第二种模式,但似乎很少见,所以我想问一下它的缺点是什么。我看到的好处是:

  • 很清楚哪些命令实际上需要超级用户权限才能运行(如果读者想将脚本分开,这很有用)
  • 为用户节省了几次击键次数。

我想缺点包括使用 root 权限可能会令人惊讶(“我没有输入 sudo,所以我没想到会运行 apt-get 之类的东西......”)。还有什么?

【问题讨论】:

  • 如果用稍微复杂一点的方法呢?首先,您可以检查用户的id。或者您可以运行apt-get install -y blah,如果失败,请询问用户是否以 sudo 身份运行?
  • 遗憾的是,大多数 shell 脚本问题的正确方法很少见。
  • 有很多支持使用sudo的论据。但是,AFAIK,sudo 不是基本系统的一部分。在您的脚本中使用它需要用户安装(并可能配置)该可选软件。

标签: linux bash permissions sudo


【解决方案1】:

我更喜欢第二种模式, 因为使用 sudo 运行几个命令更好,而不是使用 root 权限运行整个脚本,其中一些命令不需要具有 root 访问权限,因此如果您使用 root 用户执行这些命令,进一步使用该命令输出将再次需要 root 访问权限,否则您将拥有改变所有权。 所以我会更喜欢第二种方法,其中 sudo 是必要的,否则去本地用户。

【讨论】:

  • +1 只有 需要 以 root 身份运行的命令才应该。在 OP 的情况下,假设系统配置为自动让用户以 root 身份运行 apt-get 而无需密码,但不允许通过 sudo 执行任何其他命令。选项 1 完全阻止用户运行脚本;选项 2 允许用户运行脚本并且不需要密码。
【解决方案2】:

您可以随时测试用户是否为 root(id -u 获取当前用户的 uid,0 为 root),如果不是,则运行 sudo -

#!/bin/bash

echo Installing blah
CMD=""
if [ "$(id -u)" != "0" ]; then
  CMD="sudo"
fi
${CMD} apt-get install -y blah

如果他们不是 root,更常见的方法是退出并出现错误条件,

#!/bin/bash
if [ "$(id -u)" != "0" ]; then
  echo "sudo $0 (must run as root)"
  exit 1
fi
echo Installing blah
apt-get install -y blah

【讨论】:

  • 第一个选项毫无意义,因为sudo 本质上是root 用户的无操作——只需在需要的地方硬编码sudo。第二个选项忽略了以 root 身份运行比必要的命令更多的主要问题。
【解决方案3】:

第二个选项是正确的选项。不需要 root 访问权限的命令不应以 root 身份运行,只是为了简化您的脚本。确实需要 root 访问权限(或任何特定用户的访问权限)的命令应该由 sudo 运行。为清楚起见,您可以使用sudo-p 选项来显示自定义提示,该提示可以准确解释为什么要求用户输入密码。

选项二也更可取,因为sudo 是高度可配置的,并且用户可能已经有权使用sudo 运行特定命令没有密码,所以用户可能不会密码提示给您带来不便。不太可能允许用户在没有密码的情况下sudo 任意命令(例如您的脚本)。

【讨论】:

    猜你喜欢
    • 2019-01-21
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多