使 sudo 在登录后 n 分钟内不询问密码

vid*_*rlo 4 ssh sudo password

我经常通过 SSH 登录到 boxen,并以 root 身份运行更新等,使用sudo.

我很感激sudo在一段时间后要求输入密码,以防我离开终端等。但是,正如我已经进入了登录密码,或SSH关键短语,我宁愿 sudo 来询问登录后的第n分钟一个密码,但仿佛须藤已经登录成功后立即执行的行为。

是否可以进行配置,以便登录后第一次调用不需要密码?

举例说明所需的行为

ssh foo@example.org
[~]$ sudo somecommand
[~]$ #no password asked.
[~]$ sudo somecommand #n minutes later
[sudo] password for foo: 
Run Code Online (Sandbox Code Playgroud)

zwe*_*ets 5

这是如何完成的想法。 注意:这是一个黑客;仅当无密码 sudo使您的眉毛想要一直爬到您的头骨时才使用。

前提是:我们不能将登录凭据传递给sudo. 所以问题是如何NOPASSWD只在登录的前几分钟使用sudo。我们可以通过以NOPASSWDmode启动登录 shell并产生一个后台进程来实现.bashrc,几分钟后在后台进程中撤消NOPASSWD.

# somewhere near the bottom of ~/.bashrc
sudo -n /bin/bash -c "$HOME/nopasswd-sudo 60s 12h <&- >&- &"
Run Code Online (Sandbox Code Playgroud)

当然,脚本本身必须 NOPASSWDsudo启动,否则仍会提示我们输入密码。 并且脚本必须NOPASSWD在 bash 会话结束时恢复规则,以便NOPASSWD为下次登录设置。

这是执行此操作的脚本$HOME/nopasswd-sudo

#!/bin/bash

SUDO_FILE="/etc/sudoers.d/$(basename "$0")-${SUDO_USER}"
SUDO_RULE="${SUDO_USER} ALL=(ALL:ALL) NOPASSWD: ALL"

[ -z "$SUDO_USER" ] &&
     echo "$(basename "$0"): must be invoked with sudo" >&2 &&
     exit 1

# Trap exit to recreate SUDO_FILE for next login
trap "echo '$SUDO_RULE' > '$SUDO_FILE'; exit 0" EXIT

# First time around just exit, creating the SUDO_FILE
[ -f "$SUDO_FILE" ] || exit 0

# After $1 (default 5m) remove SUDO_FILE to end NOPASSWD sudo
sleep ${1:-5m} && rm -f "$SUDO_FILE"

# Wait until our parent exits, and we will exit via the trap
# If after $2 (default 12h) still alive, we assume we missed the HUP
sleep ${2:-12h}
Run Code Online (Sandbox Code Playgroud)

在第一次运行时(必须从命令行完成,而不是从.bashrc),脚本创建/etc/sudoers.d/nopasswd-sudo-$USER包含NOPASSWD登录通配符的文件$USER

{username} ALL=(ALL:ALL) NOPASSWD: ALL
Run Code Online (Sandbox Code Playgroud)

然后在每次登录时它都会启动并在后台等待,直到无密码时间结束,之后它会删除文件,下一次sudo将需要密码。

之后它会无限期地等待(实际上,最多 12 小时,以防止遗漏其父级 HUP 信号的孤儿),或直到其父级登录 shell 结束。就在它退出之前,它的 EXIT 陷阱重新创建了该NOPASSWD文件。


给冒险者的提示:记住,当您处理登录脚本或sudo规则时,始终保持一个单独的 root shell 打开。你不会是第一个把自己锁在外面的人。