关于bash:如何从shell脚本获取密码而不进行回显

How to get a password from a shell script without echoing

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

我想提示用户输入他们的密码,将其分配给一个shell变量,然后使用该变量构造访问程序的命令行(当然,这将生成我将处理的流输出)。

我是bourne/bash中相当有能力的shell程序员,但是我不知道如何在不让用户输入回显到终端的情况下接受它(或者可能让它使用"*"字符进行回显)。

有人能帮忙吗?


这里是另一种方式来做:

1
2
3
4
5
6
7
#!/bin/bash
# Read Password
echo -n Password:
read -s password
echo
# Run Command
echo $password

"你想关read -s回声。刚刚替换echo在载重线的命令,你想跑。


a POSIX标准的答案。通知/bin/sh/bin/bash代替使用。(它是与bash Bash,但它不需要。

1
2
3
4
5
6
7
#!/bin/sh
stty -echo
printf"Password:"
read PASSWORD
stty echo
printf"
"


一个内衬;

1
read -s -p"Password:" password

在Linux(和Cygwin的bash)本作品在形式和SH。它可能需要的标准UNIX下SH,但。

更多的信息和选择,在bash中,型的"帮助读"。

1
2
3
4
5
6
7
8
$ 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


这是一个选择-sreadPOSIX标准中定义的位置。湖pubs.opengroup.org http://////read.html onlinepubs 9699919799公用事业。我想要的东西会工作任何POSIX外壳,所以我写了一个小功能,使用stty到禁用的回声。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/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
}

这个函数很相似readbehaves靠近指挥。这里是一个简单的使用后由使用read_secretread相似。一个输入read_secret出现空,因为它是不echoed到终端。

1
2
3
4
5
6
7
8
9
10
[susam@cube ~]$ read a b c
foo \bar baz \qux
[susam@cube ~]$ echo a=$a b=$b c=$c
a=foo b=bar c=baz qux
[susam@cube ~]$ unset a b c
[susam@cube ~]$ read_secret a b c

[susam@cube ~]$ echo a=$a b=$b c=$c
a=foo b=bar c=baz qux
[susam@cube ~]$ unset a b c

这里是另一个选择是使用一个反斜线-r词在输入。本厂read_secret因为以上所有参数的函数定义的护照信息read接收到的命令。

1
2
3
4
5
6
7
8
9
10
[susam@cube ~]$ read -r a b c
foo \bar baz \qux
[susam@cube ~]$ echo a=$a b=$b c=$c
a=foo b=\bar c=baz \qux
[susam@cube ~]$ unset a b c
[susam@cube ~]$ read_secret -r a b c

[susam@cube ~]$ echo a=$a b=$b c=$c
a=foo b=\bar c=baz \qux
[susam@cube ~]$ unset a b c

最后,这里是如何使用的例子,显示read_secret阅读密码函数A的POSIX兼容的方式。

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


我发现了一个漫游askpass指挥。

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

输入字符是由一个取代的*。湖:*给密码


echo使用stty转向开关,然后回到了售后。


所以,你可以设置密码提示没有变。当前在做什么样本:壳

1
$(read -s;echo $REPLY)

例如:

1
my-command --set password=$(read -sp"Password:";echo $REPLY)

你可以添加一些论文prompted值与线的突破,是这样做的:

1
2
3
my-command --set user=$(read -sp"`echo $'
 '`
User:"
;echo $REPLY) --set password=$(read -sp"`echo $'
 '`
Password:"
;echo $REPLY)

这个链接是帮助确定,*如何使用密码和读取它没有回声回的终端.*如何*每个字符一个字符替换。

http:///www.tutorialkart.com bash Bash Shell脚本读取用户名和密码/


这些人是第一,如果要存储在文件的任何密码,我会确保它的散列。它不是最好的,但至少它的安全,将不在纯文本。

  • 第一个哈希密码和创建它:

    1
    echo"password123" | md5sum  | cut -d '-' -f 1 > /tmp/secret
  • 现在,创建您的项目使用的哈希。本案例中,这个小程序接收用户输入一个密码,没有引用,然后把它与存储的哈希散列的一个相比。如果它匹配存储的哈希,然后接入是样的:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #!/bin/bash

    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