通过Bash安全地传递密码

3
我正在编写一个Bash脚本,用于为我们的Ubuntu机器进行初始设置和加入Windows域,以便那些对Linux一无所知的人也能轻松完成。我发现很多人说不应该通过脚本传递密码,但为了效率,我必须这样做。脚本在开始时会提示输入信息和凭据,并且需要能够在不需要交互的情况下完成工作。当我传递它时,我不能让它在ps中可见,也不能将其存储为不安全的变量。有什么建议吗?

你需要传递密码的命令是什么? - Gilles 'SO- stop being evil'
1个回答

6
如果你真的必须这样做,你可以在脚本早期使用“read -s”将凭据读入变量,然后将这些值传递给提示符。例如:
read -p "Enter your username: " username
read -sp "Enter your password: " password
echo

我在代码中加入了空白的 echo,因为 read 命令的 -s 选项会阻止用户输入显示在终端上,包括用户按下 Enter 后通常会创建的新行。

然后,您可以在脚本的其余部分使用 $username$password 变量,而凭据不必存储在内存之外,这意味着它们将在脚本完成后被丢失/销毁。

但是,请注意,任何以命令行参数形式接受凭据的程序或实用程序都将向在运行该脚本的计算机上的其他用户显示这些凭据。例如,如果我使用此方法运行 MySQL 查询,则可以执行以下操作:

mysql -u "${username}" -p"${password}" -e "SHOW DATABASES;"

当该程序运行时,机器上的其他用户可以通过类似于 ps 的方式查看凭据:

ps -ef | grep mysql
...
watrudoin   29512 29443  0 12:57 pts/4    00:00:00 mysql -u MyUserName -phunter2 -e SHOW DATABASES

你只需要知道你所做的不一定是安全的,但是看起来你已经知道了。


1
一些命令允许在配置文件中设置密码,并从标准输入读取配置文件,例如以下结构:echo "-u user\n -p $pw" | curl -K - ...,这样你就可以在不可见的情况下传递密码(请勿直接使用curl配置,请根据需要检查所需的命令或尝试选择支持此功能的命令)。 - Stefan Hegny
是的,许多命令或实用程序都将包括类似的功能。我提到了“任何将凭据作为命令行参数的程序或实用程序”的警告。 - edaemon
当我传递它时,我不能让它在 ps 中可见。 - Gilles 'SO- stop being evil'
@Gilles -- 对的,他/她想要避免这种情况。这就是为什么我包含了那个警告,以便他/她知道如果他们使用上面的read -s方法并将其产生的变量用作命令行参数,那么ps 向其他用户显示它。也许这只是一个令人困惑的过度解释。(顺便感谢您的引用修正。) - edaemon
4
@edaemon 刚刚看到这个,我很喜欢hunter2的提及 :) - Josh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接