我经常通过 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)
这是如何完成的想法。 注意:这是一个黑客;仅当无密码 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 打开。你不会是第一个把自己锁在外面的人。
| 归档时间: |
|
| 查看次数: |
451 次 |
| 最近记录: |