Python脚本获取GPG密钥过期信息:NRPE执行时私钥信息无法获取
解决方案
一、无需导入密钥的GPG命令
你的问题核心是NRPE运行脚本的用户(通常为nagios或nrpe)没有权限访问导入后的密钥环,或是导入操作在NRPE受限环境中未生效。可以直接读取私钥文件信息,无需导入到本地密钥环:
# 直接列出私钥文件的详细信息 gpg --list-secret-keys --batch --keyid-format long key.gpg > key_info.txt
如果需要机器易读的格式(方便脚本解析),用--with-colons参数:
gpg --show-keys --secret-key --with-colons key.gpg > key_info.txt
该格式输出的内容结构化强,避免了正则匹配纯文本的繁琐,脚本处理过期时间更高效。
二、使用python-gnupg模块获取密钥信息
完全可以用python-gnupg模块直接读取密钥文件、解析过期时间,无需依赖系统命令调用,兼容性和稳定性更好,尤其适配NRPE这类受限环境。
步骤1:安装模块
pip install python-gnupg
步骤2:示例代码
import gnupg from datetime import datetime def check_key_expiry(key_path, is_secret=False): gpg = gnupg.GPG() # 读取密钥文件内容 with open(key_path, 'rb') as f: key_content = f.read() # 扫描密钥信息(区分公钥/私钥) if is_secret: keys = gpg.scan_keys(key_content, secret=True) else: keys = gpg.scan_keys(key_content) # 解析并输出过期信息 for key in keys: key_id = key['keyid'] expiry_timestamp = key['expires'] if expiry_timestamp == '0': print(f"密钥 {key_id}: 永不过期") else: expiry_time = datetime.fromtimestamp(int(expiry_timestamp)) print(f"密钥 {key_id}: 过期时间 {expiry_time}") # 检查公钥 check_key_expiry('key.gpg', is_secret=False) # 检查私钥 check_key_expiry('key.gpg', is_secret=True)
scan_keys方法直接读取密钥文件内容,无需导入到密钥环,完美避开NRPE用户的权限问题;返回的字典自带expires字段,解析过期时间无需额外处理。
注意事项
- 确保NRPE运行用户拥有密钥文件的读取权限
- 若私钥有密码保护,检查过期时间无需解密,上述代码可直接运行
内容的提问来源于stack exchange,提问作者Ajay
相关产品推荐
相关产品推荐

