【问题标题】:How to supply sudo with password from script?如何从脚本中为 sudo 提供密码?
【发布时间】:2014-09-13 13:39:16
【问题描述】:

请注意:这是在我的本地机器上运行的来宾 VM (VBox),我不担心安全问题。

我正在编写一个脚本,该脚本将以myuser 用户身份在 Linux (Ubuntu) VM 上执行。该脚本将在/etc/myapp 下创建一个非常大的目录树。目前我必须手动完成所有这些,首先是我在/etc 下授予myuser recrusive rwx 权限,如下所示:

sudo chmod -R 777 /etc
[sudo] password for myuser:  <now I enter the password and hit ENTER>

我的问题:如何编写一个 bash 脚本,为 sudo 命令提供我的密码,以便我可以执行 bash myscript.sh 并为我进行必要的权限更改?

【问题讨论】:

  • (如果您有远程安全意识):您不会在脚本中嵌入密码;相反,您将 sudo 配置为根本不要求输入密码(在运行该命令时,作为该用户)。有关文档,请参阅 man sudoers
  • ...但是,如果你有远程安全意识,你也不会EVER chmod 777 整个/etc。请记住,o+rwx 不仅意味着您有意授予对计算机的访问权限的用户 - 它还意味着以 nobody 帐户运行的不受信任的进程(包括处理入站未经身份验证的网络连接的进程)获得绝对修改权限您系统上的所有内容,包括密码。
  • 感谢@CharlesDuffy (+1) - 我应该提到,这是一个在我的机器上本地运行的 VBox VM,并且没有运行任何重要/安全的东西。所以没有(!)我什至没有远程这里的安全意识!
  • 如果你想让每个人都通过询问 sudo 无需密码就可以做任何事情,也许这应该是你的问题。
  • 谢谢@CharlesDuffy (+1) 但是我没有关注你……你能详细说明一下吗?

标签: linux bash file-permissions sudo


【解决方案1】:

您可以使用expectautoexpect。不过,这是个坏主意。

切勿将系统密码写入书面文件。至少,不在所述系统上的文件上。在已知需要 root 访问权限的安装脚本上要少得多。你让自己很容易成为目标。

您要做的是通过/etc/sudoers/ 配置sudo 以允许该用户在没有密码的情况下执行该脚本

myuser ALL=(ALL) NOPASSWD : /path/to/script

注意:

  • 如果您删除 /path/to/script 部分,myuser 将能够在没有密码的情况下使用 sudo

  • 如果您将myuser 更改为ALL,则每个人都可以在没有密码的情况下运行该脚本。

【讨论】:

  • 谢谢!但是sudo chmod -R 777 /etc | mypassword 不也可以工作吗?
  • @IAmYourFaja,首先,因为语法错误。其次,因为 sudo 从 TTY 读取密码,而不是从标准输入。
  • @IAmYourFaja, ...这就是为什么这里的答案建议expect,它模拟一个 TTY,如果你真的想以向全世界宣传你的密码的方式来做(而不是在正常情况下,即使在系统被入侵后,也只能恢复密码的加盐哈希)。
  • 再次感谢,但请在 Charles Duffy 的回答下查看我的评论。在此设置期间,我根本不想使用 sudoexpectautoexpect 在这里有帮助吗?如果是这样,你能举个例子吗(我不熟悉expect)?再次非常感谢!
  • @IAmYourFaja,...是的,expect 会有所帮助,但这太愚蠢了。你是如何开始进入这种情况的?如果您的 VM 安装了来宾操作系统,为什么不能同时将具有 root 权限的 RSA 公钥安装到 ~root/.ssh/authorized_keys 并使用它来提升权限?
【解决方案2】:

如果如你所说,你完全不关心安全......

运行 visudo 以编辑 /etc/sudoers 并进行验证。添加以下行:

ALL ALL=(ALL) NOPASSWD: ALL

这将防止sudo 向任何用户、任何命令询问密码。

【讨论】:

  • 谢谢@Charles Duffy (+1) - 但是sudo chmod -R 777 /etc | mypassword 不也可以吗?
  • @IAmYourFaja,您为什么/如何期望将 sudo(没有输出)的输出通过管道传输到名为“mypassword”的程序中以执行任何有用的操作?
  • @IAmYourFaja, ...现在,如果您问为什么 echo mypasswd | sudo ... 不起作用,那是因为出于安全原因 sudo 不会从标准输入读取密码;相反,它从 TTY 中读取它们。
  • 再次感谢@Charles Duffy (+1) - 但是当我从命令行运行visudo 时,它显示Permission denied。要运行它,我需要执行sudo visudo,然后提供我的密码。 这违背了我正在尝试做的事情的目的。我需要能够在此 VM 上授予自己权限,而不必使用 sudo!想法?
  • @IAmYourFaja, visudo 是您手动运行一次手动配置权限的东西,该权限随后会保留。它不是用于程序化使用的工具。
【解决方案3】:

(重击)
好的,如果你必须这样做,(牢记安全警告):

$ sudo -S ")

【讨论】:

  • 恕我直言,这是真正回答问题的唯一答案。太棒了!
猜你喜欢
  • 2021-07-19
  • 2023-03-26
  • 2012-12-10
  • 1970-01-01
  • 1970-01-01
  • 2016-03-13
  • 2015-09-21
  • 2011-12-28
  • 2018-06-01
相关资源
最近更新 更多