如何从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不会是明文的。
-
首先创build密码并对其进行哈希处理:
回声“password123”| md5sum | cut -d' – '-f 1> / tmp / secret
-
现在创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