vsftpd源码学习(一)

文件介绍

文件名 作用
access.c 定义了检查有无权限访问指定文件的函数
ascii.c 定义了二进制数据转ascii数据的函数
banner.c 定义了提示信息相关函数
main.c 定义了主函数
oneprocess.c 定义了单进程方式相关的函数
twoprocess.c 定义了多进程方式相关的函数

makefile

vsftpd的makefile算比较简单,有三个目标,

1、vsftpd即最终产物

指定产生的可执行文件为vsftpd

2、install安装vsftpd、帮助手册

3、clean删除

main

通过创建一个会话来实现ftp服务器的功能,配置从/etc/vsftpd.conf中读取

配置文件相关

配置一共有三种类型布尔、数字、字符串。实际使用int,unsinged int和字符常量来存储。
parseconf.c(解析配置文件),tunables.c(实现默认配置下发)
配置文件的路径有三种方式可以指定,
1、启动vsftpd时的命令行参数
2、默认/etc/vsftpdf.conf
3、环境变量VSFTPD_LOAD_CONF(如果设置了环境变量,则以环境变量的配置为准,其他方式无效)

会话初始化

session_init函数,初始化p_remote_addr,p_local_addr,根据配置初始化anon_ftp_uid,guest_user_uid,anon_upload_chown_uid

几个进程来处理功能

主要函数vsf_one_process_start和vsf_two_process_start

本地用户登入的认证方式

代码中通过VSF_SYSDEP_HAVE_PAM宏来区别,vsf_sysdep_check_auth函数有两个实现,一个调用pam库接口,一个调用getspnam接口

pam认证

直接读取shadow文件认证

遇到的坑

1、想用本地用户登入,修改配置文件,开启local_enable=YES后,还是使用匿名用户的方式登入
原因:只是注释了anonymous_enable,没有设置为NO
2、出现找不到路径的提示:vsftpd: not found: directory given in 'secure_chroot_dir':/usr/share/empty
原因:linux上不存在empty文件夹,到/usr/share目录下创建empty文件夹即可
3、gdb调试时没有符号信息
原因:链接时使用-Wl -s指定了压缩符号。-Wl表示传递选项给链接器,-s表示去除符号信息,但-Wl -s并不是标准的strip操作,它实际上是在链接阶段将符号表设置为局部(local)而不是全局(global)。
注释这一行后编译出的vsftpd带有符号,可以使用gdb调试。

posted @ 2024-08-03 08:03  菠萝超级酸  阅读(72)  评论(0编辑  收藏  举报