例如如果我运行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