自定义 PAM 在 SSH 中的 PAM_CONVERSATION 失败

问题描述

我一直在尝试为第二因素验证实施自定义PAM自定义 PAM 需要读取选定的因子(整数)并将其传递给程序。下面的代码SUDOSU 中工作正常,但我收到“连接被主机端口 22 关闭”尝试使用 SSH 时出错。谁能帮我解决这个问题。

static char *request_pass(pam_handle_t *pamh,int echocode,PAM_CONST char *prompt) 
{
    // Query user for verification code
    PAM_CONST struct pam_message msg = { .msg_style = PAM_PROMPT_ECHO_ON,.msg = prompt };
    PAM_CONST struct pam_message *msgs = &msg;

    // PAM_CONST struct pam_message msg;
    struct pam_conv conv = {re,NULL};
    struct pam_response *resp = NULL;
    int retval = re(1,&msgs,&resp,"");
    return "";
}
int re(int nummsg,PAM_CONST struct pam_message **msg,struct pam_response **resp,void *appdata_ptr)
{
    *resp = malloc(sizeof(struct pam_response));
    assert(*resp);
    (*resp)->resp = calloc(1024,1);

    printf("%s^^ ",msg[0]->msg);
    fflush(stdout);
    assert(fgets((*resp)->resp,1024,stdin));
    char *ret = NULL;
    ret = (*resp)->resp;
   

  // Deallocate temporary storage
    if (*resp) 
    {
        if (!ret) 
        {
            free((*resp)->resp);
        }
        free(*resp);
    }
    factorselect = atoi(ret);
    return PAM_SUCCESS;
}

编辑:下面的代码我有用(已解决

char *
s_prompt(void *arg,const char *prompt,char *buf,size_t bufsz)
{
    char *p = NULL;

    if (pam_prompt((pam_handle_t *)arg,PAM_PROMPT_ECHO_ON,&p,"%s",prompt) != PAM_SUCCESS || p == NULL) {
        return (NULL);
    }
    strncpy(buf,p,bufsz);
    free(p);
    return (buf);
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)