Linux脚本:隐藏terminal上的用户input

我有bash脚本,如下所示:

#!/bin/bash echo "Please enter your username"; read username; echo "Please enter your password"; read password; 

我希望当用户在terminal上input密码时,不应该显示(或类似*******)的东西)。 我如何做到这一点?

只要提供给您的阅读电话就像这样:

 $ read -s PASSWORD $ echo $PASSWORD 

更新

如果你想通过输出每个字符输出一个* ,你可以做这样的事情(使用andreas的read -s解决scheme):

 unset password; while IFS= read -r -s -n1 pass; do if [[ -z $pass ]]; then echo break else echo -n '*' password+=$pass fi done 

不要幻想

 echo "Please enter your username"; read username; echo "Please enter your password"; stty -echo read password; stty echo 

对于一个解决scheme,没有bash或从read某些function,您可以使用stty来禁用回声

 stty_orig=`stty -g` stty -echo read password stty $stty_orig 

这里是@ SiegeX的优秀的*打印解决schemebash 支持backspace的变化 ; 这允许用户使用backspace键(Mac上的delete键)更正他们的input,这通常由密码提示支持:

 #!/usr/bin/env bash password='' while IFS= read -r -s -n1 char; do [[ -z $char ]] && { printf '\n'; break; } # ENTER pressed; output \n and break. if [[ $char == $'\x7f' ]]; then # backspace was pressed # Remove last char from output variable. [[ -n $password ]] && password=${password%?} # Erase '*' to the left. printf '\b \b' else # Add typed char to output variable. password+=$char # Print '*' in its stead. printf '*' fi done 

注意:

  • 至于为什么按退格键logging字符代码0x7f :“在现代系统中,退格键通常映射到删除字符(ASCII或Unicode的0x7f)” https://en.wikipedia.org/wiki/Backspace
  • \b \b是需要给出的删除左边的字符的外观 ; 只要使用\b将光标移动到左边,但保持字符完整( 无损退格)。 通过打印一个空间再移回来,这个angular色似乎已经被删除了(感谢,C中的“退格”转义字符'\ b',意外的行为? )。

在一个只有POSIX的 shell中(例如,在Debian和Ubuntu上sh ,其中shdash ), 使用stty -echo方法 (这是不理想的,因为它不打印任何内容 ),因为read内build不会支持-s-n选项。

这是@ SiegeX的答案的一个变种,与传统的Bourne shell(不支持+=赋值)一起工作。

 password='' while IFS= read -r -s -n1 pass; do if [ -z "$pass" ]; then echo break else printf '*' password="$password$pass" fi done 

我总是喜欢用Ansi转义字符:

 echo -e "Enter your password: \x1B[8m" echo -e "\x1B[0m" 

8m使文本不可见, 0m将文本重置为“正常”。 -e让Ansi逃脱成为可能

唯一的警告是,你仍然可以复制和粘贴那里的文本,所以如果你真的需要安全的话,你可能不应该使用它。

它只是让人们不要看你的密码,当你input英寸只是不要把你的电脑之后。 🙂


注意:

以上是平台独立的,只要它支持Ansi转义序列。

但是,对于另一个Unix解决scheme,您可以简单地告诉read不要回显字符…

 printf "password: " let pass $(read -s) printf "\nhey everyone, the password the user just entered is $pass\n" 

有点不同(但主要是)@ lesmana的答案

 stty -echo read password stty echo 

简单地说:隐藏回声你的东西显示回声