在 Bash 脚本中读取密码而不显示在屏幕上

Grz*_*cki 38 bash password

如何以一种工具不会在终端上显示密码的方式读取 bash 脚本中的密码?

(将字体更改为黑底黑字很容易通过复制和粘贴来解决,因此这不是解决方案。)

Ign*_*ams 47

来自help read

-s        do not echo input coming from a terminal
Run Code Online (Sandbox Code Playgroud)

  • @GrzegorzWierzowiecki:您正在查看错误的手册。你必须阅读 bash 的手册,即`man bash`,在那里你可以找到 -s 选项`静默模式。如果输入来自终端,则不会回显字符。` (5认同)
  • 伟大的。它没有写在我的“man read”中,我还没有检查“help read”。很高兴知道。 (2认同)

Dyl*_*lan 10

我总是习惯stty -echo关闭回声,然后阅读,然后再做stty echo(通过查看 man of stty- ie阅读更多man stty)。从程序员的角度来看,这更有用,因为您可以关闭回显,然后使用它们的标准 stdin“读取器”从 Java、C(++)、Python 等编程语言中读取密码。

在 bash 中,用法可能如下所示:

echo -n "USERNAME: "; read uname
echo -n "PASSWORD: "; stty -echo; read passwd; stty echo; echo
program $uname $passwd
passwd= # get rid of passwd
Run Code Online (Sandbox Code Playgroud)

例如,Python 看起来像:

from sys import stdout
from os import system as term

uname = raw_input("USERNAME: ") # read input from stdin until [Enter] in 2
stdout.write("PASSWORD: ")
term("stty -echo") # turn echo off
try:
    passwd = raw_input()
except KeyboardInterrupt: # ctrl+c pressed
    raise SystemExit("Password attempt interrupted")
except EOFError: # ctrl+d pressed
    raise SystemExit("Password attempt interrupted")
finally:
    term("stty echo") # turn echo on again

print "username:", uname
print "password:", "*" * len(passwd)
Run Code Online (Sandbox Code Playgroud)

我不得不在 Python 中多次这样做,所以从这个角度来看,我非常了解它。不过,这并不难翻译成其他语言。