PAM从入门到精通(十五)

news2024/11/15 21:33:45

接前一篇文章:PAM从入门到精通(十四)

本文参考:

《The Linux-PAM Application Developers' Guide》

先再来重温一下PAM系统架构:

更加形象的形式:

六、整体流程示例

1. 官方文档中的例程及解析

从PAM从入门到精通(四)起到上一回止,整体结合实例讲解了《The Linux-PAM Application Developers' Guide》中的“Chapter 3. The public interface to Linux-PAM”中的3.1,实际上对应了上图中的PAM-API部分。不过看了各函数之后,对于总体流程还是缺少了了解和把握。本回就以一个示例(代码)将之前这些函数串起来,以对于总体流程以及各函数之间的顺序和关系有更好的理解。

示例代码参见《The Linux-PAM Application Developers' Guide》的“Chapter 8. An example application ”。

为了了解Linux PAM应用程序的编写方式,我们包括以下示例。它会提示用户输入密码,并在标准输出中指示他们的帐户是否有效,其返回代码也指示成功与否(0表示成功;1表示失败)。

代码如下:

/*
  This program was contributed by Shane Watts
  [modifications by AGM and kukuk]
  You need to add the following (or equivalent) to the
  /etc/pam.d/check_user file:
  # check authorization
  auth required pam_unix.so
  account required pam_unix.so
 */
#include <security/pam_appl.h>
#include <security/pam_misc.h>
#include <stdio.h>

static struct pam_conv conv = {
    misc_conv,
    NULL
}

int main(int argc, char *argv[])
{
    pam_handle_t *pamh=NULL;
    int retval;
    const char *user="nobody";

    if(argc == 2) {
        user = argv[1];
    }
    if(argc > 2) {
        fprintf(stderr, "Usage: check_user [username]\n");
        exit(1);
    }

    retval = pam_start("check_user", user, &conv, &pamh);

    if (retval == PAM_SUCCESS)
        retval = pam_authenticate(pamh, 0); /* is user really user? */

    if (retval == PAM_SUCCESS)
        retval = pam_acct_mgmt(pamh, 0); /* permitted access? */

    /* This is where we have been authorized or not. */
    if (retval == PAM_SUCCESS) {
        fprintf(stdout, "Authenticated\n");
    } else {
        fprintf(stdout, "Not Authenticated\n");
    }
 
    if (pam_end(pamh,retval) != PAM_SUCCESS) { /* close Linux-PAM */
        pamh = NULL;
        fprintf(stderr, "check_user: failed to release authenticator\n");
        exit(1);
    }

    return ( retval == PAM_SUCCESS ? 0:1 ); /* indicate success */
}

说实话,这代码写得很一般,argc为1时的情况没有考虑进来。不过不必关注这些细枝末节,人家把主要的流程讲清楚了。整个流程分为以下步骤:

(1)pam_start函数

代码片段:

    retval = pam_start("check_user", user, &conv, &pamh);

作用:

PAM事务初始化。

pam_start函数创建PAM上下文并启动PAM事务。它是应用程序需要调用的第一个PAM函数。事务状态完全包含在此句柄标识的结构中,因此可以并行处理多个事务。但是不可能对不同的事务使用相同的句柄,每个新的上下文都需要一个新的句柄。

(2)pam_authenticate函数

代码片段:

    retval = pam_authenticate(pamh, 0); /* is user really user? */

作用:

对用户进行身份认证。

pam_authenticate函数用于对用户进行身份验证。用户被要求提供一个基于身份验证服务的身份验证令牌,通常这是一个密码,但也可能是指纹。

PAM服务模块可以请求用户通过对话机制输入其用户名(参见pam_start()和pam_conv())。经过身份验证的用户名称将出现在PAM的PAM_USER项中。可以通过调用pam_get_item()来恢复此项目。

(3)pam_acct_mgmt函数

代码片段:

    retval = pam_acct_mgmt(pamh, 0); /* permitted access? */

作用:

账户验证管理。

pam_acct_mgmt函数用于确定用户的帐户是否有效。它检查身份验证令牌和帐户过期与否,并验证访问限制。其通常在用户经过身份验证后调用。

(4)pam_end

代码片段:

    if (pam_end(pamh,retval) != PAM_SUCCESS) { /* close Linux-PAM */
        pamh = NULL;
        fprintf(stderr, "check_user: failed to release authenticator\n");
        exit(1);
    }

作用:

PAM事务终止。

pam_end函数终止pam事务,是应用程序应在pam上下文中调用的最后一个函数。此函数为与pam_set_item和pam_get_item函数关联的项释放了所有内存。调用pam_end()后,与此类对象关联的指针不再有效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1113943.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数字人引领政务革新,AI智慧政务一体机的未来服务之路

数字人、数字员工&#xff0c;已是当下不可忽视的新型劳动者&#xff0c;它们在众多领域频频出圈&#xff0c;持续打破人们的固有认知。在近期公布的2023数字人实践案例TOP10里&#xff0c;CCTV央视网数字代言人阿央”带领新一代青年紧跟国家大事、关注国家发展&#xff1b;首位…

Java操作Python及数据交互最佳实践

Java操作Python最佳实践 1、Java与Python的互操作性2、Java调用Python脚本及数据交互2.1、准备工作2.2、执行一段Python代码2.3、执行Python文件脚本2.4、执行Python文件中的指定方法2.5、执行含有第三方库的Python文件3、附录(完整代码)1、Java与Python的互操作性 在当今的软…

Mac电脑无法识别移动硬盘怎么办?

很多人都喜欢在Mac电脑上办公、学习&#xff0c;但有时我们将移动硬盘连接Mac电脑时&#xff0c;却会发现电脑无法识别移动硬盘。那么&#xff0c;Mac电脑无法识别移动硬盘怎么办呢&#xff1f; Mac无法识别移动硬盘的原因 导致Mac不识别移动硬盘的原因有很多&#xff0c;你可…

交换机知识汇总大全,值得收藏!

下午好&#xff0c;我的网工朋友。 说到网工相关的网络设备&#xff0c;你的第一反应是啥&#xff1f;答案基本上都是交换机&#xff0c;是吧。 交换机作为网工最常用的设备之一&#xff0c;你懂多少&#xff1f; 今天想带你温顾一番交换机的基础知识&#xff0c;顺便说说&a…

iOS如何实现语音转文字功能?

1.项目中添加权限 Privacy - Speech Recognition Usage Description : 需要语音识别权限才能实现语音转文字功能 2.添加头文件 #import <AVFoundation/AVFoundation.h> #import<Speech/Speech.h> 3.实现语音转文字逻辑: 3.1 根据wav语音文件创建请求 SFSpeechU…

Macos文件列表创建工具:Nifty File Lists for mac

Nifty File Lists Mac是一款功能强大的文件列表工具&#xff0c;它可以帮助用户在Mac电脑上保存、整理和编辑文件列表。该软件支持将文件列表保存为MS Excel、数字和页面友好的CSV&#xff08;逗号分隔值&#xff09;、TSV&#xff08;制表符分隔值&#xff09;甚至HTML格式&am…

并发程序设计

一、进程的创建和回收 (一)进程的概念 1、进程&#xff01;程序 程序是静态的&#xff0c;而进程是动态的&#xff0c;进程是程序执行的一种状态。 2、进程和程序的区别 1&#xff09;进程控制块中包含进程的属性 2&#xff09;程序在磁盘里面&#xff0c;堆栈都是在内存中…

【TA 挖坑05】效果:空间切换 场景切换

不知不觉挖坑都第5篇了&#xff0c;&#xff0c;&#xff0c;&#xff0c;再不填坑就成挖坑专业户拉&#xff01;&#xff01;&#xff01; 记录一下想实现的效果&#xff0c;实际上之前尝试从shader层面做能看得过去的&#xff0c;但是应用起来很拉跨&#xff0c;必须场景所有…

多模态GPT-V出世!36种场景分析ChatGPT Vision能力,LMM将全面替代大语言模型? | 京东云技术团队

LMM将会全面替代大语言模型&#xff1f;人工智能新里程碑GPT-V美国预先公测&#xff0c;医疗领域/OCR实践166页GPT-V试用报告首发解读 ChatGPT Vision&#xff0c;亦被广泛称为GPT-V或GPT-4V&#xff0c;代表了人工智能技术的新里程碑。作为LMM (Large Multimodal Model) 的代表…

Redis:2023年的必修课,不学就要被市场淘汰

一、同样是缓存&#xff0c;用map不行吗&#xff1f; Redis可以存储几十个G的数据&#xff0c;Map行吗&#xff1f;Redis的缓存可以进行本地持久化&#xff0c;Map行吗&#xff1f;Redis可以作为分布式缓存&#xff0c;Map只能在同一个JVM中进行缓存&#xff1b;Redis支持每秒…

Redux 学习笔记

在使用 React Redux 前&#xff0c;我们首先了解一下 Redux 的一些基础知识。 Redux 是 JavaScript 应用程序中用于状态管理的容器。它不依赖于任何框架&#xff0c;可以与任何 UI 库和框架一起使用。在应用程序中使用 Redux 时&#xff0c;Redux 是以可预测的方式管理状态。 …

鸿蒙HarmonyOS应用开发:扫描仪文件扫描

华为鸿蒙HarmonyOS已经发展到4.0&#xff0c;使用ArkTS作为开发语言。这篇文章结合Dynamsoft Service开发一个简单的鸿蒙应用&#xff0c;用来获取办公室里连接PC的扫描仪(惠普&#xff0c;富士通&#xff0c;爱普生&#xff0c;等)&#xff0c;把文档扫描到手机里。 准备工作…

Python 3.12.0 Release 版本

本心、输入输出、结果 文章目录 Python 3.12.0 Release 版本前言与 Python 3.11 相比&#xff0c;Python 3.12 系列主要更新了哪些新的功能更灵活的 f 字符串解析&#xff0c;允许许多以前不允许的事情 &#xff08;PEP 701&#xff09;。支持 Python 代码中的缓冲区协议 &…

Unity实现方圆X范围随机生成怪物

using System.Collections; using System.Collections.Generic; using UnityEngine;public class CreatMonster : MonoBehaviour {// S这个脚本间隔一点时间生成怪物/*1.程序逻辑* 1. 设计一个计时器* 2.间隔一段时间3s执行一下 * */float SaveTime 0f;public GameObject …

【215. 数组中的第K个最大元素】

目录 一、题目描述二、算法原理三、代码实现 一、题目描述 二、算法原理 三、代码实现 class Solution { public:int getRandom(int left,int right,vector<int>& nums){return nums[rand()%(right-left1)left];}int qsort(int l,int r,vector<int>& nums…

已经有多人中招,不要被AI换脸技术骗了!

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精…

LinkedList 源码解析(JDK1.8)

目录 一. 前言 二. 常用方法 三. 源码解析 3.1. 属性和内部类 3.2. 构造函数 3.3. 添加元素 3.4. 获取元素 3.5. 删除元素 3.6. 迭代器 3.6.1. 头到尾方向的迭代 3.6.2. 尾到头方向的迭代 3.6.3. add() 插入元素 3.6.4. remove() 移除元素 一. 前言 LinkedList同时…

ATA-8202射频功率放大器参数指标及应用介绍

ATA-8202射频功率放大器简介 ATA-8202是一款射频功率放大器。其P1dB输出功率100W&#xff0c;饱和输出功率200W。增益数控可调&#xff0c;一键保存设置&#xff0c;提供了方便简洁的操作选择&#xff0c;可与主流的信号发生器配套使用&#xff0c;实现射频信号的完美放大。宽…

JavaScript 中的Hoisting是什么?

在JavaScript中,Hoisting(变量提升)是指在代码执行之前,JavaScript引擎将变量和函数的声明提升到当前作用域的顶部的行为。 具体来说,JavaScript引擎在执行代码之前会进行两个步骤:编译阶段和执行阶段。在编译阶段,JavaScript引擎会将变量声明和函数声明提升到当前作用…

智能井盖监测系统,增加城市管理便捷性

看起来小小的井盖&#xff0c;实际上折射的是一个城市&#xff0c;一个地区的发展状况。每一个城市的道路网络&#xff0c;决定了一个城市发展的缓慢程度&#xff0c;哪怕是其中的井盖&#xff0c;有着自己的职责&#xff0c;是城市生命线的不可缺少的组成部分。但是现如今传统…