假设我有以下 bash 脚本:
#!/bin/bash
sudo command1
command2
sudo command3
Run Code Online (Sandbox Code Playgroud)
我不想以command2root身份运行,所以我不会使用sudo. 因此,只要我执行脚本,就会sudo command1询问我的密码。不幸的是,command2大约需要 2 个小时才能完成。所以 sudo 凭证时间戳超时,当脚本到达时sudo command3,我再次被提示输入密码。
例如,我不想像https://superuser.com/a/149740 中描述的那样永久禁用 sudo 凭据时间戳超时。我只想暂时禁用超时,有效地保留这个 bash 会话的凭据,直到它结束。
我认为你最好的选择是一个(后台)忙等待循环,它刷新 sudo 时间戳,然后当你不再需要sudo特权时杀死它。这是一个示例脚本;它运行sleep 6而不是您的两小时command2,并运行可见/bin/echo命令而不是command1and command2:
#!/bin/sh
sudo /bin/echo command 1
while :; do sudo -v; sleep 1; done &
infiloop=$!
sleep 6
sudo /bin/echo command 3
kill "$infiloop"
Run Code Online (Sandbox Code Playgroud)
对于您的实际脚本,我建议使用更宽松的循环:
#!/bin/sh
sudo command1
while :; do sudo -v; sleep 59; done &
infiloop=$!
command2
sudo command3
kill "$infiloop"
Run Code Online (Sandbox Code Playgroud)
sleep 59根据timestamp_timeoutsudoers 中的现有设置调整口味;我选择 59 只是为了演示如果时间戳超时为 60 秒您可以做出的选择。