sudo 凭据测试

use*_*135 6 bash password sudo

我有一个可以运行的 bash 脚本,它可能运行 0 到 8-9 分钟。sudo如果发现问题并需要更改文件的权限/所有权,则需要它。我不想等待sudo提示,因为这可能需要几分钟才能运行,所以我sudo -v在脚本的开头这样做。

如果我预计剧本需要很长时间,我经常走到自助餐厅。所以前段时间我包含了一个陷阱处理程序,它调用一个函数,它会sudo -k删除我的凭据。这样按Ctrl+C不会让某人sudo在我还没有回来时可以访问。我也会在脚本末尾调用该函数,以防脚本在我回来之前终止。

如果我sudo在调用脚本之前已经执行了命令sudo -v,则它不会询问我的凭据。那很好。
根据我从哪里开始,我知道脚本不会花很长时间,我会等待它完成。如果我在刚刚完成一个sudo命令后启动它,每次我sudo在它完成后都没有凭据

我确实检查了sudo -v. 在退出 0 时,这不会告诉我凭据是否已经存在(在运行脚本之前)或者密码是否在之前正确输入。这并不能帮助我知道我是否应该sudo -k在最后运行。

我想过制作两个版本的脚本,一个有一个没有sudo -v/ sudo -k,但我认为这不是一个很好的解决方案,我有时会选择错误的版本。

有没有更好的方法来解决这个问题?我错过了什么吗?

Ant*_*hon 8

sudo -nv 2> /dev/null当凭据存在时,您可以使用它来获取退出值 0,而不会提示输入密码。

fdisk如果一开始就不存在,我有类似的东西可以运行和删除凭据。结合 catch Ctrl+C你会得到类似的东西(我不是一个好的 bash 程序员!):

#! /bin/bash
# this only removes credentials if logging in at the start was necessary

reset_sudo()
{
if [ $SUDOCREDCACHED != 0 ] ; then 
  # drop credentials if acquired in script
  sudo -k
fi
}

Ctrl_C()
{
  reset_sudo
  exit 0
}

sudo -nv 2> /dev/null
SUDOCREDCACHED=$?
if [ $SUDOCREDCACHED != 0 ] ; then 
  # acquire credentials
  sudo -v 
  if [ $? != 0 ] ; then 
    exit 1
  fi
fi

trap Ctrl_C SIGINT
### your stuff here ###
reset_sudo
Run Code Online (Sandbox Code Playgroud)