![如何使 sudo 在脚本运行时不会过期](https://linux22.com/image/185306/%E5%A6%82%E4%BD%95%E4%BD%BF%20sudo%20%E5%9C%A8%E8%84%9A%E6%9C%AC%E8%BF%90%E8%A1%8C%E6%97%B6%E4%B8%8D%E4%BC%9A%E8%BF%87%E6%9C%9F.png)
我有时需要一次运行一个脚本几个小时,在此期间一些命令需要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
不要忘记在不再需要时终止后台作业。脚本本身可以启动这样的工作;那么您可能希望脚本中的一些陷阱在脚本终止时自动终止作业。