嵌入式 在arm平台运行ftpd服务器实现文件下载以及上传

时间:2022-04-29 08:48:36

在linux下我使用wget下载我板子上的文件:

板子上实际位置为:/opt/joseph/av_server/av_server

wget ftp://10.10.1.216:21/joseph/av_server/av_server

{

    --2014-09-04 16:11:59-- ftp://10.10.1.216/joseph/av_server/av_server

=> `av_server' 
Connecting to 10.10.1.216:21... connected. 
Logging in as anonymous ... Logged in! 
==> SYST ... done. ==> PWD ... done. 
==> TYPE I ... done. ==> CWD (1) /joseph/av_server ... done. 
==> SIZE av_server ... 2546188 
==> PASV ... done. ==> RETR av_server ... done. 
Length: 2546188 (2.4M) (unauthoritative) 

100%[==================================================================================================================>] 2,546,188 3.37M/s in 0.7s 

2014-09-04 16:12:00 (3.37 MB/s) - `av_server' saved [2546188]

}


解析一下ftp下载url格式:

ftp://admin:123456@qycam.com:50005/hi3518c_tmp/av_server.708.wifi

ftp://用户名:密码@主机地址:端口号/文件位置以及文件名称


1、我的平台是hi3518x,我使用的busybox1.6.1:

首先,我们运行ftpd,出现下面的提示:
BusyBox v1.6.1 (2014-09-04 14:45:17 CST) multi-call binary.


Usage: ftpd [-wvS] [-t N] [-T N] [DIR]


Anonymous FTP server


ftpd should be used as an inetd service.
ftpd's line for inetd.conf:
        21 stream tcp nowait root ftpd ftpd /files/to/serve
It also can be ran from tcpsvd:
        tcpsvd -vE 0.0.0.0 21 ftpd /files/to/serve


        -w      Allow upload
        -v      Log errors to stderr. -vv: verbose log
        -S      Log errors to syslog. -SS: verbose log
        -t,-T   Idle and absolute timeouts
        DIR     Change root to this directory

上面加颜色的两行都是可以运行起ftpd服务器的,但是建议使用第二种 ,第一种,需要一个配置文件,利用inetd进行运行

在busybox1.6.1上我使用flashfxp进行访问的ftpd板子的时候,不能显示文件列表,最后发现是busybox的bug,此bug如下:
嵌入式 在arm平台运行ftpd服务器实现文件下载以及上传

具体原因是把“LIST -al”,把这个命令的al看成一个目录了,那么我们可以进行修改,也可以直接使用busybox最新稳定版本:

busybox官网:
http://www.busybox.net/

我的效果如下图:
[root@njqy]#cat /etc/init.d/rcS 
#! /bin/sh


/bin/mount -a


echo "
            _ _ _ _ _ _ _ _ _ _ _ _
            \  _  _   _  _ _ ___
            / /__/ \ |_/
           / __   /  -  _ ___
          / /  / /  / /
  _ _ _ _/ /  /  \_/  \_ ______
___________\___\__________________
"
for initscript in /etc/init.d/S[0-9][0-9]*
do
        if [ -x $initscript ] ;
        then
                echo "[RCS]: $initscript"
                $initscript
        fi
done
/bin/hostname -F /etc/sysconfig/HOSTNAME
cd /opt/joseph
./start.sh &
cd -


tcpsvd -vE 0.0.0.0 21 ftpd -wvS /opt/ &


flashfxp的效果如下图:

嵌入式 在arm平台运行ftpd服务器实现文件下载以及上传

2、我们借鉴一下:

首先,在开发板建立一个目录用于传输文件的存放:

mkdir /ftpdir

修改inetd.conf并启动inetd服务:
# vi /etc/inetd.conf
21 stream tcp nowait root ftpd ftpd -w /ftpdir
# inetd // inetd会执行/etc/inetd.conf脚本中


此时ftpd服务可以运行了。我们来验证一下:

在ubuntu中使用ftp命令连接开发板:

root@ubuntu:/home/yj423# ftp 192.168.0.200
Connected to 192.168.0.200.
220 Operation successful
Name (192.168.0.200:yj423): root
230 Operation successful
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> 

这时候,通过ps命令可以在开发板中看到如下进程:

917 root 3144 S ftpd -w /ftpdir

可以看到ftpd自动运行起来了。

我们通过PC上传文件试一试:

ftp> put /home/yj423/nfswork/home/bgm/bcs bcs
local: /home/yj423/nfswork/home/bgm/bcs remote: bcs
200 Operation successful
150 Ok to send data

到开发板中检查一下,我们看到了bcs的身影。
[root@BGM /ftpdir]#ls
addcmd bcs fdsafdsfsa mount.sh test