我正在编写一个Bash脚本,用于为我们的Ubuntu机器进行初始设置和加入Windows域,以便那些对Linux一无所知的人也能轻松完成。我发现很多人说不应该通过脚本传递密码,但为了效率,我必须这样做。脚本在开始时会提示输入信息和凭据,并且需要能够在不需要交互的情况下完成工作。当我传递它时,我不能让它在ps中可见,也不能将其存储为不安全的变量。有什么建议吗?
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
你只需要知道你所做的不一定是安全的,但是看起来你已经知道了。
echo "-u user\n -p $pw" | curl -K - ...
,这样你就可以在不可见的情况下传递密码(请勿直接使用curl配置,请根据需要检查所需的命令或尝试选择支持此功能的命令)。 - Stefan Hegnyread -s
方法并将其产生的变量用作命令行参数,那么ps
将向其他用户显示它。也许这只是一个令人困惑的过度解释。(顺便感谢您的引用修正。) - edaemon