如何从shell脚本获取密码而不回显

我有一个脚本可以自动执行需要访问密码保护系统的进程。 系统通过一个接受用户密码作为参数的命令行程序来访问。

我想提示用户input他们的密码,将其分配给一个shellvariables,然后使用该variables来构造访问程序的命令行(这当然会产生我将处理的stream输出)。

在Bourne / Bash中,我是一个合理的shell编程人员,但是我不知道如何接受用户的input,而不用回应到terminal(或者使用'*'字符回显)。

有人能帮忙吗?

这是另一种方式来做到这一点:

#!/bin/bash # Read Password echo -n Password: read -s password echo # Run Command echo $password 

read -s会closures你的回声。 只需用你想运行的命令replace最后一行的echo

 #!/bin/bash stty -echo printf "Password: " read PASSWORD stty echo printf "\n" 

一个class轮:

 read -s -p "Password: " password 

在Linux(和cygwin)下,这个表单在bash和sh中工作。 不过,它可能不是标准的Unix sh。

有关更多信息和选项,请在bash中input“帮助阅读”。

 $ help read read: read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...] Read a line from the standard input and split it into fields. ... -p prompt output the string PROMPT without a trailing newline before attempting to read ... -s do not echo input coming from a terminal 

read-s选项在POSIX标准中没有定义。 请参阅http://pubs.opengroup.org/onlinepubs/9699919799/utilities/read.html 。 我想要一些适用于任何POSIX shell的东西,所以我写了一个使用stty来禁用回显的函数。

 #!/bin/sh # Read secret string read_secret() { # Disable echo. stty -echo # Set up trap to ensure echo is enabled before exiting if the script # is terminated while echo is disabled. trap 'stty echo' EXIT # Read secret. read "$@" # Enable echo. stty echo trap - EXIT # Print a newline because the newline entered by the user after # entering the passcode is not echoed. This ensures that the # next line of output begins at a new line. echo } 

这个函数的行为与read命令非常相似。 这是read一个简单用法,接着是read_secret的类似用法。 read_secret的input显示为空,因为它没有被回显给terminal。

 [susam@cube ~]$ read abc foo \bar baz \qux [susam@cube ~]$ echo a=$ab=$bc=$c a=foo b=bar c=baz qux [susam@cube ~]$ unset abc [susam@cube ~]$ read_secret abc [susam@cube ~]$ echo a=$ab=$bc=$c a=foo b=bar c=baz qux [susam@cube ~]$ unset abc 

这是另一个使用-r选项来保留input中的反斜杠。 这是有效的,因为上面定义的read_secret函数将所有收到的parameter passing给read命令。

 [susam@cube ~]$ read -rabc foo \bar baz \qux [susam@cube ~]$ echo a=$ab=$bc=$c a=foo b=\bar c=baz \qux [susam@cube ~]$ unset abc [susam@cube ~]$ read_secret -rabc [susam@cube ~]$ echo a=$ab=$bc=$c a=foo b=\bar c=baz \qux [susam@cube ~]$ unset abc 

最后,下面是一个示例,显示如何使用read_secret函数以符合POSIX的方式读取密码。

 printf "Password: " read_secret password # Do something with $password here ... 

stty打开echo ,然后再打开。

我发现是有用的askpass命令

 password=$(/lib/cryptsetup/askpass "Give a password") 

每个input字符被replace为*。 请参阅:提供密码****

首先,如果有人要在文件中存储任何密码。 我会确保它被哈希。 这不是最好的安全性,但至less不会是明文的。

  1. 首先创build密码并对其进行哈希处理:

    回声“password123”| md5sum | cut -d' – '-f 1> / tmp / secret

  2. 现在创build你的程序来使用散列,在这种情况下,这个小程序接收用户input的密码而不回显,然后将其转换为散列,以便与存储的散列进行比较。 如果它匹配存储的散列,则授予访问权限:

    #!/斌/庆典

     PASSWORD_FILE="/tmp/secret" MD5_HASH=$(cat /tmp/secret) PASSWORD_WRONG=1 while [ $PASSWORD_WRONG -eq 1 ] do echo "Enter your password:" read -s ENTERED_PASSWORD if [ "$MD5_HASH" != "$(echo $ENTERED_PASSWORD | md5sum | cut -d '-' -f 1)" ]; then echo "Access Deniend: Incorrenct password!. Try again" else echo "Access Granted" PASSWORD_WRONG=0 fi done 
 echo yourpassword | passwd --stdin youruser