如何使 sudo 在脚本运行时不会过期

如何使 sudo 在脚本运行时不会过期

我有时需要一次运行一个脚本几个小时,在此期间一些命令需要sudo.但是,如果我不定期检查并重新输入sudo密码,我会收到sudo: timed out reading password错误,有时会破坏整个过程。我不想使用,sudo myscript.sh因为应该运行一些命令没有 sudo

我希望sudo缓存的密码在脚本的整个持续时间内持续存在于脚本中,而不更改系统的其余部分(sudo持久性仅有的对于这 1 个脚本)。

有没有一种方法可以sudo在整个脚本持续时间内持续进行,并且仅针对第一个脚本?

答案1

可能性:使用 运行脚本sudo myscript.sh。在脚本内部运行不应以sudo这种方式运行的命令:

sudo -u "$SUDO_USER" foo args

(也许有正确的逻辑,以防整个脚本在没有 的情况下运行sudo)。root 用户不需要进行身份验证sudo,因此不需要输入密码即可以其他用户身份运行命令

根据脚本的大小(您需要对其进行多少更改)以及您对运行整个脚本的感觉,sudo您可能喜欢或不喜欢这个想法。在您当前的方法中,非提升代码是默认的,带有sudo显式异常的行。我的方法颠覆了这一点。创建和测试脚本时需要更加小心。我承认这不是最佳实践;仍然解决了过期的问题sudo

就我个人而言,我会将此解决方案用于不太复杂的长时间运行的脚本(简单的循环,很少的命令)。不过,在重建复杂的脚本之前我会三思而后行。


另一种方法是定期在后台更新缓存的凭据。默认情况下,这些是针对每个 tty 的(参见tty_tickets)。像这样进行:

sudo -v                              # to enter your password once
while sleep 300; do sudo -v; done &  # adjust the interval if needed
myscript.sh

不要忘记在不再需要时终止后台作业。脚本本身可以启动这样的工作;那么您可能希望脚本中的一些陷阱在脚本终止时自动终止作业。

相关内容