在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。