假设我有以下 bash 脚本:
#!/bin/bash
sudo command1
command2
sudo command3
我不想command2
以 root 身份运行,所以我不会使用sudo
.因此,一旦我执行脚本,sudo command1
就会询问我的密码。不幸的是,command2
大约需要 2 个小时才能完成。因此 sudo 凭据时间戳超时,当脚本到达 时sudo command3
,系统会再次提示我输入密码。
我不想完全禁用 sudo 凭据时间戳超时,如中所述https://superuser.com/a/149740例如。我只是想暂时禁用超时,有效地保留这一 bash 会话的凭据,直到它结束。
答案1
我认为你最好的选择是一个(后台)繁忙等待循环,它刷新 sudo 时间戳,然后当你不再需要sudo
特权时杀死它。这是一个示例脚本;它运行sleep 6
而不是您的两小时command2
,并运行可见/bin/echo
命令而不是command1
and 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"
对于您的实际脚本,我建议使用更宽松的循环:
#!/bin/sh
sudo command1
while :; do sudo -v; sleep 59; done &
infiloop=$!
command2
sudo command3
kill "$infiloop"
sleep 59
根据timestamp_timeout
sudoers 中的现有设置调整口味;我选择 59 只是为了演示如果时间戳超时为 60 秒您可以做出的选择。
答案2
我一定在这里遗漏了一些东西,因为解决方案对我来说似乎非常明显。
我不想
command2
以 root 身份运行,所以我不会使用sudo
.
但是,如果更改脚本,则sudo
无需以 root 身份运行即可运行整个脚本:command 2
#!/bin/bash
command1
sudo -u ${SUDO_USER:-$USER} command2
command3
答案3
经过清爽后台凭据:
#!/bin/bash
configurePermissions () {
sudo -v
refreshPermissions "$$" &
}
refreshPermissions () {
local pid="${1}"
while kill -0 "${pid}" 2> /dev/null; do
sudo -v
sleep 10
done
}
configurePermissions
答案4
嗯,可以结合起来如何让 sudo 在执行完一条命令后自动忘记密码?和明确使用“sudo -S”的目的是什么?
- 读取用户密码,保存到环境变量中
sudo
使用标志运行-k
以忽略凭据,因此它将始终提示输入密码- 通过标志
stdin
将密码传递至sudo
-S
- 删除密码环境变量
它在某些情况下可能有用,但我不确定将用户密码存储在环境变量中是否是个好主意。