像 Sudo 一样记住自己脚本的密码

像 Sudo 一样记住自己脚本的密码

我有一个脚本需要密码来验证 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

您可以轻松地将结果放入bashor 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注意:除非您重命名,否则前面的代码将覆盖该文件。

相关内容