【问题标题】:Remember root password throughout script using Bash使用 Bash 在整个脚本中记住 root 密码
【发布时间】:2018-03-30 14:47:29
【问题描述】:

背景

我有一个很长的 bash 脚本,它设置了一个大型互连软件环境,需要几个小时才能完成。它执行的一些任务需要以 root 身份运行,为此我使用sudo ...。然后整个过程暂停,直到用户注意到并输入 root 密码。我想办法让用户只在脚本开头输入root密码,然后在sudo以后需要时自动提供。

我对可能(坏)解决方案的看法

我可以将密码直接存储在一个变量中,然后使用

echo "${root_password}" | sudo -S ...

但有件事告诉我这是不好的做法。

另一种解决方法是强制用户以 root 身份运行整个脚本,但这不会导致在不使用 sudo 的情况下生成的所有文件的权限不同吗?

【问题讨论】:

  • 您也可以在脚本中使用sudoback 切换到原始用户,以执行例如应创建非root 拥有的文件的命令。您是正确的,存储 root 密码是一个坏主意。另一种可能性是配置sudo 以允许用户运行您的脚本(或只是脚本中需要root 权限的命令) 没有密码。其中很多只需要仔细考虑脚本的设计方式。
  • 例如,您能否将所有需要 root 的命令(并且仅这些命令)隔离到单独的下标,然后使用 sudo 运行?
  • @chepner 听起来不错。如何使用sudo从root变回用户?
  • 简单的答案是脚本内的sudo -u <origuser> ...。但是,我认为有一种方法可以从脚本中获取原始用户的身份,而这种假设似乎是错误的。我现在唯一能给出的答案是使用sudo script "$USER" ... 之类的东西调用脚本,以便脚本具有它应该降级的用户身份作为参数。
  • @chepner 如果没有别的,我可以使用sudo script $USER 签名让脚本调用自身,如果调用时不带参数。真正的问题是我不必将sudo -u <origuser> 添加到每个 命令(除了少数需要root 权限的命令)!我试过在子shell或函数中放置一堆命令,但是sudo不会接受它...

标签: bash passwords root sudo


【解决方案1】:

您可以在脚本的开头提示它,因此它不是硬保存的纯文本。

例子:

#!/bin/bash
read -s -p "[sudo] sudo password for $(whoami): " pass
echo $pass | sudo -S apt-get update

help read:

-r 不允许反斜杠转义任何字符

-s 不回显来自终端的输入

【讨论】:

  • 确实这就是我现在所拥有的。我不确定$pass 的内容是否可以被机器上的其他用户以某种方式提取,或者通过稍后查看 bash 历史记录等等。
  • 您始终可以在此特定脚本的 sudoers.d 中使用 NOPASSWD,这样就不会要求用户提供密码,因为它会被自动接受?
【解决方案2】:

我建议你弄清楚你需要脚本使用 SUDO 运行的所有命令,确保脚本由特殊的非特权用户(例如 scriptuser)运行,然后编辑 /etc/sudoers允许 scriptuser 使用 NOPASSWD

运行这些命令

举个例子:

scriptuser ALL = NOPASSWD: /bin/kill, /usr/bin/othercommand, etc.

如果您知道完整的命令,包括参数,这是理想的(这意味着破坏 scriptuser 帐户的攻击者只能以 root 身份运行这些特定命令)

Sudo 在 /etc/sudoers 中有 很多 个可配置的选项。如果您 man sudoers ,您应该看到所有这些。预警:这个手册页很难理解。查找示例。测试它们。在 StackExchange 上提问。

【讨论】:

    猜你喜欢
    • 2015-11-20
    • 2015-03-15
    • 2017-07-11
    • 2014-12-08
    • 1970-01-01
    • 2023-03-07
    • 2012-06-29
    • 2016-03-19
    相关资源
    最近更新 更多