我有一个脚本需要密码来验证 Web 服务。预定义用户的单个密码就足够了,并且如果可能的话,应该安全地存储密码(不是纯文本)。
显然,出于安全原因,我不想在脚本中以明文形式写入密码,因此我让脚本询问我密码,但每次输入密码都很麻烦。
那么我怎样才能做到这样我就不必每次运行脚本时都输入密码(例如sudo
)?
本例中的脚本是 Python,但我想最好将其实现为 Bash 中的通用解决方案,这样它就可以重用于 PHP 或 Ruby 等不同语言。
伪代码:
#!/bin/bash
pw = cache.load() or {
pw = ask_user()
cache.save(pw, 15min)
}
myscript.py pw
答案1
不要重新发明你自己的密码存储。使用现有的。 Linux 世界主要集中在GNOME 钥匙圈。海马提供了一个方便的 GUI,用于探索和修改密钥环以及设置主密码。可以使用以下命令从命令行查询密钥环secret-tool
公用事业。
secret-tool store --label='Foobar webservice' service foobar account bob
pw=$(secret-tool lookup service foobar account bob)
商店中的密码不会自动过期,但访问商店的权限会自动过期。
答案2
我有类似的情况并使用(滥用?)gpg
公钥/私钥加密。好处是,在大多数系统上,都会设置特定密钥的访问限制密码保留 5 或 10 分钟,因此您只需输入密码一次,然后就可以继续使用它,并且在非使用它会过期,就像sudo
您可以轻松地将结果放入bash
or Python
(subprocess.check_output()) 中。对于加密,即存储,您不需要甚至不需要提供访问限制密码的新密码。
为此,我没有使用常用的公钥/私钥对,因为我通常不想保留对该对的访问权限。我后来发现pass
工作方式大致相同,管理多个密码文件,并根据与该程序使用的几个相同的原则来塑造我使用的 python 程序。
答案3
干得好:
#!/bin/bash
newTS=`date +%s`
if test -r ~/.password
then
. ~/.password
else
TS=0
fi
if test `expr $newTS - $TS` -gt 900
then
# outdated password record
rm -f ~/.password
printf "Please enter your password: "
read password
printf "export TS=$newTS\nexport password=$password\n" > ~/.password
fi
echo "using password: $password"
~/.password
注意:除非您重命名,否则前面的代码将覆盖该文件。