BASH - 获取用户密码的功能

时间:2014-12-03 13:15:04

标签: bash

我创建了以下BASH脚本,该脚本非常适合从用户那里获取密码:

while [ -z "$PASSWORD" ]
do
    echo "Please enter a password:"
    read -s PASSWORD1
    echo "Please re-enter the password to confirm:"
    read -s PASSWORD2

    if [ "$PASSWORD1" = "$PASSWORD2" ]; then
        PASSWORD=$PASSWORD1
    else
        # Output error message in red
        red='\033[0;31m'
        NC='\033[0m' # No Color
        echo ""
        echo -e "${red}Passwords did not match!${NC}"
    fi
done

# This is just here to prove script works
echo "password is: $PASSWORD"

但是,如果我将它放在一个函数中,它就会停止工作:

function getPasswordFromUser()
{
    while [ -z "$PASSWORD" ]
    do
        echo "Please enter a password:"
        read -s PASSWORD1
        echo "Please re-enter the password to confirm:"
        read -s PASSWORD2

        if [ "$PASSWORD1" = "$PASSWORD2" ]; then
            PASSWORD=$PASSWORD1
        else
            # Output error message in red
            red='\033[0;31m'
            NC='\033[0m' # No Color
            echo ""
            echo -e "${red}Passwords did not match!${NC}"
        fi
    done
    echo $PASSWORD
}

PASSWORD=$(getPasswordFromUser)

# This is just here to check if script worked
echo "got password $PASSWORD"

如果我将对函数的调用从PASSWORD=$(getPasswordFromUser)更改为:getPasswordFromUser;,则该方法将启动“正常工作”,但密码将输出到屏幕,我还没有捕获它。

有没有办法更新这个BASH脚本,以便我可以调用一个函数来获取用户的密码,而不会在终端中显示密码

  • 如果重要,这适用于Debian / Ubuntu。

3 个答案:

答案 0 :(得分:2)

如果您调用myvar=$(myfunction)之类的函数,它将捕获第一个echo语句。

相反,您可以在函数中定义变量然后访问它。 bash中没有范围,因此一旦执行了该功能,您就可以访问它。

查看每个人的例子:

$ cat a
#!/bin/bash

function myf()
{
echo "heeeiiii"
echo "hellO"

}

function myf2()
{
echo "lets define var MYTEST"
MYTEST="this is my test"
}

r=$(myf)

echo "this is myf: $r"

echo "MYTEST=$MYTEST"
myf2
echo "MYTEST=$MYTEST"

执行:

$ ./a
this is myf: heeeiiii
hellO
MYTEST=
lets define var MYTEST
MYTEST=this is my test

答案 1 :(得分:1)

函数中的大多数输出​​应写入标准错误,而不是标准输出。

getPasswordFromUser()
{
    while [ -z "$PASSWORD" ]
    do
        echo "Please enter a password:" >&2
        read -s PASSWORD1
        echo "Please re-enter the password to confirm:" >&2
        read -s PASSWORD2

        if [ "$PASSWORD1" = "$PASSWORD2" ]; then
            PASSWORD=$PASSWORD1
        else
            # Output error message in red
            red='\033[0;31m'
            NC='\033[0m' # No Color
            echo -e "\n${red}Passwords did not match!${NC}" >&2
        fi
    done
    echo "$PASSWORD"
}

另外,请务必在最后一行引用$PASSWORD;有人可能会在密码中使用多行空格或shell glob字符!

答案 2 :(得分:0)

你的第一次尝试是正确的:

~$ PASSWORD=$(getPasswordFromUser)
~$ echo $PASSWORD
Please enter a password: Please re-enter the password to confirm: a

您只是看不到“请输入密码”,因为它是$(..)捕获的。

您有几种可能性:

  • 使用全局变量
  • 使用不同的描述符
  • 让函数将变量作为第一个arg,并使用要返回的字符串修改变量。

可以在how to return a string value from a bash functionAdvanced Bash-Scripting Guidelinux journal中找到一些示例。