我正在处理完全相同的问题,实际上最终得到了与 kecer 建议的相同的解决方案。因为我需要在几十个脚本中使用它,所以我创建了自己的库。让我与您分享这个解决方案。
credlib.py -- 处理凭据的通用库
class credential:
def __init__(self, hostname, username, password):
self.hostname = hostname
self.username = username
self.password = password
mycredentials.py -- 用于存储所有凭据的本地文件
from credlib import credential
sys_prod = credential("srv01", "user", "pass")
sys_stg = credential("srv02", "user", "pass")
sys_db = credential("db01", "userdb", "passdb")
mysystemlib.py -- 这是访问我的系统的通用库(支持新的凭证系统和旧的凭证系统)
from credlib import credential
def system_login(*args): # this is new function definition
#def system_login(hostname, username, password): # this was previous function definition
if len(args) == 1 and isinstance(args[0], credential):
hostname = args[0].hostname
username = args[0].username
password = args[0].password
elif len(args) == 3:
hostname = args[0]
username = args[1]
password = args[2]
else:
raise ValueError('Invalid arguments')
do_login(hostname, username, password) # this is original system login call
main.py -- 结合凭据和系统库的主脚本
from mycredentials import sys_stg, sys_db
import mysystemlib
...
mysystemlib.system_login(sys_stg)
请注意,旧的主机名/用户名/密码方式仍然有效,因此不会影响旧脚本:
mysystemlib.system_login("srv02", "user", "pass")
这有很多好处:
- 我们所有的 python 脚本都使用相同的凭据系统
- 有密码的文件是分开的(文件可以有更严格的权限)
- 文件不存储在我们的 git 存储库中(通过
.gitignore 排除),因此我们的 python 脚本/库可以在不暴露凭据的情况下与其他人共享(每个人都在本地文件中定义自己的凭据)
- 如果需要更改密码,我们只在一个地方进行