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
简单地说:隐藏回声你的东西显示回声