【Linux应用】嵌入式设备植入vsftp服务

前言

vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行在诸如 Linux, BSD, Solaris, HP-UX 以及 IRIX 上面。它支持很多其他的 FTP 服务器不支持的特征。近期需要在嵌入式设备上支持该应用,研究其基本的流程,简单记录操作步骤,与大家分享探讨,关于更多的说明可参阅官网:https://pkgs.org/download/vsftpd

1.下载源码

将下载的代码复制到我们的编译服务器中,准备开始。

   tar xzvf vsftpd-3.0.2.tar.gz
   chmod 777 vsftpd-3.0.2

说明:版本很多,如果对安全方面没有过多考虑,可以下载2.x版本。这里我们选择了3.0.2版本,作为演示。

2.修改编译环境

打开对应的Makefile,修改对应的编译器和库文件。编译器找不到的话,可以写绝对路径或者设置环境变量。库文件的话,主要是为加密做准备,有的环境不添加也是没问题的。
在这里插入图片描述
修改vsf_findlibs.sh,在vsf_findlibs.sh中,屏蔽51至59行。也就是屏蔽掉和和调用libcap库相关的项,因为arm-hisiv100nptl-linux编译环境里没有这个库(…\hisi-linux-nptl\arm-hisiv100-linux\target\lib下没有libcap),去掉这个库生成的vsftpd也可以使用。
在这里插入图片描述

3.make编译

make完成后,查看\vsftpd-3.0.2目录下生成的可执行文件vsftpd其属性,可以确认交叉编译成功。查看生成的执行文件vsftpd用到的交叉编译环境里的动态库,用命令查看。

arm-hisiv100nptl-linux-readelf -d vsftpd

把动态链接库从编译器的lib下拷贝到设备的lib目录下。有些设备的文件系统中已经包含了这些库,这种情况可以不拷贝。是否拷贝,执行vsftpd时,会提示你。

4.修改配置文件

把生成的vsftpd拷贝到设备的sbin目录下,把vsftpd.conf文件拷贝到设备的/etc目录下。

以下为一个简单的配置。vsftpd.conf文件。
anonymous_enable=NO
#是否允许匿名访问
local_enable=YES
#允许本地用户访问(/etc/passwd中的用户)
write_enable=YES
#允许写入权限,包括修改,删除
local_umask=777
#本地用户文件上传后的权限
local_root=/mnt
#设定所有本地用户登陆后的目录。
#如不设此项,则本地用户登陆后位于各自家目录下(如/home/yaho)。
anon_umask=777
#匿名用户上传后权限
anon_upload_enable=YES
#允许匿名用户上传
anon_mkdir_write_enable=YES
#允许匿名用户建立目录
anon_other_write_enable=YES
#允许匿名用户具有建立目录,上传之外的权限,如重命名,删除
anon_world_readable_only=YES
#允许匿名用户浏览,下载文件
no_anon_password=NO
#匿名用户登录是不需要密码,YES不需要密码;NO需要密码
anon_root=/mnt
#设定匿名用户登陆后所在的目录
dirmessage_enable=YES
#当使用者转换目录,则会显示该目录下的.message信息
connect_from_port_20=YES
#确保ftp-datad 数据传送使用port 20
pam_service_name=vsftpd
#PAM所使用的名称.同userlist_*一样限制用户登陆,
#不同的是userlist_*在进行密码验证之前拒绝用户登陆,
#pam是在密码验证之后拒绝登陆.(提示密码错误) 
#用户列表默认存放在/etc/ftpusers中,一行一个. 
#(可通过/etc/pam.d/vsftpd重定向用户列表存放文件)
ftp_username=ftp
#定义匿名登入的使用者名称。默认值为ftp。
tcp_wrappers=NO
#支持tcp_wrappers,限制访问(/etc/hosts.allow,/etc/hosts.deny)#NO是可以访问
listen_port=21
#ftp监听端口,注意是21

配置文件是vsftpd的基本部分,很多说明不是很清楚,可以通过grep查看相关源码。这是移植该开源文件最主要的工作,至少要耗费60%的时间,大家有时间可以通过源码去查看相关的实现。

5. 创建用户

在设备上创建必要的账号、目录。使用telnet或者串口连接设备。执行下列命令:

adduser nobody   //vsftpd 默认配置需要,nobody指的是匿名用户或所有用户
mkdir /usr/share/empty  //vsftpd 默认配置需要
adduser –d /home/ftp ftp
chown root:root /home/ftp //注意不是/var/ftp
chmod 755 /home/ftp

在创建nobody时,会提示输入密码。此外,如果你的设备不支持adduser的话,用useradd也是可以实现相关操作,如:useradd -h /home/ftp ftp增加ftp的账号。由于安全考虑,/home/ftp的权限需要设置为755,不可以设置为777。

小贴士:

nobody指的是匿名用户或所有用户,linux下有三层用户权限:所有用户、本地用户、root。不能修改root对文件操作的权限。root不用创建,但可以设置密码(passwd root)。所有用户(addusr nobody)和本地用户(addusr admin)需要创建,可以设置密码。登录ftp的话,要创建本地用户登录,必须先创建nobody登录。

6.运行vsftpd

设备telnet端执行vsftpd /etc/vsftpd.conf &,登录ftp,输入帐号名yaho和密码即登入。注意当执行vsftpd /etc/vsftpd.conf &后,如果不正确会提示错误。用cat /etc/passwd cat /etc/group 命令查看yaho和ftp是否是同一组。这里一般的错误都是可以百度到,大部分的原因是因为配置引起的。

7.错误分析

在实际的移植过程中,我在linux2.6的设备上,可以成功运行,匿名和账号登录都是OK的。后来移植到64位的编译器中,并放到高内核(linux4.19)设备中,出现了一些问题,包括一些库文件。通过wireshark抓包分析错误,一般的错误都可以百度到。后来遇见ftp一直无法抓取现有系统的账号,发现该getpwnam()函数一直不成功,后来把该函数重写了一遍就ok了。

#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<pwd.h>

struct passwd *getpwname(const char *name)
{
    struct passwd *user;
	FILE *stream = fopen("/etc/passwd", "r");
	
	while((user = fgetpwent(stream)) != NULL)
	{
	    if(strcmp(name, user->pw_name) == 0)
		    break;
	}
    return user;
}

加入讨论

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值