使用 sudo 超时信息更新 Zsh 提示

tim*_*tim 6 prompt zsh sudo

我希望我的 Zsh 提示显示我的sudo凭据是否已缓存。到目前为止,我所拥有的应该有助于解释我想要实现的目标。

function sudo-warning {
    if sudo -nl &>/dev/null; then
        echo -n " %{${fg[red]}%}%{$reset_color%}"
    # optionally, show a locked lock if no sudo credentials active
    #else
    #    echo -n " %{${fg[blue]}%}%{$reset_color%}"
    fi  
}

# Update prompt every 10 seconds
TMOUT=10
TRAPALRM() {
    zle reset-prompt
}

PROMPT='%n$(sudo-warning) '
Run Code Online (Sandbox Code Playgroud)

问题是sudo -nl &>/dev/null更新上次sudo调用的时间戳,因此永远不会超时。那么,有没有办法在更新超时本身的情况下获取有关是否sudo仍然缓存我的凭据的信息?

Sté*_*las 2

这似乎对我来说可以判断是否达到超时:

sudo-expired() [[ $(
  trap "" XFSZ
  limit filesize 0
  LC_ALL=C sudo -n true 2>&1) = *"password is required" ]]
Run Code Online (Sandbox Code Playgroud)

也就是说,将文件大小限制设置为 0 会使时间戳文件的更新失败,但只要我们不让该限制终止sudo,我们仍然能够判断是否需要密码。

像你一样使用(有一些简化):

sudo-warning()
  if sudo-expired; then
    echo '%F{blue}%f'
  else
    echo '%F{red}%f'
  fi

TMOUT=10
TRAPALRM() zle reset-prompt
set -o promptsubst
PS1='%n$(sudo-warning) '
Run Code Online (Sandbox Code Playgroud)