如何暂时禁用 sudo 凭据时间戳超时?

如何暂时禁用 sudo 凭据时间戳超时?

假设我有以下 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命令而不是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"

对于您的实际脚本,我建议使用更宽松的循环:

#!/bin/sh
sudo command1
while :; do sudo -v; sleep 59; done &
infiloop=$!
command2
sudo command3
kill "$infiloop"

sleep 59根据timestamp_timeoutsudoers 中的现有设置调整口味;我选择 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”的目的是什么?

  1. 读取用户密码,保存到环境变量中
  2. sudo使用标志运行-k以忽略凭据,因此它将始终提示输入密码
  3. 通过标志stdin将密码传递至sudo-S
  4. 删除密码环境变量

它在某些情况下可能有用,但我不确定将用户密码存储在环境变量中是否是个好主意。

相关内容