如何输入/验证 sudo 密码而不重新提示?

如何输入/验证 sudo 密码而不重新提示?

出于 bash 脚本的目的,sudo如果尚未输入密码(并且用户sudo在运行脚本时没有权限),我需要提示用户输入密码。

我首先使用密码 bog 请求密码dialog,然后将其提供给sudo,如下所示:

SUDOPWD=$(dialog --title "Password" --clear --passwordbox "Enter your sudo password" 10 30  2>&1 > /dev/tty)

echo ${SUDOPWD} | sudo -Sn -v

但是,唉,这行不通!显然-S(从 读取密码stdin)和-n(非交互式sudo)不兼容!如果-n存在,输入的密码sudo将被忽略(因此不会发生提升),如果没有它,sudo如果输入了错误的密码,则会提示重新输入。

sudo如果密码不正确,是否有任何方法可以验证密码而无需重新提示?

不可避免地有人会指出,人们不应该重新发明轮子,而应该使用提供的设施,或者通过管道sudo提供密码会产生安全隐患。sudo我知道这些因素,并且仍然愿意做我上面概述的事情,如果有可能的话。我也不想在 中输入命令/etc/sudoers,重新编译sudo(因为脚本应该在某种程度上是可移植的),或者sudo一般禁用密码提示(仅在这个脚本中)。

我正在 Ubuntu 16.04 上处理这个问题。

答案1

您可以确定用户是否已经通过身份验证sudo -vn 2>/dev/null

如果不是,您可以使用以下命令来请求密码并将其通过管道传输到sudo.

printf '%s\n' "$(dialog --output-fd 1 --passwordbox "Enter password:" 10 30)" | \
sudo -Svp ''
  • --output-fd 1告诉dialog输出到STDOUT
  • printf用于将换行符附加到输入,这是必需的sudo -S
  • sudo -p ''用作''密码提示信息,隐藏它

如果您愿意将输出存储在变量中,printf '%s\n' "${SUDOPWD}"那么您就可以做到这一点

相关内容