我有像下面这样的bash脚本:
#!/bin/bash
echo "Please enter your username";
read username;
echo "Please enter your password";
read password;
Run Code Online (Sandbox Code Playgroud)
我希望当用户在终端上输入密码时,不应该显示密码(或者应该显示*******).我该如何实现这一目标?
And*_*ong 252
只需为你的阅读电话提供-s:
$ read -s PASSWORD
$ echo $PASSWORD
Run Code Online (Sandbox Code Playgroud)
Sie*_*geX 24
如果您希望通过输入*他们键入的每个字符来获得想象力,您可以执行以下操作(使用andreas' read -s解决方案):
unset password;
while IFS= read -r -s -n1 pass; do
if [[ -z $pass ]]; then
echo
break
else
echo -n '*'
password+=$pass
fi
done
Run Code Online (Sandbox Code Playgroud)
没有花哨
echo "Please enter your username";
read username;
echo "Please enter your password";
stty -echo
read password;
stty echo
Run Code Online (Sandbox Code Playgroud)
les*_*ana 15
对于没有bash或某些功能的解决方案,read您可以使用它stty来禁用回声
stty_orig=$(stty -g)
stty -echo
read password
stty $stty_orig
Run Code Online (Sandbox Code Playgroud)
这是@ SiegeX优秀*打印解决方案的变体bash ,支持添加退格 ; 这允许用户使用backspace密钥(deleteMac上的密钥)更正其输入,这通常由密码提示支持:
#!/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
Run Code Online (Sandbox Code Playgroud)
注意:
0x7f:"在现代系统中,退格键通常映射到删除字符(ASCII或Unicode中的0x7f)" https://en.wikipedia.org/wiki/Backspace\b \b需要给出左边删除字符的外观 ; 只需使用\b将光标向左移动,但保持字符完整(非破坏性退格).通过打印空格并再次向后移动,角色似乎已被删除(谢谢,C中的"退格"转义字符'\ _',意外行为?).在一个只有POSIX的外壳(例如,sh在Debian和Ubuntu,这里sh是dash),使用stty -echo方法(这是最理想的,因为它打印什么),因为read内置的将不支持-s和-n选项.
与 @lesmana 的答案有点不同(但大多相似)
stty -echo
read password
stty echo
Run Code Online (Sandbox Code Playgroud)
简单地说:隐藏回声做你的事情显示回声
| 归档时间: |
|
| 查看次数: |
90935 次 |
| 最近记录: |