本文目录导读:

我来介绍几种用脚本管理密码的方法,从简单到复杂:
基础脚本方案(简单实用)
Bash + GPG 加密
#!/bin/bash
# 密码管理器
PASS_DIR="$HOME/.passwords"
mkdir -p "$PASS_DIR"
# 添加密码
pass_add() {
read -sp "输入密码: " pass
echo "$pass" | gpg -c > "$PASS_DIR/$1.gpg"
}
# 获取密码
pass_get() {
gpg -d "$PASS_DIR/$1.gpg" 2>/dev/null
}
# 使用示例
case "$1" in
add) pass_add $2 ;;
get) pass_get $2 ;;
list) ls "$PASS_DIR" ;;
esac
Python 密码管理脚本
简单版本(SQLite + 加密)
#!/usr/bin/env python3
import sqlite3
import getpass
from cryptography.fernet import Fernet
import base64
import hashlib
import os
class PasswordManager:
def __init__(self, db_path='~/.pm.db'):
self.db_path = os.path.expanduser(db_path)
self.init_db()
def init_db(self):
conn = sqlite3.connect(self.db_path)
conn.execute('''CREATE TABLE IF NOT EXISTS passwords
(service TEXT PRIMARY KEY,
username TEXT,
encrypted_pass TEXT)''')
conn.close()
def get_key(self, master_pass):
return base64.urlsafe_b64encode(
hashlib.sha256(master_pass.encode()).digest()
)
def add_password(self, service, username, password, master):
key = self.get_key(master)
f = Fernet(key)
enc_pass = f.encrypt(password.encode()).decode()
conn = sqlite3.connect(self.db_path)
conn.execute("INSERT OR REPLACE INTO passwords VALUES (?,?,?)",
(service, username, enc_pass))
conn.commit()
conn.close()
def get_password(self, service, master):
key = self.get_key(master)
f = Fernet(key)
conn = sqlite3.connect(self.db_path)
row = conn.execute("SELECT * FROM passwords WHERE service=?",
(service,)).fetchone()
conn.close()
if row:
dec_pass = f.decrypt(row[2].encode()).decode()
return row[1], dec_pass
return None
命令行工具方案(功能丰富)
使用 pass(标准工具)
# 安装 pass sudo apt install pass # Ubuntu/Debian brew install pass # macOS # 初始化 pass init your-gpg-key-id # 常用命令 pass insert email/gmail # 添加密码 pass show email/gmail # 查看密码 pass generate website/example # 生成随机密码 pass edit email/gmail # 编辑密码 pass rm email/gmail # 删除密码 pass ls # 列出所有密码
自定义 Python CLI
#!/usr/bin/env python3
# simple-pass.py
import argparse
import json
import os
import secrets
import string
from getpass import getpass
class SimplePassManager:
def __init__(self):
self.data_file = os.path.expanduser("~/.simple_pass.json")
self.data = self.load_data()
def load_data(self):
if os.path.exists(self.data_file):
with open(self.data_file, 'r') as f:
return json.load(f)
return {}
def save_data(self):
with open(self.data_file, 'w') as f:
json.dump(self.data, f, indent=2)
def add(self, service, username, password):
self.data[service] = {
'username': username,
'password': password
}
self.save_data()
def get(self, service):
return self.data.get(service, None)
def generate(self, length=16):
chars = string.ascii_letters + string.digits + "!@#$%^&*"
return ''.join(secrets.choice(chars) for _ in range(length))
def main():
parser = argparse.ArgumentParser(description='简单密码管理器')
parser.add_argument('action', choices=['add', 'get', 'gen', 'list'])
parser.add_argument('arg', nargs='?', help='服务名')
parser.add_argument('-l', '--length', type=int, default=16, help='密码长度')
args = parser.parse_args()
pm = SimplePassManager()
if args.action == 'add':
service = input("服务名: ")
username = input("用户名: ")
password = getpass("密码: ")
pm.add(service, username, password)
print(f"已保存 {service}")
elif args.action == 'get':
data = pm.get(args.arg)
if data:
print(f"服务: {args.arg}")
print(f"用户名: {data['username']}")
print(f"密码: {data['password']}")
else:
print(f"未找到 {args.arg}")
elif args.action == 'gen':
gen_pwd = pm.generate(args.length)
print(f"生成的密码: {gen_pwd}")
elif args.action == 'list':
for service in pm.data:
print(f"- {service}")
if __name__ == "__main__":
main()
进阶方案(安全增强)
结合 KeepassXC 命令行
#!/bin/bash
# 通过 keepassxc-cli 管理密码
KDBX_FILE="$HOME/Passwords.kdbx"
# 添加密码
kp_add() {
echo "服务: " ; read service
echo "用户名: " ; read username
read -sp "密码: " password
echo
keepassxc-cli add -u "$username" "$KDBX_FILE" "$service" <<< "$password"
}
# 获取密码复制到剪贴板
kp_get() {
keepassxc-cli show -q -a Password "$KDBX_FILE" "$1" | xclip -selection clipboard
echo "已复制到剪贴板"
}
# 生成强密码
kp_gen() {
keepassxc-cli generate -l 20 --lower --upper --numeric --special
}
自动化密码轮换
#!/usr/bin/env python3
# 自动轮换密码
import subprocess
import secrets
import string
from datetime import datetime
def generate_strong_password(length=20):
alphabet = string.ascii_letters + string.digits + "!@#$%^&*"
while True:
password = ''.join(secrets.choice(alphabet) for _ in range(length))
if (any(c.islower() for c in password) and
any(c.isupper() for c in password) and
any(c.isdigit() for c in password) and
any(c in "!@#$%^&*" for c in password)):
return password
def rotate_passwords(services):
"""定时轮换密码"""
for service in services:
new_pass = generate_strong_password()
# 更新到密码管理器
subprocess.run(['pass', 'insert', '-f', service],
input=new_pass, text=True)
# 记录日志
with open('rotation.log', 'a') as f:
f.write(f"{datetime.now()}: {service} 密码已轮换\n")
print(f"✓ {service} 密码已更新")
推荐的使用建议
日常使用流程
# 在 ~/.bashrc 添加别名 echo 'alias pm="python3 ~/scripts/pass_manager.py"' >> ~/.bashrc echo 'alias ps="pass show"' >> ~/.bashrc source ~/.bashrc # 使用示例 pm add # 添加新密码 pm get github # 获取github密码 pm gen 32 # 生成32位随机密码
安全提醒
- 主密码要强:建议20+位,混合大小写字母、数字、特殊字符
- 定期备份数据库文件
- 不要明文存储敏感信息
- 使用密钥文件替代密码输入
- 多因素认证配合使用
定时任务示例
# crontab 每周自动备份 0 2 * * 0 tar -czf ~/backup/passwords_$(date +%Y%m%d).tar.gz ~/.passwords # 每90天提醒更换密码 0 9 * * * if [ $(( ($(date +%s) - $(stat -c %Y ~/.last_rotated)) / 86400 )) -gt 90 ]; then notify-send "密码需要轮换了"; fi
选择哪种方案取决于你的需求:
- 简单实用:Bash + GPG
- 功能完整:Python 脚本 + SQLite
- 标准方案:使用 pass 或 KeepassXC
- 企业级:Vault 或 Kubernetes Secrets
建议从简单的开始,根据需求逐步增强,记得做好备份和加密!
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播