如何从脚本中为 sudo 提供密码?

Posted

技术标签:

【中文标题】如何从脚本中为 sudo 提供密码?【英文标题】:How to supply sudo with password from script? 【发布时间】: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) 但是我没有关注你……你能详细说明一下吗? 【参考方案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 ")

【讨论】:

恕我直言,这是真正回答问题的唯一答案。太棒了!

以上是关于如何从脚本中为 sudo 提供密码?的主要内容,如果未能解决你的问题,请参考以下文章

如何从需要SUDO的php调用shell脚本?

在 bash 脚本中为 git 提供密码

在 Bash 脚本中为 Git 提供密码

需要 sudo 密码的 Bash 脚本

在 bash 脚本中为 ssh 命令提供密码,无需使用公钥和 Expect

在脚本内使用没有密码的 sudo