我正在为我的操作系统类做一些功课,我们必须只使用 bash 脚本来创建登录流程,我遇到了问题,因为我想用 GUI 来做,所以我开始使用whiptail,但是当我检查有效性时用户在 etc/shadow 文件夹中输入的密码,然后 sudo 仍然会在控制台上询问密码,即使我使用 -S 参数将密码传递给它。这是我正在做的一个例子
realUser=$(whoami)
user=$(whiptail --title "Change password" --inputbox "Please enter your password" 10 60 3>&1 1>&2 2>&3)
exitstatus=$?
if [ $exitstatus = 0 ]; then
if [ "$user" == "$realUser" ]
then
currentPass=$(whiptail --title "Current Password" --passwordbox "Please enter your current password" 10 60 3>&1 1>&2 2>&3)
exitstatus=$?
if [ $exitstatus = 0 ]; then
password=$( sudo -S <<< $currentPass grep -w $realUser /etc/shadow | cut -d: -f2)
userId=$(echo "$password" | cut -f2 -d$)
userSalt=$(echo "$password" | cut -f3 -d$)
userPassword=$(echo "$password" | cut -f4 -d$)
encryptedPass=$(perl -e "print crypt('$currentPass','\$$userId\$$userSalt\$'); \n")
if [ "$currentPass" == "$encryptedPass" ]
then
#Do change the password
.....
问题是当我执行这个命令时
password=$( sudo -S <<< $currentPass grep -w $realUser /etc/shadow | cut -d: -f2)
它清除了whiptail并像sudo通常那样询问用户密码,但是没有-S <<< $currentPass
通过stdin将密码传递给它,所以它不必询问它?
我不知道我是否说清楚了,我想做的是,使用whiptail,向用户询问用户名,如果用户名是实际登录的用户,然后向用户询问他们的密码,检查它是否是实际用户的密码,如果是,请更改他们输入的新密码。