Contents

在Bash终端中隐藏用户输入

1.概述

在 Bash 中,我们可以看到我们在终端中输入的任何内容。但是,可能存在我们不希望这种行为的情况。一种情况可能是在终端或 Bash 脚本中向用户请求密码。

在本教程中,我们将介绍一些在终端或 Bash 脚本中隐藏用户输入的方法:

  • read 命令
  • stty 命令
  • Python 编程语言

2.使用read命令

顾名思义,read 命令从终端读取一行并将其拆分为字段:

$ read first_variable second_variable
aaa bbb
$ echo $first_variable
aaa
$ echo $second_variable
bbb

默认情况下,read命令使用空白字符作为分隔符。因此,shell 变量first_variable的值是aaa,shell 变量second_variable的值是bbb

正如我们在read命令的输出中看到的,我们键入的输入aaa bbb已在终端中回显。如果我们不希望我们输入的内容在终端中回显怎么办?例如,我们可能想要求输入密码。我们可以使用read命令的*-s*选项

$ read -s -p "Please enter your password: " passwd
Please enter your password:

在这里,我们输入的密码并没有打印在终端中。*这是因为-s选项。-s选项不会将输入的输入回显到标准输出(在本例中为终端)。-p选项在读取输入之前打印它后面的字符串。*在我们的示例中,它只是打印了提示“请输入您的密码:”passwd是将存储输入的shell 变量,在我们的例子中是用户输入的密码。假设我们输入了secret_password 作为输入,我们现在已经获得了密码:

$ echo $passwd
secret_password

3. 使用stty命令

stty 命令显示或更改终端的设置,对于隐藏用户输入也很有用。

我们可以使用stty命令的echo设置来启用或禁用输入字符的回显。

stty -echo禁用回显——不会显示输入字符。另一方面,stty echo启用回显,这意味着输入的字符将照常显示在终端中。让我们使用此设置在 Bash 脚本get_password.sh中获取密码:

#!/bin/bash
echo "Please enter your password: "
stty -echo
read passwd
stty echo
echo "The password is: $passwd"

让我们运行这个脚本:

$ get_password.sh
Please enter your password: 
The password is: secret_password

如果我们在调用终端中已经存在一个名为passwd的 shell 变量,那么在 Bash 脚本中更改该 shell 变量的值不会影响它在调用终端中的值:

$ passwd="my_password"
$ get_password.sh
Please enter your password:
The password is: secret_password
$ echo $passwd
my_password

如果我们想在调用终端中更改 shell 变量的值,我们应该通过source 运行脚本:

$ passwd="my_password"
$ . get_password.sh
Please enter your password: 
The password is: secret_password
$ echo $passwd
secret_password

我们更喜欢在 Bash 脚本中使用stty命令,因为如果我们直接在终端中使用它,我们也不会看到在命令stty -echo之后键入的命令。这些命令只有在我们输入命令stty echo后才可见。

4. 使用 Python 编程语言

Python 编程语言通常安装在Linux 发行版中。我们可以从终端执行 Python 语句,而无需编写 Python 脚本:

$ user_password=$(python -c "import getpass; passwd=getpass.getpass(); print(passwd)")
Password:
$ echo $user_password
secret_password

传递给python命令的*-c*选项允许我们从终端执行 Python 语句。

双引号中的第一条语句import getpass导入getpass模块。该模块是 Python 标准库的一部分。我们可以将 Python 模块比作 C 编程语言中的头文件。模块只是一个包含 Python 定义和语句的文件。

我们使用getpass模块的getpass()方法作为双引号中的第二个语句passwd=getpass.getpass()。** getpass()方法提示用户密码而不回显输入的输入,这正是我们想要的。然后,我们将用户键入的密码分配给 Python 变量passwd

默认情况下,提示的字符串是*“passwd:”*,但我们可以更改它:

$ user_password=$(python -c "import getpass; passwd=getpass.getpass('Please enter your password: '); print(passwd)")
Please enter your password: 
$ echo $user_password 
secret_password

如我们所见,我们可以将提示的字符串指定为*getpass()*方法的参数。

最后,我们使用语句print(passwd)打印 Python 变量passwd由于命令替换print语句的输出被分配给 shell 变量user_password