如何设置 sudo 询问密码的超时时间?

如何设置 sudo 询问密码的超时时间?

例如如果我运行sudo apt-get install vlc,它会要求我输入sudo密码。

如果我不输入密码,sudo[sudo] password for avinash:会保留很长时间。

我如何设置这个 sudo 密码等待时间?如果这个等待时间到期,它会自动显示time expires。可以吗?

笔记:我不是问sudo记住密码多久(RootSudoTimeout - 社区 Ubuntu 文档)。

答案1

要更改密码提示的超时时间,您可以编辑/etc/sudoers(或/etc/sudoers.d/passwd_timeout)并添加行

Defaults passwd_timeout=10

或使用 以外的其他数字10

man sudoers

 passwd_timeout    Number of minutes before the sudo password prompt times out, or 0 for
                   no timeout.  The timeout may include a fractional component if minute
                   granularity is insufficient, for example 2.5.  The default is 5.

答案2

这不能直接通过 sudo 本身实现,但通过一些 hackish 技术是可以实现的。

sudo_超时

#!/bin/bash

timeout=10 #seconds

set -m

echoerr() { echo "$@" 1>&2; }

keep_eye_on() {
    pid=$1
    time_passed=0
    while kill -0 $pid &> /dev/null; do
        sleep 1
        let time_passed=time_passed+1
        if [ $time_passed -ge $timeout ]; then
            echoerr "Timeout reached."
            kill -9 $pid
            exit 1
        fi
    done
}

if [ -z "$1" ]; then
    echoerr "Please specify a process to run!" 
    exit 1
fi;

sudo $@ &
pid=$!

keep_eye_on $pid &
while true; do
    if kill -0 $pid &> /dev/null; then
        fg sudo > /dev/null; [ $? == 1 ] && break;
    else
        break
    fi
done

timeout变量保存在终止要求输入密码的 sudo 进程之前等待的超时时间(以秒为单位)。

用法:

./sudo_timeout.sh <command>

例子:

./sudo_timeout.sh ls -al

如果达到超时,您将获得:

alex@MaD-pc:~$ ./sudo_timeout.sh ls -al
[sudo] password for alex: Timeout reached.
./sudo_timeout.sh: line 34: 14583 Killed                  sudo $@

如果您在超时之前输入密码,则命令将正常执行。

免责声明:以上内容已使用类似ls和 的简单命令nano(带参数和不带参数)进行了测试,但我不能保证它在每种情况下都能起作用,因为我还没有彻底测试过它,这只是我想出的东西。

答案3

轻松使用 sudo 的 SUDO_ASKPASS 功能。

在某处创建此脚本 sudo-askpass-timeout.sh:

#! /bin/bash -eu
# dash doesn't support read -s, so we use bash instead

# "read" will not reset the terminal echo mode if it is canceled. Let's save/restore the tty status.
stty_orig=`stty -g`
trap 'stty "$stty_orig"' EXIT

## Default timeout is 60 seconds.
if read -s -t ${READ_TIMEOUT:-60} -p "$*"
then
    echo "$REPLY"
else
    echo "Timeout" >&2
    exit 1
fi

然后,在同一目录中创建类似 sudo-timeout.sh 的文件:

#! /bin/bash -eux

## Syntax:  sudo-timeout.sh [-t timeout_in_seconds] <sudo arguments>
## Example:  sudo-timeout.sh -t 60 apt-get update

export SUDO_ASKPASS="$(dirname "$0")/sudo-askpass-timeout.sh"
export READ_TIMEOUT=60
if [ $# -ge 3  ] && [ "$1" = "-t" ]
then
        shift
        READ_TIMEOUT=$1
        shift
fi
exec sudo -A "$@"

例子:

sudo-timeout.sh apt-get update  ##Default: 60 second timeout
sudo-timeout.sh -t 30 apt-get update

相关内容