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调试。