一般实现嵌入式的ftp服务,有两种方法:
①程序内部自己搭建ftp服务器,实现文件的操作(上传、下载、删除等),有很多已成功成型的源码;
②使用现成的源码,进行linux-arm移植。第二种方法更方便,本人使用Vsftpd-3.0.2服务器arm-linux移植到嵌入式设备。
本人使用现成的源码两种方法实现了:①stupid-ftpd;②vsftpd。
stupid-ftpd方法能更快实现成功,但设置本地用户登录ftp密码失败,并且没有实现匿名用户和本地用户的删除设备内文件和重命名文件。当删除时,会提示权限问题。
vsftpd主要是配置文件vsftpd.conf、本地用户创建、嵌入式设备内对文件授权问题,导致没有立刻实现。
实现stupid-ftpd的操作步骤:参考 “嵌入式Linux的FTP服务端软件(stupid-ftpd)http://www.linuxidc.com/Linux/2012-03/56781.htm
一.实现vsftpd搭建ftp服务器操作步骤
参考“Vsftpd-3.0.2服务器arm-linux移植—mini2440开发板http://blog.csdn.net/evenness/article/details/17068403”
1.下载源码
从网上下载window版的vsftpd-3.0.2源代码,可以参考:(
嵌入式设备ftp服务的实现(源码及生成文件)-CSDN下载 https://download.csdn.net/download/aaa794708075/10480419)
把压缩包放在虚拟机linux环境下(/opt),然后终端输入命令解压。
“tar xzvf vsftpd-3.0.2.tar.gz”,
由于下载的源码包是ZIP压缩格式,所以解压的时候使用z,至于“xzvf”中xz位置可以随意颠倒。解压完毕后进行授权。
2.修改Makefile文件,修改编译环境
修改Makefile文件,修改编译环境。按实际情况填写,请仔细查看路径,我的是Makefile内修改如下:
CC = arm-hisiv100nptl-linux-gcc
LiIBS=`vsf_findlibs.sh ` -lcrypt //这个修改与否都可以,后面会有相应操作,目测是将脚本里的库生成静态库。
3.修改vsf_findlibs.sh
在vsf_findlibs.sh中,屏蔽51至59行。也就是屏蔽掉和和调用libcap库相关的项,因为arm-hisiv100nptl-linux编译环境里没有这个库(......\hisi-linux-nptl\arm-hisiv100-linux\target\lib下没有libcap),去掉这个库生成的vsftpd也可以使用。
然后make。完成后,查看\vsftpd-3.0.2目录下生成的可执行文件vsftpd其属性,可以确认交叉编译成功。
4.查看动态库
查看生成的执行文件vsftpd用到的交叉编译环境里的动态库,用命令查看。
arm-hisiv100nptl-linux-readelf -d vsftpd
把动态链接库从编译器的lib下拷贝到设备的lib目录下。实际上不需要拷贝,因为在设备/lib下已经有这些库了。
cp–advfr libc.so.0 libcrypt.so.0 libdl.so.0 libnsl.so.0 libresolv.so.0libuClibc-0.9.32.1.so libutil.so.0 /lib
5.生成的文件放到设备中
把生成的vsftpd拷贝到设备的sbin目录下,把vsftpd.conf文件拷贝到设备的/etc目录下。
至此,arm-linux环境下的ftp服务器移植完成,下面开始对服务器进行配置。以下为一个简单的配置。vsftpd.conf文件。
#如不设此项,则本地用户登陆后位于各自家目录下(如/home/yaho)。
#PAM所使用的名称.同userlist_*一样限制用户登陆,
#不同的是userlist_*在进行密码验证之前拒绝用户登陆,
#用户列表默认存放在/etc/ftpusers中,一行一个.
#(可通过/etc/pam.d/vsftpd重定向用户列表存放文件)
#支持tcp_wrappers,限制访问(/etc/hosts.allow,/etc/hosts.deny),
<1>不要添加xferlog相关的项目,这是记录s使用者所有上传下载信息,由于我们没有建立相关的存储位置和文件;
<2>带目录的项,需确保目录存在并书写正确。每项赋的值后面不能有空格,比如不是YES ,是YES。
<3>匿名用户的权限相关项目,anon_other_write_enable是匿名用户可以删除重命名。但最终文件是否能删除可读写,取决于设备内部或程序内在创建这个文件时赋给这个文件的权限。
6.创建用户
在设备上创建必要的账号、目录。使用telnet连接设备。执行下列命令:
addusernobody //vsftpd 默认配置需要,nobody指的是匿名用户或所有用户
mkdir /usr/share/empty //vsftpd 默认配置需要
adduser –D ftp
chown root:root /home/ftp //注意不是/var/ftp
chmod 755 /home/ftp
添加一个只能从ftp登录,而不能从本地的登录的用户yaho。
addusr-G ftp -S yaho //-G -S 如果用-g -s 客户将不能登录:530 Loginincorrect
passwd 123456创建用户yaho这步,虽然执行了,但后面启动vsftpd后,登录ftp没有效果。所以执行与否都可以。
nobody指的是匿名用户或所有用户,linux下有三层用户权限:所有用户、本地用户、root。不能修改root对文件操作的权限。root不用创建,但可以设置密码(passwd root)。所有用户(addusr nobody)和本地用户(addusr admin)需要创建,可以设置密码。登录ftp的话,要创建本地用户登录,必须先创建nobody登录。
7.启动服务器
设备telnet端执行vsftpd/etc/vsftpd.conf &,登录ftp://YOUR_IP_ADDR,输入帐号名yaho和密码即登入。
注意当执行vsftpd/etc/vsftpd.conf &后,如果不正确会提示错误(配置文件没写好等)。
用cat/etc/passwd cat /etc/group 命令查看yaho和ftp是否是同一组。
8.错误-解决
程序运行后可能出会现错误:
<1>500 OOPS: could not bind listening IPv4 socket
解决方法: 复制 vsftpd 源码目录下的 xinetd.d 文件夹到文件系统/etc 目录下,里面有
一个文件 vsftpd,修改其内容:disable = yes。
<2>代理服务器没有设置为完全访问的解决方法,查看本目录下的“代理服务器没有设置为完全访问的解决方法”。
<3>查看本目录下“linux下如何添加一个用户并且让用户获得root权限”,由于设备没有/etc/sudoers文件,所以只能采用文章里的第3种方法,发现修改后,ftp登录不成功。所以在设备上修改本地用户权限不可以,然后去vsftpd中添加本地用户权限项后,有些文件依然不能进行所有操作。但在telnet中(root权限)chmod 777 后,可以用ftp的本地用户执行所有操作,所以是文件本身设置的权限问题,于是修改嵌入式程序中在创建这个文件时赋给这个文件的权限的部分。只找到了创建录像文件夹时赋权限地方,没找到创建录像文件时赋权限的地方。
实现后效果如图:
二.总结
vsftpd.conf配置文件的修改很重要,比较费时。
创建本地用户时也需要注意,防止将root登录掩盖。
用户访问ftp,需要账号和密码或密码,如何设备启动后自动创建账号密码。
可以使用vlc软件在线播放ftp服务器内的视频,但播放地址需要含用户名和密码。例如:ftp://nobody:111@192.168.45.160/20171105/11.mp4 或ftp://user:pass@192.168.1.1/local dir/aaa.rmvb
三.附录
(嵌入式FTP服务器的移植与配置:VSFTPD-2.0.6移植 - CSDN博客 https://blog.csdn.net/lhf19891003/article/details/18731147)
Vsftpd.conf配置:
anonymous_enable=YES
#允许匿名访问
local_enable=YES
#允许本地用户访问(/etc/passwd中的用户)
write_enable=YES
#允许写入权限,包括修改,删除
local_umask=022
#本地用户文件上传后的权限是-rw-r-r
#anon_umask=077
#匿名用户上传后权限是-rw----
anon_world_readable_only=YES
#允许匿名用户浏览,下载文件
anon_upload_enable=YES
#允许匿名用户上传
#anon_mkdir_write_enable=YES
#允许匿名用户建立目录
anon_other_write_enable=YES
#允许匿名用户具有建立目录,上传之外的权限,如重命名,删除
dirmessage_enable=YES
#当使用者转换目录,则会显示该目录下的.message信息
xferlog_enable=YES
#记录s使用者所有上传下载信息
xferlog_file=/var/log/vsftpd.log
#将上传下载信息记录到/var/log/vsftpd.log中
connect_from_port_20=YES
#确保ftp-datad 数据传送使用port 20
idle_session_timeout=600
#如果使用者600秒没有动作,则踢出
chroot_list_enable=YES
#限制使用者不能离开家目录,例如blue登陆后位于/home/blue下,设置该选项后,他不可以转到/home/blue的上层目录,如/bin, /usr,/opt...etc。
chroot_list_file=/etc/vsftpd.chroot_list
#与上条同时使用,设置限制使用者的存放文件为/etc/vsftpd.chroot_list
#建立文本文件/etc/vsftpd.chroot_list,写入要限制的用户,一行一个。
#如果希望限制所有用户,则可以设置chroot_local_user=YES代替上面两行
tcp_wrappers=YES
#支持tcp_wrappers,限制访问(/etc/hosts.allow,/etc/hosts.deny)
listen=YES
#使用standalone启动vsftpd,而不是super daemon(xinetd)控制它 (vsftpd推荐使用standalone方式)
listen_port=21
#ftp监听端口
userlist_enable=YES
userlist_deny=YES
userlist_file=/etc/vsftpd.user_list
#以上三条设定不允许登陆的用户,用户列表存放在/etc/vsftpd.user_list中,一行一个帐号
pam_service_name=vsftpd
#PAM所使用的名称.同userlist_*一样限制用户登陆,不同的是userlist_*在进行密码验证之前拒绝用户登陆,pam是在密码验证之后拒绝登陆.(提示密码错误) 用户列表默认存放在/etc/ftpusers中,一行一个. (可通过/etc/pam.d/vsftpd重定向用户列表存放文件)
#获得/etc/pam.d/vsftpd:
#[root@LFS vsftpd-2.0.1]#cp RedHat/vsftpd.pam /etc/pam.d/vsftpd
max_clients=5
#最大用户在线数量
max_per_ip=2
#每ip最大线程
anon_max_rate=30000
#匿名用户最大传输速度 单位: bytes/秒
local_max_rate=50000
#本地用户最大传输速度 单位:bytes/秒
user_config_dir=/etc/userconf
#个别用户配置目录(用来设定特殊帐号),例如我想让blue这个用户的传输速度是100KB
就可以在/etc/userconf/下创建文本文件blue(与用户名相同),加入local_max_rate=100000即可
anon_root=/var/ftp
#设定匿名用户登陆后所在的目录
local_root=/var/local_user l
#设定所有本地用户登陆后的目录,如不设置此项,则本地用户登陆后位于各自家目录下。
use_localtime=YES
#使用本地时间而不是GMT
nopriv_user=vsftpd
#设定服务执行者为vsftpd,默认使用的是nobody,vsftpd推荐使用一个权限很低的用户.这里用vsftpd代替nobody,创建 vsftpd用户: