如何从脚本中为 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】:
您可以使用expect
或autoexpect
。不过,这是个坏主意。
切勿将系统密码写入书面文件。至少,不在所述系统上的文件上。在已知需要 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 的回答下查看我的评论。在此设置期间,我根本不想使用 sudo
。 expect
或 autoexpect
在这里有帮助吗?如果是这样,你能举个例子吗(我不熟悉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 提供密码?的主要内容,如果未能解决你的问题,请参考以下文章