Например, если я запускаю sudo apt-get install vlc
, он просит меня ввести пароль sudo
.
Если я не введу пароль для sudo
, он [sudo] password for avinash:
останется на долгое время.
Как установить время ожидания этого пароля sudo? Если это время ожидания истечет, оно автоматически покажет time expires
. Это возможно?
Примечание: Я не спрашиваю о том, как long sudo
запоминает пароль ( RootSudoTimeout - Документация сообщества Ubuntu ).
Это не возможно напрямую из самого 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
, как с аргументами, так и без них, но я не могу гарантировать, что это будет работать в каждом случае, потому что я не проверил его полностью, это просто что-то Я придумал.
Легкая функция 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
Чтобы изменить время ожидания для запроса пароля, вы можете отредактировать /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.