Linux如何通过PAM管理授权?
引言
PAM
指的是Pluggable Authentication Modules
,以可插拔模块的形式来帮助Linux管理系统的授权。
PAM
将系统授权相关的逻辑功能做成共享链接库(/usr/lib64/security/
)的形式,然后其他需要授权操作的程序只需要调用这个共享库即可。
对于管理员来说,正确的设置复杂授权等工作就变成了一个简单的管理配置文件的工作了。
欢迎订阅公众号, 点击 MinYiLife
PAM
指的是Pluggable Authentication Modules
,以可插拔模块的形式来帮助Linux管理系统的授权。
PAM
将系统授权相关的逻辑功能做成共享链接库(/usr/lib64/security/
)的形式,然后其他需要授权操作的程序只需要调用这个共享库即可。
对于管理员来说,正确的设置复杂授权等工作就变成了一个简单的管理配置文件的工作了。
当我们登录Linux系统后,如果长时间不操作,比如忘记关闭终端窗口了,怎么做到用户自动退出登录呢?
这个文件是系统环境变量的配置文件,并且只有root有修改权限;如果能够在这个文件里面做一些设置,那么每个用户登录后都会加载里面的配置。
Git
是广泛使用的版本管理工具,对于子模块或第三方模块可以这样管理:
submodule
: 第三方模块subtree
: 子模块,大项目团队内部互相协作比如有这样一段代码:
#include <iostream>
#include <string>
#include <variant>
#include <cassert>
int main(){
std::variant<std::string, int ,bool, long long int> value{"y"};
if(std::holds_alternative<std::string>(value)){
std::cout << "it's a std::string: " << std::get<std::string>(value) << std::endl;
}else if (value.index() == 0){
std::cout << "it's a string: " << std::get<std::string>(value) << std::endl;
}else if (value.index() == 1){
std::cout << "it's a int: " << std::get<int>(value) << std::endl;
}else if (value.index() == 2){
std::cout << "it's a bool: " << std::get<bool>(value) << std::endl;
}
}
参照《Writing An Interpreter/Compiler In Go》,改用C++实现。
本篇对应的源码位于目录: src/01/
src
|01
| |token
| | |token.hpp
| |CMakeLists.txt
| |test
| | |main.cpp
| | |lexer_test.cpp
| |lexer
| | |lexer.hpp
| |repl
| | |repl.hpp
将源代码转换为词法单元,这个过程叫词法分析
,完成这个过程的叫词法分析器(tokenizer/scanner)
。
参照《Writing An Interpreter/Compiler In Go》,改用C++实现。
实现解释器有很多教程,看了这个基于Go语言的版本后,将采用C++17来重新实现一遍,以体验两种不同编程语言的风格差异。
将采用测试驱动开发(TDD)
形式,先写测试用例,再实现代码。
使用的是来自谷歌的gtest(GoogleTest)
开源测试框架。
多线程程序常用来提高速度和吞吐量,但数据同步与共享等问题让多线程开发变得复杂,有时候过多的控制底层细节往往难以防范错误的发生。
模板是一个很复杂的主题,这里只涉及最基础的部分。
模板(template)是一个类或一个函数,可以用一组类型或值来进行参数化。
模板是一种编译时机制,一个模板加上一组模板实参被称为特例化
,会由编译器根据实参自动生成对应的代码进而编译。
定义了operator()操作的对象就称为Function Object: