Как установить тайм-аут для sudo, запрашивая пароль?

Например, если я запускаю sudo apt-get install vlc, он просит меня ввести пароль sudo.

Если я не введу пароль для sudo, он [sudo] password for avinash: останется на долгое время.

Как установить время ожидания этого пароля sudo? Если это время ожидания истечет, оно автоматически покажет time expires. Это возможно?

Примечание: Я не спрашиваю о том, как long sudo запоминает пароль ( RootSudoTimeout - Документация сообщества Ubuntu ).

6
задан 9 January 2014 в 15:39

3 ответа

Это не возможно напрямую из самого sudo, но это возможно с помощью некоторой хакерской техники.

sudo_timeout.sh :

#!/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, как с аргументами, так и без них, но я не могу гарантировать, что это будет работать в каждом случае, потому что я не проверил его полностью, это просто что-то Я придумал.

0
ответ дан 9 January 2014 в 15:39

Легкая функция SUDO_ASKPASS sudo's использования.

Создайте этот сценарий 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
2
ответ дан 9 January 2014 в 15:39
  • 1
    Привет это действительно работает, однако когда я перезагружаю теперь, это won' t завершают работу, потому что это говорит " задание остановки работает за/etc/rc.local Совместимостью (1 минута 9s/никакой предел) ". It' s эффективно просто повредил мой сервер. – john smith 28 June 2015 в 17:57

Чтобы изменить время ожидания для запроса пароля, вы можете отредактировать /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.
0
ответ дан 9 January 2014 в 15:39

Другие вопросы по тегам:

Похожие вопросы: