Sudo-是否有命令检查我是否有sudo和/或还剩多少时间?


27

(最初发布在Stack Overflow上。他们建议我改在这里尝试。这是原始帖子:https : //stackoverflow.com/questions/3858208/sudo-is-there-a-command-to-check-if-i-have -sudo和-或知识,多少时间,是左

参见标题。我想要一个让我查询sudo的命令。理想情况下,如果我仍然有sudo,它将返回成功;如果sudo已过期,则返回false。节省时间可能也很有用(尽管如果我担心,我可以执行sudo -v来重新验证。)哦,它不必要求输入密码。

我找到的最接近的东西是“ sudo -n true”,但是-n选项仅在工作中的Centos 5机器上出现。-n如果必须输入密码,则失败。还有其他方法可以获取此功能吗?假设我实际上没有在所有使用的计算机上都具有root用户,所以我无法根据自己的喜好安装新版本的sudo。

为此,我需要这样做,以便获得提示以指示sudo状态的提示。我喜欢知道哪些终端可以主动安装。我也有一个提示,当我是root时会更改颜色,但是我不经常使用root,因此用途有限。

Answers:


10

-n选项在sudo的较新版本中可用,但是正如您所说的那样,这不是一个选项。除了尝试sudo并查看是否返回提示输入密码的方法外,没有真正的方法可以完成您要寻找的事情。如果您需要直观的指示,为什么不启动sudo / bin / bash来启动root bash会话?请注意,这是不安全的,但是如果有人意识到您对sudo进行了及时更改,那也是不安全的。


1
+1表示可视指示器的安全性!
暂停,直到另行通知。

我没有想到那部分。我希望指示器能提醒我运行sudo -K,而不是忘记让sudo保持活动状态并打开一些潜在危险的终端。不是说我经常忘记锁定屏幕,而是我喜欢额外的保险。
valadil

目前,我倾向于检查sudo -V,如果它足够新,可以使用-n,请检查-n以获取通知。似乎它不应在任何地方破坏任何内容。
valadil

@valadil:在我看来,一个微妙的指标不会带来太多的安全风险。例如,在提示中为用户名打开下划线。
暂停,直到另行通知。

@丹尼斯:是的。我不会将提示符更改为“ OMG_YOU_HAVE_SUDO_NOW!_user @ host”或类似的内容。我可能只是稍微改变一下颜色。我不希望任何人知道这意味着什么,除非他们坐下来与我的.bashrc保持亲密关系。
valadil

29

我知道这是一个非常老的问题,但是今天是我今天在脚本中所做的:

CAN_I_RUN_SUDO = $(sudo -n正常运行时间2>&1 | grep“ load” | wc -l)
如果[$ {CAN_I_RUN_SUDO} -gt 0]
然后
    回声“我可以运行sudo命令”
其他
    回声“我无法运行Sudo命令”
科幻

1

下面的命令将以彩色指示您已被授予sudo权限,因此请记住sudo -k在离开计算机之前先进行一次。在非彩色端子上也很有用。

由于我们可以在不同的终端会话上使sudo处于活动和非活动状态,因此我创建了它,可以将其放在〜/ .bashrc的末尾

function FUNCpromptCommand () { 
    sudo -n uptime 2>/dev/null 1>/dev/null
  local bSudoOn=`if(($?==0));then echo true; else echo false; fi`

    history -a; # append to history at each command issued!!!
    local width=`tput cols`;
    local half=$((width/2))
    local dt="[EndAt:`date +"%Y/%m/%d-%H:%M:%S.%N"`]";
  if $bSudoOn; then dt="!!!SUDO!!!$dt"; fi
    local sizeDtHalf=$((${#dt}/2))
    #printf "%-${width}s" $dt |sed 's" "="g'; 
    echo
    output=`printf "%*s%*s" $((half+sizeDtHalf)) "$dt" $((half-sizeDtHalf)) "" |sed 's" "="g';`

    local colorLightRed="\e[1;31m"
  local colorNoColor="\e[0m"
    if $bSudoOn; then
        echo -e "${colorLightRed}${output}${colorNoColor}"
    else
        echo -e "${output}"
    fi
}
export PROMPT_COMMAND=FUNCpromptCommand

在终端上bash进行测试。每次执行命令时,它还会添加整行,其中包含上一条命令结束时间的信息,因此您可以在午餐时间知道上一条命令何时结束:)。

您可以使用此代码来满足您的需求。也有PS1变量(即实际的小提示单行),但我认为最好不要弄乱它。

PS .:对于OS-X,请通过@nwinkler查找以下注释。


检查出的代码sudo -n似乎并没有在OS X上工作,看到这里我的问题:superuser.com/questions/902826/...
nwinkler

好吧,我建议的测试是sudo -n,您是否认为可以使用其他测试来确定用户是否具有sudo访问权限?还是OS-X需要更新?我从未使用过OS-X btw。
Aquarius

2
我正在使用最新版本的OSX。sudo -n在BSD(基于OS X的版本)上,其行为可能与GNU版本不同。我只是添加了评论,以使人们知道此检查版本在OS X上似乎不起作用。我使用了另一个答案(sudo -n uptime 2>&1|grep "load"|wc -l)的检查,这似乎在OS X上可以正常工作。它不那么优雅,但它有效。
nwinkler 2015年

1
@nwinkler哦,所以它实际上取决于它生成的输出(而不是返回值),有趣的解决方法
Aquarius Power

@nwinkler,但它尽可能接近。甚至更好,因为sudo -n在sudo -V 1.7.9中变成越野车
Marco M. von Hagen

1

为了简化@ wags007给出的答案

if sudo -n true
then
  sudo id
else
  echo "sorry, but did not want to bother you"
fi

但是,如果在您的https://www.sudo.ws/man/1.8.15/sudoers.man.html配置中defaults mail_badpass,将为每项测试发送一封邮件,导致结果为false(将提示)。为了避免这种麻烦,请将您的sudoers文件中的一部分

Defaults       mail_badpass
Defaults!      /bin/true !mail_badpass

结果,针对/ bin / true以外的所有命令发送安全警报邮件。好吧,是的,现在有人可以尝试通过sudo true无限次拨打密码来暴力破解密码,而不会发送任何安全警报邮件。

注意:始终使用visudo而不是您喜欢的编辑器来编辑sudoers文件。否则,您有被锁定的风险。


0

根据sudo手册,sudo会话是根据时间戳文件(/usr/lib/sudo/<username>)确定的,因此您可以通过检查时间戳文件的日期/时间来找出还剩多少时间。但是,在我的系统中,时间戳文件实际上是一个目录,并且其中有三个文件具有神秘的内容(还有一些奇怪的时间戳,但/usr/lib/sudo/<username>似乎时间戳与我给sudo密码的时间一致我认为/usr/lib/sudo/<username>/0具有最近sudo执行的时间戳。


1
在我的系统上,时间戳文件位于一个目录中,如果不使用sudo则无法读取该目录,因为它会提示输入密码,因此无法满足OP的需要。
暂停,直到另行通知。

好点子。我没有检查这些文件的所有权。你是对的,那将是无用的。
Dysaster


0

至少在sudo 1.8.21p2上,这种方法可以正常工作:

if sudo -vn 2> /dev/null; then
    echo "You have an active sudo session"
fi

0

按照大多数人的标准,这可能是极端的矫kill过正,但这是我用来检查是否sudo已解锁的(正确的)函数(如果用户运行,该函数不会浪费时间root,因为不需要解锁sudo):

#!/bin/sh

_unlock_sudo() {
    if [ "$USER" != 'root' ]; then
        if ! sudo -n -- true 2>/dev/null; then
            printf '\n'
            printf 'Enter password for sudo user "%s":\n' "$USER"
            while ! sudo -- true; do
                printf '\n'
                while true; do
                    printf 'Slow your roll. Try to enter password again? [Y/n]: '
                    read -r answer
                    case "$answer" in
                        ''|y|Y|yes|Yes|YES)
                            printf '\n'
                            printf 'Enter password for sudo user "%s":\n' "$USER"
                            break
                            ;;
                        n|N|no|No|NO)
                            printf '\n'
                            printf 'OK. Exiting...\n'
                            exit 1
                            ;;
                        *)
                            printf 'Please enter a valid option...\n'
                            printf '\n'
                            ;;
                    esac
                done
            done
        fi
    fi
}

_unlock_sudo

-1

简单的答案...

sudo echo
isSudo=$?
if [[ "$isSudo" -ne 0 ]]; then
  echo "This script must be run by root or a sudo'er"
  echo
  exit 1
fi

# do stuff

exit 0

如果用户还没有活动的sudo会话,这将提示您输入密码
Slizzered 2015年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.