BoyChai's Blog - 开源 https://blog.boychai.xyz/index.php/tag/%E5%BC%80%E6%BA%90/ [Lua]快速入门 https://blog.boychai.xyz/index.php/archives/69/ 2024-04-17T08:01:00+00:00 Lua概念Lua是一种轻量、小巧的脚本语言,用标准的C语言编写并以源代码形式开发。设计目的是为了嵌入其他的程序中,从而为应用程序提供灵活的扩展和定制功能。特性和他语言相比,Lua有其自身的特点:(1)轻量级lua用标准C语言编写并以源代码形式开发,编译后仅仅一百余千字节,可以很方便的嵌入道其他程序中。(2)可扩展lua提供非常丰富易于使用的扩展接口和机制,由宿主语言(通常是C或C++)提供功能,lua可以使用它们,就像内置的功能一样。(3)支持面向过程编程和函数式编程应用场景游戏开发、独立应用脚本、web应用脚本、扩展和数据库插件、系统安全上。安装官网: https://www.lua.org/[root@work env]# wget https://www.lua.org/ftp/lua-5.4.6.tar.gz [root@work env]# tar xvf lua-5.4.6.tar.gz [root@work lua-5.4.6]# make linux test [root@work lua-5.4.6]# make install cd src && mkdir -p /usr/local/bin /usr/local/include /usr/local/lib /usr/local/man/man1 /usr/local/share/lua/5.4 /usr/local/lib/lua/5.4 cd src && install -p -m 0755 lua luac /usr/local/bin cd src && install -p -m 0644 lua.h luaconf.h lualib.h lauxlib.h lua.hpp /usr/local/include cd src && install -p -m 0644 liblua.a /usr/local/lib cd doc && install -p -m 0644 lua.1 luac.1 /usr/local/man/man1 [root@work lua-5.4.6]# lua -v Lua 5.4.6 Copyright (C) 1994-2023 Lua.org, PUC-Rio语法他的语法和C/C++语法非常相似,整体上比较清晰,简洁。条件语句、循环语句、函数调用都与C/C++基本一致。交互式HelloWorld[root@work env]# lua Lua 5.4.6 Copyright (C) 1994-2023 Lua.org, PUC-Rio > print('hello world!!') hello world!! > 脚本式HelloWorld第一种方式[root@work ~]# mkdir lua_demo [root@work ~]# cd lua_demo/ [root@work lua_demo]# vim hello.lua [root@work lua_demo]# cat hello.lua print('hello world!!!') [root@work lua_demo]# lua hello.lua hello world!!!第二种方式[root@work lua_demo]# vim hello.lua [root@work lua_demo]# cat hello.lua #! /usr/local/bin/lua print('hello world!!!') [root@work lua_demo]# chmod +x hello.lua [root@work lua_demo]# ./hello.lua hello world!!!注释%% 单行注释 %% -- print("111") %% 多行注释 %% --[[ print("222") --]] %% 取消多行注释 %% ---[[ print("222") --]]测试[root@work lua_demo]# vim demo2.lua [root@work lua_demo]# cat demo2.lua -- print("111") --[[ print("222") --]] ---[[ print("333") --]] [root@work lua_demo]# lua demo2.lua 333标识符标识符就是变量名,Lua定义变量名以 一个字母A到Z或a到z或下划线_开头后加上0个或者多个字母,下划线,数字(0-9)。这块建议最好不要使用下划线加大写字母的标识符,因为Lua的保留字也是这样定义的,容易发生冲突。注意Lua是区分大小写字母的。关键字下面Lua的关键词,大家在定义常量、变量或其他用户定义标识符都要避免使用一下关键字andbreakdoelseelseifendfalseforfunctionifinlocalnilnotorrepeatreturnthentrueuntilwhilegoto 一般约定,一以下划线开头连接一串大写字母的名字(比如_VERSION)被保留用于Lua内部全局变量。这个也是上面我们不建议这么定义标识符的原因运算符Lua中支持的运算符有算数运算符、关系运算符、逻辑运算符、其他运算符。算数运算符+ 加 - 减 * 乘 / 除 % 取余 ^ 乘幂 - 负号关系运算符== 等于 ~= 不等于 > 大于 < 小于 >= 大于等于 <= 小于等于逻辑运算符and 与 同时true返回true or 或 一个true返回true not 非 取反其他运算符.. 连接两个字符串 # 一元预算法,返回字符串或表的长度例如[root@work lua_demo]# lua Lua 5.4.6 Copyright (C) 1994-2023 Lua.org, PUC-Rio > > print('HELLO '..'WORLD') HELLO WORLD > print(#'hello') 5全局变量&局部变量在Lua语言中,全局变量无须声明即可使用。在默认情况下,变量总是认为是全局的,如果未提前赋值,默认为nil。如果想要声明一个局部变量需要使用local来声明。[root@work lua_demo]# lua Lua 5.4.6 Copyright (C) 1994-2023 Lua.org, PUC-Rio > b=10 > print(b) 10 > local a = 100 > print(a) nil > local a = 100; print(a) 100 > 数据类型全部的类型Lua有8个数据类型nil(空,无效值) boolean(布尔,true/false) number(数值) string(字符串) function(函数) table(表) thread(线程) userdata(数据用户)可以使用type函数测试给定变量或者类型:[root@work lua_demo]# lua Lua 5.4.6 Copyright (C) 1994-2023 Lua.org, PUC-Rio > print(type(nil)) nil > print(type("aaa")) string > nilnil是一种只有一个nil值的类型,他的作用可以用来与其他所有值进行区分,也可以当想要移除一个变量时,只需要将该变量名赋值为nil,垃圾回收就会释放该变量所占用的内存。booleanboolean类型具有两个值,true和false。在Lua中,只会将false和nil视为假,其他都是真,特别是在条件检测中0和空字符串都会认为是真,这个和我们熟悉的大多语言不太一样。number在lua5.3开始,lua语言为数值格式提供了两种选择:integer(整型)和float(双精度浮点型)[和其他语言不太一样,floatu代表单精度类型],u不管是整形还是双精度浮点型,使用type()函数来取其类型,返回的都是number。还有就是他们之间是可以直接相互转换的。stringLua语言中的字符串可以标识单个字符,也可以标识一整本书籍。在Lua语言中,操作100k或者1M个字母组成的字符串的程序很常见。如果字符串数据很多可以这样写a = [[ <html> xxx xxxx xxx </html> ]]tabletable是lua语言中最主要和强大的数据结构。使用表,Lua语言可以以一种简单、统一且高效的方式标识数组、合集、记录和其他很多数据结构。Lua语言中的表本质上是一种辅助数组。这种数组比Java中的数组更加灵活,可以使用数值做索引,也可以使用字符串或其他任意类型的值做索引(nil除外)[root@work lua_demo]# lua Lua 5.4.6 Copyright (C) 1994-2023 Lua.org, PUC-Rio > a = {} > arr = {"TOM","JERRY","ROSE"} > print(arr[0]) nil > print(arr[1]) TOM > print(arr[2]) JERRY > print(arr[3]) ROSE > arr={} > arr["X"]=10 > arr["Y"]=20 > arr["Z"]=30 > print(arr["X"]) 10 > print(arr["Y"]) 20 > print(arr["Z"]) 30 > arr.X 10 > arr.Y 20 > arr.Y 20 > arr={"TOM",X=10,"JERRY",Y=20,"ROSE",Z=30} > arr[1] TOM > arr[2] JERRY > arr[3] ROSE > arr[4] nil > arr.X 10 > arr["X"] 10 > arr.Z 30 > function在Lua语言中,函数(Function)是对语句和表达式进行抽象的主要方式定义函数:function functionName(params) code end函数被调用的时候,传入的参数个数与定义函数时使用的参数个数不一致的时候,Lua会通过抛弃多余参数和将不足的参数设为nil的方式来调整数的个数。[root@work lua_demo]# lua Lua 5.4.6 Copyright (C) 1994-2023 Lua.org, PUC-Rio > function f(a,b) >> print(a,b) >> end > f() nil nil > f(2) 2 nil > f(2,6) 2 6 > f(2,6,8) 2 6可变参数[root@work lua_demo]# lua Lua 5.4.6 Copyright (C) 1994-2023 Lua.org, PUC-Rio > function add(...) >> local a,b,c=... >> print(a,b,c) >> end > add(1,2,3) 1 2 3 > add(1) 1 nil nil > add(1,2,3,4,5,6) 1 2 3 > 返回值[root@work lua_demo]# lua Lua 5.4.6 Copyright (C) 1994-2023 Lua.org, PUC-Rio > function add(a,b) >> return b,a >> end > x,y=add(100,200) > print(y) 100 > print(x) 200 > 控制结构Lua语言提供了一组精简且常用的控制结构,包括用于条件执行的if以及用户循环的while、repeat和for。所有的控制语法上都有一个显示的终结符:end用于中介if、for以及while结构,until用于中介repeat结构。if语句if语句先测试其条件,并根据条件是否满足执行响应的then部分或else部分。else部分是可选的。[root@work lua_demo]# lua Lua 5.4.6 Copyright (C) 1994-2023 Lua.org, PUC-Rio > function testif(a) >> if a>0 then >> print("a是正数") >> end >> end > testif(2) a是正数 > testif(1) a是正数 > testif(-1) > function testif(a) >> if a>0 then >> print("a是正数") >> else >> print("a是负数") >> end >> end > testif(1) a是正数 > testif(-1) a是负数 > 嵌套IF相关案例如下[root@work lua_demo]# lua Lua 5.4.6 Copyright (C) 1994-2023 Lua.org, PUC-Rio > function show(age) >> if age <= 18 then >> return "qingshaonian" >> elseif age>18 and age <=45 then >> return "qingnian" >> elseif age>45 and age <=60 then >> return "zhongnianren" >> else >> return "laonianren" >> end >> end > print(show(17)) qingshaonian > print(show(19)) qingnian > print(show(56)) zhongnianren > print(show(80)) laonianrenwhile循环语法如下while 条件 do 循环体 end案例[root@work lua_demo]# lua Lua 5.4.6 Copyright (C) 1994-2023 Lua.org, PUC-Rio > function testwhile() >> local i=1 >> while i<=10 do >> print(i) >> i=i+1 >> end >> end > testwhile() 1 2 3 4 5 6 7 8 9 10repeat循环repeat-until语句回重复执行其循环体直到条件为真时结束。由于条件测试在循环体之后执行,所以至少会循环执行一次。语法如下repeat 循环体 until 条件案例如下[root@work lua_demo]# lua Lua 5.4.6 Copyright (C) 1994-2023 Lua.org, PUC-Rio > function testRepeat() >> local i = 10 >> repeat >> print(i) >> i=i-1 >> until i < 1 >> end > testRepeat() 10 9 8 7 6 5 4 3 2 1for循环数值型语法如下for param=exp1,exp2,exp3 do 循环体 endparam的值从exp1变化到exp2之前的每次循环会执行循环体,并在每次循环结束的时候步长,和python的for差不多。案例如下[root@work lua_demo]# lua Lua 5.4.6 Copyright (C) 1994-2023 Lua.org, PUC-Rio > for i = 1,100,10 do >> print(i) >> end 1 11 21 31 41 51 61 71 81 91泛型泛型for循环是通过一个迭代器函数来遍历所有的值,类似于java中的foreach语句语法for i,v in ipairs(x) do 循环体 endi是数组索引,v是对应索引的数组元素值,ipairs是Lua提供的一个迭代器函数,用来迭代数组,x是要遍历的数组。只后pairs也是Lua提供的夜歌迭代函数,他和ipairs的区别是pairs可以迭代一些指定键的table。案例如下[root@work lua_demo]# lua Lua 5.4.6 Copyright (C) 1994-2023 Lua.org, PUC-Rio > arr = {"TOME","JERRY","ROWS","LUCY"} > for i,v in ipairs(arr) do >> print(i,v) >> end 1 TOME 2 JERRY 3 ROWS 4 LUCY [root@work lua_demo]# lua Lua 5.4.6 Copyright (C) 1994-2023 Lua.org, PUC-Rio > arr = {"TOM","JERRY","ROSES",x="JACK","LUCY"} > function testfor(arr) >> for i,v in pairs(arr) do >> print(i,v) >> end >> end > testfor(arr) 1 TOM 2 JERRY 3 ROSES 4 LUCY x JACK HELM-Kubernetes包管理工具(介绍与安装) https://blog.boychai.xyz/index.php/archives/56/ 2023-05-13T01:27:00+00:00 传统部署方式传统服务部署到K8s集群的流程:拉取代码-----》打包编译-----》构建镜像-----》准备相关的yaml文件-----》kubectl apply进行部署传统方式部署引发的问题:随着引用的增多,需要维护大量的yaml文件不能根据一套yaml文件来创建多个环境,需要手动进行修改。PS: 一般环境都分为dev、预生产、生产环境,部署完了dev这套环境,后面再部署预生产和生产环境,还需要复制出两套,并手动修改才行。什么是HELMHelm是K8s的包管理工具,可以方便地发现、共享和构建K8s应用Helm是k8s的包管理器,相当于centos系统中的yum工具,可以将一个服务相关的所有资源信息整合到一个chart中,并且可以使用一套资源发布到多个环境中,可以将应用程序的所有资源和部署信息组合到单个部署包中。就像Linux下的rpm包管理器,如yum/apt等,可以很方便的将之前打包好的yaml文件部署到k8s上。HELM的组件Chart:就是helm的一个整合后的chart包,包含一个应用所有的K8s声明模板,类似于yum的rpm包或者apt的dpkg文件。helm将打包的应用程序部署到k8s并将它们构成chart。这些chart将所有预配置的应用程序资源以及所有版本都包含再一个已于管理的包中。HELM客户端:helm的客户端组件,负责和K8s apiserver通信Repository:用于发布和存储chart包的仓库,类似yum仓库和docker仓库。Release:用chart包部署的一个实例。通过chart在K8s中部署的应用都会产生一个唯一的Release,统一chart部署多次就会产生多个Release。HELM2和HELM3helm3移除了Tiller组件 helm2中helm客户端和K8s通信时通过Tiller组件和K8s通信,helm3移除了Tiller组件,直接使用kubeconfig文件和K8s apiserver通信。删除release命令变更 helm delete release-name --purge --------》 helm uninstall release-name查看charts信息命令变更 helm inspect release-name -------》 helm show chart-name拉取charts包命令变更 helm fetch chart-name -------》 helm pull chart-namehelm3中必须指定release名称,如果需要生成一个随机名称,需要加选项--generate-name,helm2中如果不指定release名称,可以自动生成一个随机名称 helm install ./mychart --generate-name安装HELM相关连接:Github:https://github.com/helm/helm/releases官网:https://helm.sh/zh/docs/intro/install/下载好对应的版本上传到服务器进行解压缩[root@Kubernetes helm]# ls helm-v3.11.3-linux-amd64.tar.gz [root@Kubernetes helm]# tar xvf helm-v3.11.3-linux-amd64.tar.gz linux-amd64/ linux-amd64/LICENSE linux-amd64/README.md linux-amd64/helm之后配置一下系统环境,让命令可以在系统中随机调用[root@Kubernetes helm]# ls helm-v3.11.3-linux-amd64.tar.gz linux-amd64 [root@Kubernetes helm]# cd linux-amd64/ [root@Kubernetes linux-amd64]# pwd /opt/helm/linux-amd64 [root@Kubernetes linux-amd64]# vim /etc/profile #追加下面内容 export PATH=$PATH:/opt/helm/linux-amd64 [root@Kubernetes linux-amd64]# source /etc/profile检查一下是否安装成功[root@Kubernetes ~]# helm version version.BuildInfo{Version:"v3.11.3", GitCommit:"323249351482b3bbfc9f5004f65d400aa70f9ae7", GitTreeState:"clean", GoVersion:"go1.20.3"} VSFTPD-FTP服务器 https://blog.boychai.xyz/index.php/archives/24/ 2022-08-05T07:23:00+00:00 VSFTPDvsftpd 是一款UNIX/LINUX上的FTP服务器软件,号称是"可能是类UNIX系统中最安全、最快的FTP服务器",其具有安全、快速、稳定、开源 (基于 GPLv2 协议开源)的特点。官网:https://security.appspot.com/vsftpd.html安装方式yum -y install vsftpd相关文件配置文件:/etc/vsftpd/vsftpd.conf服务脚本:/usr/lib/systemd/system/vsftpd.service,/etc/rc.d/init.d/vsftpd用户认证配置文件:/etc/pam.d/vsftpd两种模式FTP采用双通道协议,命令连接和数据连接,并且还有两种连接模式,如下连接模式命令连接数据连接主动(PORT)客户端随机端口---->服务器tcp21客户端随机端口<----服务器tcp20被动(PORT)客户端随机端口---->服务器tcp21客户端随机端口---->服务器随机端口端口配置配置项值作用listen_port端口号(默认21)命令端口号修改ftp_data_port端口号(默认为20)主动模式端口号修改pasv_min_port端口号(0为随机分配)被动模式端口号最小值pasv_max_port端口号(0为随机分配)被动模式端口号最大值匿名配置配置项值作用anonymous_enableYES/NO(默认NO)是否支持匿名用户no_anon_passwordYES/NO(默认NO)匿名用户略过口令检查anon_world_readable_onlyYES/NO(默认YES)匿名是否只能下载全部权限为读的文件anon_upload_enableYES/NO(默认NO)匿名上传,注意:文件系统权限anon_mkdir_write_enableYES/NO(默认NO)匿名是否可以创建目录anon_umask000-777匿名上传文件的umaskanon_other_write_enableYES(默认NO)匿名用户是否可修改修改和上传文件用户配置配置项值作用guest_enableYES/NO(默认NO)所有系统用户是否都映射guest用户guest_username系统用户名配合guest_enable生效,指定guest用户local_enableYES/NO(默认YES)是否允许linux用户登录write_enableYES/NO(默认YES)允许系统用户上传文件local_umask000-777指定系统用户上传文件的umasklocal_root系统目录guest用户登录所在目录chroot_local_userYES/NO(默认NO)禁锢系统用户只能在自己的家目录活动chroot_list_enableYES/NO禁锢或不禁锢特定的系统用户在家目录中chroot_list_file系统文件目录配合chroot_list_enable,chroot_list_enable=YES则chroot_list_file文件中的用户不被禁锢否则相反日志配置配置项值作用xferlog_enableYES/NO(默认YES)启用记录上传下载日志xferlog_std_formatYES/NO(默认YES)使用wu-ftp日志格式xferlog_file系统文件目录(默认 /var/log/xferlog)指定wu-ftp日志文件,可自动生成dual_log_enableYES/NO(默认NO)使用vsftpd日志格式vsftpd_log_file系统文件目录(默认/var/log/vsftpd.log)指定vsftpd日志文件,可自动生成登录控制配置项值作用userlist_enableYES/NO(默认YES)是否启用控制用户登录的列表文件userlist_denyYES/NO(默认YES)黑名单,不提示口令,NO为白名单userlist_file文件目录(默认 /etc/vsftpd/users_list)用户列表文件网络限制配置项值作用max_clientsNULL最大并发连接数max_per_ipNULL每个IP同时发起的最大连接数anon_max_rateNULL匿名用户的最大传输速率local_max_rateNULL本地用户的最大传输速率connect_timeoutNULL主动模式数据连接超时时长accept_timeoutNULL被动模式数据连接超时时长data_connection_timeoutNULL数据连接无数据输超时时长idle_session_timeoutNULL无命令操作超时时长ascii_upload_enableYES/NO(默认YES)上传时优先以文本方式传输ascii_download_enableYES/NO(默认YES)下载时优先以文本方式传输SSL配置配置项值作用ssl_enableYES/NO(默认NO)是否启用SSLallow_anon_sslYES/NO(默认NO)匿名是否启用SSLforce_local_logins_sslYES/NO(默认NO)本地用户登录是否加密force_local_data_sslYES/NO(默认NO)本地用户数据传输是否加密rsa_cert_file文件位置证书文件位置PS:在配置之前请查看是否支持 SSL,使用命令"ldd\`which vsftpd\`"返回libssl.so即可其他配置配置项值作用use_localtimeYES/NO(默认NO)使用当地时间(默认为NO,使用GMT)ftpd_banner"欢迎信息"登录提示信息banner_file文件目录(默认:/etc/vsftpd/ftpbanner.txt)指定一个文件作为登录提示信息,ftpd_banner优先生效dirmessage_enableYES/NO(默认YES)目录访问提示信息message_file文件名称(默认.message)目录的提示信息文件,默认是目录下的".message"文件pam_service_name文件名称(默认vsftpd)使用pam(Pluggable Authentication Modules)完成用户认证,默认对应"/etc/pam.d/vsftpd"文件nopriv_user系统用户vsftpd服务指定用户身份运行