0

我正在为我的操作系统类做一些功课,我们必须只使用 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,向用户询问用户名,如果用户名是实际登录的用户,然后向用户询问他们的密码,检查它是否是实际用户的密码,如果是,请更改他们输入的新密码。

4

0 回答 0