You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 10:05:09