如果我sudo执行一个Bash脚本文件,那么Bash脚本中的所有命令是否也将作为sudo执行?


30

我想在Bash中编写一个自动化的安装后脚本(post-install.sh例如,称为)。该脚本将自动添加和更新存储库,安装和更新软件包,编辑配置文件等。

现在,如果执行该脚本(例如使用)sudo post-install.sh,是否仅会提示我输入一次sudo密码,或者sudo每次在脚本中需要sudo权限的命令调用时都需要输入密码?换句话说,可以这么说,bash脚本中的命令是否“继承”了执行权限?

并且,如果确实如此,那么sudo权限是否仍有可能超时(例如,如果特定命令花费的时间足够长以超过sudo超时时间)?还是初始sudo密码输入会持续整个脚本的整个过程?


4
您可能有兴趣检查一些专门为此任务设计的工具。三种常见的是:木偶,厨师和古铜。
spuder

@spuder,以及更大范围的企业级体系结构和配置管理的安全性,可以使用CFEngine3。(不是出于胆小,也不是一次性使用命令。)
通配符

Answers:


38

Q#1:是否仅会提示我输入一个sudo密码,或者在脚本中每次需要sudo权限的命令调用时都需要输入sudo密码?

是的,一次,在脚本运行期间。

注意:当您向提供凭据时sudo,在您输入密码的外壳中,身份验证通常可以进行5分钟。另外,从此Shell执行的任何子进程,或在Shell中运行的任何脚本(您的情况)也将在提升的级别上运行。

Q#2: sudo权限是否仍有可能超时(例如,如果某个特定命令花费的时间足以超过sudo超时)?还是最初的sudo密码输入会持续整个脚本的整个持续时间?

不,它们不会在脚本中超时。仅当您以交互方式在提供凭据的外壳中键入它们时。每次sudo在此shell中执行时,都会重置超时。但是,在您的情况下,只要脚本在其中执行和运行命令,它们的凭据就会保留。

sudo手册页摘录

此限制是特定于策略的;sudoers安全策略的默认密码提示超时为5分钟。


1
问题1的答案是“不,不会再次提示您。”
dannysauer 2014年

@dannysauer-再次阅读他的Q。我说的是,只提示输入一次密码!
slm

问题是“是a还是b”,只是说“是”并不清楚是“是,a”还是“是,b”。只是想为将来的读者澄清一些事情。:D
dannysauer 2014年

@dannysauer-查看更新。
slm

1
这个新问题将是这样:stackoverflow.com/questions/3522341/…sudo -u $(logname) <command>应该管用。
Gauthier

17

bash并且其所有子进程将在超级用户权限下运行。因此,您无需为bash脚本中的命令重新输入密码。

sudo超时仅适用于(后)的单独调用sudo。它不会影响您已经在运行的bash进程或其任何后代。


3

这些答案可能都是正确的。但是,据我所知,这不是创建需要sudo权限的bash脚本的常用方法。通常,在脚本的顶部,您假设它没有以sudo权限运行,而是调用sudo -v自己(这将提示用户输入密码)以“设置” sudo“会话”。您可以echo在提示之前添加一些说明性文字,也可以sudo使用-p开关覆盖自己的提示,以使用户知道您需要sudo访问某些命令。

然后,您可以在脚本中调用sudo需要该命令的命令(并且仅需要它们的命令)而无需进一步的密码请求。如果您认为在脚本中一起运行的特定命令组(不管自己使用的是什么sudo)将超出sudo超时范围,则可以sudo -v在中间调用以发出一种“保持活动状态”的sudo“会话” '。

如果sudo“会话”确实在脚本执行期间到期,则下次您在脚本中发出sudo命令时,只会要求用户输入密码。


1
假设脚本的步骤之一是构建一个全新的Linux内核,这可能需要两个小时。保持会话状态可能是一个挑战,您将如何处理?
Gauthier

你不能 但是,下次调用时,sudo -v它将再次询问用户其密码。我认为这不是最糟糕的问题。也许会有所帮助,使用户了解该机制可能很方便。
alexrussell

与此相反的是,要求用户使用其他答案的sudo来调用脚本,然后sudo -u $SUDO_USER使所有非root用户要求的命令均不升高。遗憾的是,它添加了更多代码,但这是在长时间运行的过程中执行root行为的唯一可靠方法。
Dragon788 '17

我想我应该澄清,另一种其他的方式来做到这一点会打电话给须藤一次在脚本的开头放一个临时文件到/etc/sudoers.d使用visudo -c -f /tmp/tempsudoers,以确保将文件复制到相应位置之前是有效的,然后删除该文件一旦完成(在退出/错误时使用陷阱,以确保升级不会被滥用)。最安全最安全的实现方式是只允许您的用户NOPASSWD通过将每个命令/参数存储到数组中来构建文件,而无需输入密码即可使用特定参数在脚本中运行特定命令。
dragon788

有点晚回到这里@Gauthier了,但是当我说sudo如果给定的单个任务花费的时间超过超时时间时,您无法使会话保持活动状态,这似乎是错误的。我碰到这种技术来日前在马蒂亚斯Bynens的点文件回购:while true; do sudo -n true; sleep 60; kill -0 "$$" || exit; done 2>/dev/null &- github.com/mathiasbynens/dotfiles/blob/master/.macos#L13
alexrussell
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.