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 ,其中sh是dash ), 使用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
简单地说:隐藏回声你的东西显示回声