13

你知道有一个内置的 Bash 命令,叫做read. 如果我想在我的脚本中这样做怎么办:

read PASSWROD

当它提示我输入时,我的所有输入都是可见的。是否有替代命令可以使输入不可见。

4

4 回答 4

30

是时候学习如何手动 bash(在bash手册中,即;这是来自 Bash 4.1 版)。相关选项是-s

read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt]

[-t timeout] [-u fd] [name ...]

从标准输入中读取一行,或者从作为选项参数提供的文件描述符 fd 中读取一行-u,并将第一个单词分配给第一个名称,将第二个单词分配给第二个名称,依此类推,剩下的单词和分配给姓氏的中间分隔符。如果从输入流中读取的单词少于名称,则剩余的名称将分配为空值。IFS 变量值中的字符用于将行拆分为单词。反斜杠字符\可用于删除下一个字符读取和行继续的任何特殊含义。如果未提供名称,则将读取的行分配给变量 REPLY。返回码为零,除非遇到文件结尾、读取超时(在这种情况下,返回码大于 128),或者提供了无效的文件描述符作为-u.

选项(如果提供)具有以下含义:

-a aname单词被分配给数组变量 aname 的顺序索引,从 0 开始。在分配之前,所有元素都从 aname 中删除。其他名称参数被忽略。

-d delimdelim 的第一个字符用于终止输入行,而不是换行符。

-eReadline(参见第 8 章 [命令行编辑],第 93 页)用于获取行。Readline 使用当前(或默认,如果行编辑之前未激活)编辑设置。

-i text如果使用 Readline 读取行,则在开始编辑之前将文本放入编辑缓冲区。

-n ncharsread 在读取 nchars 字符后返回,而不是等待完整的输入行,但如果在分隔符之前读取的 nchars 个字符少于 nchars,则使用分隔符。

-N ncharsread 在准确读取 nchars 字符后返回,而不是等待完整的输入行,除非遇到 EOF 或读取超时。输入中遇到的分隔符字符不会被特殊处理,并且在读取 nchars 字符之前不会导致 read 返回。

-p prompt在尝试读取任何输入之前显示提示,不带尾随换行符。仅当输入来自终端时才会显示提示。

-r如果给出此选项,则反斜杠不会充当转义字符。反斜杠被认为是该行的一部分。特别是,反斜杠换行对不能用作续行。

-s静音模式。如果输入来自终端,则不会回显字符。

-t timeout 如果在 timeout 秒内未读取完整的输入行,则导致读取超时并返回失败。timeout 可以是一个小数,小数点后面有一个小数部分。此选项仅在 read 正在从终端、管道或其他特殊文件读取输入时有效;从常规文件读取时它没有效果。如果 timeout 为 0,如果输入在指定的文件描述符上可用,则 read 返回成功,否则失败。如果超时,退出状态大于 128。

-u fd从文件描述符 fd 读取输入。


因此,修正错字后,您需要:

read -s -p "Password: " PASSWORD

您可能希望echo在它之后立即添加一个,因为换行符也没有回显(尽管它不包含在密码中)。

于 2012-11-02T19:57:44.237 回答
9

您可以使用以下几行:

stty -echo
read -p "Password: " passw; echo
stty echo

这将echo在密码读取之间打开和关闭。

于 2012-11-02T19:55:06.100 回答
2

您可以使用终端设置来关闭回声:

#!/bin/bash
# Disable echo
stty -echo

#Prompt and read password
printf "Password: "
read PASSWORD

# Turn echo back on
stty echo
printf "\n"
于 2012-11-02T19:55:00.070 回答
1
read -s -p "Password: " passw 

在 bash 上工作

于 2014-02-25T00:55:03.150 回答