PAM从入门到精通(十九)
接前一篇文章:PAM从入门到精通(十八)
本文参考:
《The Linux-PAM Application Developers' Guide》
PAM 的应用开发和内部实现源码分析
先再来重温一下PAM系统架构:

更加形象的形式:

六、整体流程示例
2. 更为完整的例程及解析
上一回讲解了更为详细复杂例程的第二部分,本文继续讲解其余部分。再来贴一下完整代码:
/* 使用PAM所必需的两个头文件*/
#include <security/pam_appl.h>
#include <security/pam_misc.h>static struct pam_conv conv = {misc_conv,NULL
}void main(int argc, char *argv[], char **renvp)
{pam_handle_t *pamh = NULL;int status;/* 初始化,并提供一个回调函数 */if ((pam_start("login", user_name, &conv, &pamh)) != PAM_SUCCESS)exit(1);/* 设置一些关于认证用户信息的参数 */pam_set_item(pamh, PAM_TTY, ttyn);pam_set_item(pamh, PAM_RHOST, remote_host);while (!authenticated && retry < MAX_RETRIES){status = pam_authenticate(pamh, 0);/* 认证,检查用户输入的密码是否正确 */}/* 认证失败则应用程序退出*/if (status != PAM_SUCCESS){……exit(1);}/* 通过了密码认证之后再调用帐号管理API,检查用户帐号是否已经过期 */if ((status = pam_acct_mgmt(pamh, 0)) != PAM_SUCCESS){if (status == PAM_AUTHTOK_EXPIRED){status = pam_chauthtok(pamh, 0); /* 过期则要求用户更改密码 */if (status != PAM_SUCCESS)exit(1);}}/* 通过帐户管理检查之后则打开会话 */if (status = pam_open_session(pamh, 0) != PAM_SUCCESS)exit(status);……/* 建立认证服务的用户证书*/status = pam_setcred(pamh, PAM_ESTABLISH_CRED);if (status != PAM_SUCCESS)exit(status);……pam_end(pamh, PAM_SUCCESS); /* PAM事务的结束 */……}
(6)pam_open_session函数
代码片段:
/* 通过帐户管理检查之后则打开会话 */if (status = pam_open_session(pamh, 0) != PAM_SUCCESS)exit(status);
作用:
启动PAM会话管理。pam_open_session函数为先前成功通过身份验证的用户设置用户会话。会话稍后应通过调用pam_close_session()来终止。
应该注意的是,应用程序的有效uid(通过geteuid()获得)应该具有足够的权限来执行例如创建或挂载用户主目录之类的任务。
参数详解:
- pam_handle_t *pamh
pamh参数是通过先前调用pam_start()获得的身份验证句柄。
此处传给pamh的实参为main函数中定义的pam_handle_t *pamh的地址&pamh。
- int flags
flags参数是以下值中的零个或多个的二进制或:
PAM_SILENT
不发出任何消息。
此处传给flags的实参为0。
(7)pam_setcred函数
代码片段:
/* 建立认证服务的用户证书*/status = pam_setcred(pamh, PAM_ESTABLISH_CRED);if (status != PAM_SUCCESS)exit(status);
作用:
设置用户凭证。pam_setcred函数用于建立、维护和删除用户的资格(凭据)。在对用户进行身份验证之后,在为用户打开会话之前(使用pam_open_session()),应该调用它来设置凭据。应在会话关闭后删除凭据(使用pam_close_session())。
凭据(credential)是用户所拥有的东西。它是一些属性,如Kerberos票证或者构成给定用户的唯一性的补附加组成员资格。在Linux系统上,用户的UID和GID也是凭据。但是,已经决定这些属性(以及用户所属的默认补充组)是应由应用程序而不是PAM直接设置的凭据。应用程序应在调用此函数之前建立此类凭据。例如,initgroups()(或等效操作)应该(已)被执行。
参数详解:
- pam_handle_t *pamh
pamh参数是通过先前调用pam_start()获得的身份验证句柄。
此处传给pamh的实参为main函数中定义的pam_handle_t *pamh的地址&pamh。
- int flags
有效标志,其中任何一个可以与PAM_SILENT进行逻辑“或”运算,它们是:
PAM_ESTABLISH_CRED
初始化用户的凭据。
PAM_DELETE_CRED
删除用户的凭据。
PAM_REINITIALIZE_CRED
完全重新初始化用户凭据。
PAM_REFRESH_CRED
延长现有凭据的生命期(使用期限)。
此处传给flags的实参为PAM_ESTABLISH_CRED。
至此,代码流程中的所有函数就全部解析完了。
相关文章:
PAM从入门到精通(十九)
接前一篇文章:PAM从入门到精通(十八) 本文参考: 《The Linux-PAM Application Developers Guide》 PAM 的应用开发和内部实现源码分析 先再来重温一下PAM系统架构: 更加形象的形式: 六、整体流程示例 2.…...
apache httpd 多后缀解析漏洞
形成原因 Apache HTTPD 支持一个文件拥有多个后缀,并为不同后缀执行不同的指令 在有多个后缀的情况下,只要一个文件含有.php后缀的文件即将被识别成PHP文件,没必要是最后一个后缀。利用这个特性,将会造成一个可以绕过上传白名单…...
Flutter ☞ 数据类型
数值类型 int、double、num int 整型,取值通常在 -253 ~ 253 之间 int class double 64-bt(双精度)浮点数,符合 IEEE 754 标准。 double class num 数值类型的基类,int 和 double 都继承自num。 num class 数值转换 // String -> …...
MyBatis-Plus 实战教程一
这里写目录标题 简介快速上手数据库建立创建实体类修改参数引入依赖测试常见注解介绍TableNameTableIdTableField 常见配置仓库地址 简介 MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,…...
闭包(函数)
把内部函数通过return扔出去 必要条件...
Go包介绍与初始化:搞清Go程序的执行次序
Go包介绍与初始化:搞清Go程序的执行次序 文章目录 Go包介绍与初始化:搞清Go程序的执行次序一、main.main 函数:Go 应用的入口函数1.1 main.main 函数1.2 main.main 函数特点 二、包介绍2.1 包介绍与声明2.2 非 main包的 main 函数2.3 包的命名…...
Python教程(15)——Python流程控制语句详解
目录 if语句else if语句for循环遍历类型range关键字 while循环break语句continue语句 Python流程控制是Python编程中非常重要的一部分,它用于控制程序的执行流程。Python提供了多种流程控制语句,包括if语句、while循环、for循环、break和continue语句等。…...
JavaScript基础知识16——分支语句
哈喽,大家好,我是雷工。 今天学习JavaScript基础知识的分支语句,以下为学习笔记。 1、程序三大流程控制语句 ○写几句就从上往下执行几句,这种叫做顺序结构; ○有时要根据条件选择执行代码,这种叫分支结构…...
web开发初级工程师学习笔记
web开发初级工程师学习笔记 前端开发工具实验1 VS Code 初体验介绍 前端开发工具 实验1 VS Code 初体验 介绍 VS Code 环境提供的是一个可以在浏览器中使用原生 VS Code 编辑代码的程序。在该环境中,你可以使用到与本地安装近乎一致的 VS Code 程序来编辑代码文件…...
Linux下Samba服务安装及启用全攻略
Linux下Samba服务安装及启用全攻略 前言一、安装SSH Server二、安装Samba Server1.安装net-tool2.建立账号的samba3.windows通过Samba与linux共享文件4.使用远程工具登录Linux 总结 前言 提示:本文详解了在Linux系统下如何安装和启用Samba服务,涵盖了从…...
【C++】引用’‘的深入解析
💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …...
java链式编程对象序列化问题
在使用 openfeign 进行服务之间数据传输时发现了一个问题,数据在下游正常处理,响应到调用端数据也读取到了,但是就是 jackson 转对象序列化时出了问题,异常如下 Failed to complete request: feign.codec.DecodeException: Type d…...
关于Redis(Redisson)超时问题的分析
概述 生产环境中流量高峰期会出现短时间的redis异常,主要报错如下: Redis server response timeoutRedisTimeoutException: Command execution timeout for command: (PING)Command still hasn’t been written into connection! 根据redisson官方所述…...
Redis 主从复制,哨兵,集群——(2)哨兵篇
目录 1. Redis 哨兵是什么? 2. Redis 哨兵有什么用? 2.1 主动监控 2.2 消息通知 2.3 故障转移 2.4 配置中心 3. Redis 哨兵数量配备要求 4. 哨兵配置文件详解 5. quorum 投票数详解 5.1 quorum 的含义 5.2 网络抖动导致主观下线 5.3 quorum …...
C++入门笔记分享
有道云笔记...
使用conda install一直卡在solving environment的解决方法
使用国内镜像源,但install仍旧一直卡在solving environment,超过10分钟就不用等了; 检查C:\Users\UserName 路径下的.condarc文件 将这个defaults这一行删掉即可...
神经网络和AI的关系
神经网络(Neural Networks)和人工智能(Artificial Intelligence,AI)之间存在紧密的关系,可以概括为以下几点: 神经网络是AI的子领域:神经网络是人工智能的一个子领域,它是…...
[牛客]计算机网络习题笔记_1020
1、物理层:以太网 调制解调器 电力线通信(PLC) SONET/SDH G.709 光导纤维 同轴电缆 双绞线等。 2、数据链路层(网络接口层包括物理层和数据链路层):Wi-Fi(IEEE 802.11) WiMAX(IEEE 802.16) ATM DTM 令牌环 以太网 FDD…...
蓝牙音视频远程控制协议(AVRCP)介绍
零.声明 本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下: 第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些概念,产生背景,发展轨迹,市面蓝牙介绍,以及蓝牙开发板介绍。 第二篇:Trans…...
家庭WIFI路由器、无线网卡购买指南
一、参考资料 【Wi-Fi】802.11/802.11b/802.11g/802.11n/802.11a/802.11ac/802.11ax/802.11be 从带宽到路由,从有线到无线,从需求到选购,从布网到实测,全部说尽。基础篇(1) 【一文详解】802.11a/b/g/n/ac/…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释
以Module Federation 插件详为例,Webpack.config.js它可能的配置和含义如下: 前言 Module Federation 的Webpack.config.js核心配置包括: name filename(定义应用标识) remotes(引用远程模块࿰…...
拟合问题处理
在机器学习中,核心任务通常围绕模型训练和性能提升展开,但你提到的 “优化训练数据解决过拟合” 和 “提升泛化性能解决欠拟合” 需要结合更准确的概念进行梳理。以下是对机器学习核心任务的系统复习和修正: 一、机器学习的核心任务框架 机…...
高抗扰度汽车光耦合器的特性
晶台光电推出的125℃光耦合器系列产品(包括KL357NU、KL3H7U和KL817U),专为高温环境下的汽车应用设计,具备以下核心优势和技术特点: 一、技术特性分析 高温稳定性 采用先进的LED技术和优化的IC设计,确保在…...
