![如何输入/验证 sudo 密码而不重新提示?](https://linux22.com/image/105793/%E5%A6%82%E4%BD%95%E8%BE%93%E5%85%A5%2F%E9%AA%8C%E8%AF%81%20sudo%20%E5%AF%86%E7%A0%81%E8%80%8C%E4%B8%8D%E9%87%8D%E6%96%B0%E6%8F%90%E7%A4%BA%EF%BC%9F.png)
出于 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}"
那么您就可以做到这一点