pam-python认证过程无法实时回显输出问题咨询
PAM-Python 认证脚本实时输出延迟及重复输出问题
问题现象
使用pam-python编写认证脚本时,脚本执行过程中无法实时向用户返回输出,所有内容仅在脚本执行完成后才会一次性显示。另外在Ubuntu 24.04.1 LTS系统上,还会出现输出内容重复发送给用户的异常。
以下是模拟认证流程的示例脚本,脚本尝试向用户展示操作指引并模拟API调用过程,但所有pamh.conversation()的输出都会在脚本结束后才显示:
import sys import time def pam_sm_authenticate(pamh, flags, argv): try: # 模拟向用户展示10行操作指引 for i in range(10): msg = pamh.Message(pamh.PAM_TEXT_INFO, '重要提示信息') pamh.conversation(msg) # 模拟认证流程中的API调用过程 for i in range(5): msg = pamh.Message(pamh.PAM_TEXT_INFO, '重要提示信息') pamh.conversation(msg) time.sleep(1) except Exception as e: print(f"发生异常: {e}") return 1 return 0 def pam_sm_setcred(pamh, flags, argv): return 0
对应的PAM配置示例:
auth requisite /lib/x86_64-linux-gnu/security/pam_python3.so /lib/x86_64-linux-gnu/security/test.py
解决方案
1. 解决实时输出延迟问题
PAM对话机制默认存在缓冲区,导致输出无法实时推送,可通过以下方式处理:
- 每次调用
pamh.conversation()后,手动刷新标准输出缓冲区:import sys # ... pamh.conversation(msg) sys.stdout.flush()
2. 解决Ubuntu 24.04.1 LTS上的重复输出问题
该版本系统中pam-python3模块可能存在调用逻辑bug,结合脚本自身问题,可尝试以下修复:
- 修正脚本缩进错误:原示例脚本内层循环缩进错误,导致外层循环的每一次迭代都会重复执行内层循环,直接引发重复输出。修正后的循环部分:
# 模拟向用户展示10行操作指引 for i in range(10): msg = pamh.Message(pamh.PAM_TEXT_INFO, '重要提示信息') pamh.conversation(msg) sys.stdout.flush() # 模拟认证流程中的API调用过程 for i in range(5): msg = pamh.Message(pamh.PAM_TEXT_INFO, '认证进程中...') pamh.conversation(msg) sys.stdout.flush() time.sleep(1) - 升级pam-python3到最新版本:执行
sudo apt update && sudo apt upgrade pam-python3 - 调整PAM配置中的模块控制标志,将
requisite改为required测试,或调整模块加载顺序。
验证方法
修改脚本和配置后,通过SSH登录或su命令测试认证流程,观察输出是否实时显示且无重复。
内容的提问来源于stack exchange,提问作者Marinus
相关产品推荐
相关产品推荐

