你知道有一个内置的 Bash 命令,叫做read
. 如果我想在我的脚本中这样做怎么办:
read PASSWROD
当它提示我输入时,我的所有输入都是可见的。是否有替代命令可以使输入不可见。
你知道有一个内置的 Bash 命令,叫做read
. 如果我想在我的脚本中这样做怎么办:
read PASSWROD
当它提示我输入时,我的所有输入都是可见的。是否有替代命令可以使输入不可见。
是时候学习如何手动 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 delim
delim 的第一个字符用于终止输入行,而不是换行符。
-e
Readline(参见第 8 章 [命令行编辑],第 93 页)用于获取行。Readline 使用当前(或默认,如果行编辑之前未激活)编辑设置。
-i text
如果使用 Readline 读取行,则在开始编辑之前将文本放入编辑缓冲区。
-n nchars
read 在读取 nchars 字符后返回,而不是等待完整的输入行,但如果在分隔符之前读取的 nchars 个字符少于 nchars,则使用分隔符。
-N nchars
read 在准确读取 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
在它之后立即添加一个,因为换行符也没有回显(尽管它不包含在密码中)。
您可以使用以下几行:
stty -echo
read -p "Password: " passw; echo
stty echo
这将echo
在密码读取之间打开和关闭。
您可以使用终端设置来关闭回声:
#!/bin/bash
# Disable echo
stty -echo
#Prompt and read password
printf "Password: "
read PASSWORD
# Turn echo back on
stty echo
printf "\n"
read -s -p "Password: " passw
在 bash 上工作