linux-ftpd-0.17制作ftpd嵌入式linux下的ftp服务器

2019-07-12 16:25发布

首先下载下嵌入式linux服务器资源,linux-ftpd-0.17.tar.gz  下面我们将开始制作嵌入式linux下ftp服务器 1、解压资源    tar xvzf linux-ftpd-0.17.tar.gz 2、修改configure文件    vi configure,内容如下:    #!/bin/sh # # This file was generated by confgen version 2. # Do not edit. # PREFIX='/usr' #EXECPREFIX='$PREFIX' INSTALLROOT='' BINMODE='755' #DAEMONMODE='$BINMODE' MANMODE='644' while [ x$1 != x ]; do case $1 in --help) cat <
上面我们能够清晰的看见configure的各个参数及作用,这里我不详细介绍各个参数的作用,这里我们如果想将ftpd服务器移植到嵌入式linux操作系统中,需要关注的主要是三个参数,分别是:prefix,installroot,with-c-compiler,其中prefix为installroot(文件系统根目录)目录下的具体目录,这里为什么需要将其与intallroot变量分开,主要是因为后续安装ftpd服务器时需要传递几个文件,所以需要根文件系统传递几个参数。     prefix:这里的值我们不用修改,一般ftpd被安装到文件系统目录下的/usr/sbin中   intallroot:文件系统的根目录,这里设置为/XXX/rootfs   with-c-compiler:交叉编译器的选择,嵌入式linux肯定是arm-linux-gcc,(在传递交叉编译工具时,如果文件中这样添加WITH-C-COMPILER='arm-linux-gcc',好像会报错,所   以我没直接在文件中传递这个参数,希望有大神能指点下为什么)   这是我们运行./configure --with-c-compiler=arm-linux-gcc尝试配置下,结果出现如下信息:     Directories: /usr/sbin /usr/man
   Checking if C compiler works... no
   Compiler arm-linux-gcc does not exist or cannot compile C; try another.
  分析发现,我们传递的arm-linux-gcc出错,可是我的arm-linux-gcc编译内核都没问题,应该不会少文件,估计时configure文件内有错误,打开configure文件,找到错误信息    比对发现:    $CC __conftest.c -o __conftest || exit 1
          ./__conftest || exit 1   ./__conftest肯定不能再linux下运行啊,所以果断将该文件中的./__conftest全部删除,总共8处。   继续运行./configure --with-c-compiler=arm-linux-gcc,这次输出信息Ok:   Directories: /usr/sbin /usr/man Checking if C compiler works... yes Checking if arm-linux-gcc accepts gcc warnings... yes Checking if arm-linux-gcc accepts -O2... yes Checking for yacc... bison -y Checking for BSD signal semantics... yes Checking for shadow... yes Checking for crypt... -lcrypt Checking for socklen_t... yes Checking for snprintf declaration... ok Checking for snprintf implementation... ok Generating MCONFIG...
3、接下来我们开始编译      make,结果还是报错,    ftpcmd.y:108: error: array type has incomplete element type ftpcmd.y:109: error: array type has incomplete element type ftpcmd.y: In function 'yylex': ftpcmd.y:1055: warning: cast discards qualifiers from pointer target type ftpcmd.y:1081: warning: cast discards qualifiers from pointer target type make[1]: *** [ftpcmd.o] Error 1 make[1]: Leaving directory `/GT2440/linux-ftpd-0.17/ftpd'
查看出错文件,vim ftpd/ftpcmd.y    发现这块应该是tab结构体定义文件,将该文件中822行开始的结构体定义放到代码前面,ok。      1 /*    2  * Copyright (c) 1985, 1988, 1993, 1994    3  *      The Regents of the University of California.  All rights reserved.    4  *    5  * Redistribution and use in source and binary forms, with or without    6  * modification, are permitted provided that the following conditions    7  * are met:    8  * 1. Redistributions of source code must retain the above copyright    9  *    notice, this list of conditions and the following disclaimer.   10  * 2. Redistributions in binary form must reproduce the above copyright   11  *    notice, this list of conditions and the following disclaimer in the   12  *    documentation and/or other materials provided with the distribution.   13  * 3. All advertising materials mentioning features or use of this software   14  *    must display the following acknowledgement:   15  *      This product includes software developed by the University of   16  *      California, Berkeley and its contributors.   17  * 4. Neither the name of the University nor the names of its contributors   18  *    may be used to endorse or promote products derived from this software   19  *    without specific prior written permission.   20  *   21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND   22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE   23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE   24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE   25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL   26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS   27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)   28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT   29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY   30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF   31  * SUCH DAMAGE.   32  *   33  *      @(#)ftpcmd.y    8.3 (Berkeley) 4/6/94   34  *      NetBSD: ftpcmd.y,v 1.7 1996/04/08 19:03:11 jtc Exp   35  *      OpenBSD: ftpcmd.y,v 1.16 1998/05/22 06:46:09 deraadt Exp   36  */   37   38 /*   39  * Grammar for FTP commands.   40  * See RFC 959.   41  */   42   43 %{   44   45 char ftpcmd_rcsid[] =   46   "$Id: ftpcmd.y,v 1.11 1999/10/09 02:32:12 dholland Exp $";   47   48 #include   49 #include   50 #include   51   52 #include   53 #include   54   55 #include   56 #include   57 #include   58 #include   59 #include   60 #include   61 #include   62 #include   63 #include   64 #include   65 #include   66 #include   67   68 #ifndef __linux__   69 #include   70 #else   71 #define TM_YEAR_BASE 1900   72 #endif   73   74 #include "extern.h"   75   76 extern  struct sockaddr_in data_dest;   77 extern  int logged_in;   78 extern  struct passwd *pw;   79 extern  int guest;   80 extern  int logging;   81 extern  int type;   82 extern  int form;   83 extern  int debug;   84 extern  int timeout;   85 extern  int maxtimeout;   86 extern  int pdata;   87 extern  char hostname[], remotehost[];   88 extern  char proctitle[];   89 extern  int usedefault;   90 extern  int transflag;   91 extern  char tmpline[];   92 extern  int portcheck;   93 extern  struct sockaddr_in his_addr;   94   95 off_t   restart_point;   96   97 static  int cmd_type;   98 static  int cmd_form;   99 static  int cmd_bytesz;  100 char    cbuf[512];  101 char    *fromname;  102  103 struct tab;  104 static int       yylex __P((void));  105 static void      sizecmd __P((char *));  106 static void      help __P((struct tab *, char *));  107 %}  108  109 %union {  110         int     i;  111         char   *s;  112 }  113  114 %token  115         A       B       C       E       F       I  116         L       N       P       R       S       T  117  118         SP      CRLF    COMMA  119  120         USER    PASS    ACCT    REIN    QUIT    PORT  121         PASV    TYPE    STRU    MODE    RETR    STOR  122         APPE    MLFL    MAIL    MSND    MSOM    MSAM  123         MRSQ    MRCP    ALLO    REST    RNFR    RNTO  124         ABOR    DELE    CWD     LIST    NLST    SITE  125         STAT    HELP    NOOP    MKD     RMD     PWD  126         CDUP    STOU    SMNT    SYST    SIZE    MDTM  127  128         UMASK   IDLE    CHMOD  129  130         LEXERR  131  132 %token  STRING  133 %token  NUMBER  134  135 %type   check_login octal_number byte_size  136 %type   struct_code mode_code type_code form_code  137 %type   pathstring pathname password username  138 %type   host_port  139  140 %start  cmd_list  141  142 %{  143 extern jmp_buf errcatch;  144  145 #define CMD     0       /* beginning of command */  146 #define ARGS    1       /* expect miscellaneous arguments */  147 #define STR1    2       /* expect SP followed by STRING */  148 #define STR2    3       /* expect STRING */  149 #define OSTR    4       /* optional SP then STRING */  150 #define ZSTR1   5       /* SP then optional STRING */  151 #define ZSTR2   6       /* optional STRING after SP */  152 #define SITECMD 7       /* SITE command */  153 #define NSTR    8       /* Number followed by a string */  154  155 struct tab {  156         const char      *name;  157         short   token;  158         short   state;  159         short   implemented;    /* 1 if command is implemented */  160         const char      *help;  161 };  162  163 struct tab cmdtab[] = {         /* In order defined in RFC 765 */  164         { "USER", USER, STR1, 1,        " username" },  165         { "PASS", PASS, ZSTR1, 1,       " password" },  166         { "ACCT", ACCT, STR1, 0,        "(specify account)" },  167         { "SMNT", SMNT, ARGS, 0,        "(structure mount)" },  168         { "REIN", REIN, ARGS, 0,        "(reinitialize server state)" },  169         { "QUIT", QUIT, ARGS, 1,        "(terminate service)", },  170         { "PORT", PORT, ARGS, 1,        " b0, b1, b2, b3, b4" },  171         { "PASV", PASV, ARGS, 1,        "(set server in passive mode)" },  172         { "TYPE", TYPE, ARGS, 1,        " [ A | E | I | L ]" },  173         { "STRU", STRU, ARGS, 1,        "(specify file structure)" },  174         { "MODE", MODE, ARGS, 1,        "(specify transfer mode)" },  175         { "RETR", RETR, STR1, 1,        " file-name" },  176         { "STOR", STOR, STR1, 1,        " file-name" },  177         { "APPE", APPE, STR1, 1,        " file-name" },  178         { "MLFL", MLFL, OSTR, 0,        "(mail file)" },  179         { "MAIL", MAIL, OSTR, 0,        "(mail to user)" },  180         { "MSND", MSND, OSTR, 0,        "(mail send to terminal)" },  181         { "MSOM", MSOM, OSTR, 0,        "(mail send to terminal or mailbox)" },  182         { "MSAM", MSAM, OSTR, 0,        "(mail send to terminal and mailbox)" },  183         { "MRSQ", MRSQ, OSTR, 0,        "(mail recipient scheme question)" },  184         { "MRCP", MRCP, STR1, 0,        "(mail recipient)" },  185         { "ALLO", ALLO, ARGS, 1,        "allocate storage (vacuously)" },  186         { "REST", REST, ARGS, 1,        " offset (restart command)" },  187         { "RNFR", RNFR, STR1, 1,        " file-name" },  188         { "RNTO", RNTO, STR1, 1,        " file-name" },  189         { "ABOR", ABOR, ARGS, 1,        "(abort operation)" },  190         { "DELE", DELE, STR1, 1,        " file-name" },  191         { "CWD",  CWD,  OSTR, 1,        "[ directory-name ]" },  192         { "XCWD", CWD,  OSTR, 1,        "[ directory-name ]" },  193         { "LIST", LIST, OSTR, 1,        "[ path-name ]" },  194         { "NLST", NLST, OSTR, 1,        "[ path-name ]" },  195         { "SITE", SITE, SITECMD, 1,     "site-cmd [ arguments ]" },  196         { "SYST", SYST, ARGS, 1,        "(get type of operating system)" },  197         { "STAT", STAT, OSTR, 1,        "[ path-name ]" },  198         { "HELP", HELP, OSTR, 1,        "[ ]" },  199         { "NOOP", NOOP, ARGS, 1,        "" },  200         { "MKD",  MKD,  STR1, 1,        " path-name" },  201         { "XMKD", MKD,  STR1, 1,        " path-name" },  202         { "RMD",  RMD,  STR1, 1,        " path-name" },  203         { "XRMD", RMD,  STR1, 1,        " path-name" },  204         { "PWD",  PWD,  ARGS, 1,        "(return current directory)" },  205         { "XPWD", PWD,  ARGS, 1,        "(return current directory)" },  206         { "CDUP", CDUP, ARGS, 1,        "(change to parent directory)" },  207         { "XCUP", CDUP, ARGS, 1,        "(change to parent directory)" },  208         { "STOU", STOU, STR1, 1,        " file-name" },  209         { "SIZE", SIZE, OSTR, 1,        " path-name" },  210         { "MDTM", MDTM, OSTR, 1,        " path-name" },  211         { NULL,   0,    0,    0,        0 }  212 };  213  214 struct tab sitetab[] = {  215         { "UMASK", UMASK, ARGS, 1,      "[ umask ]" },  216         { "IDLE", IDLE, ARGS, 1,        "[ maximum-idle-time ]" },  217         { "CHMOD", CHMOD, NSTR, 1,      " mode file-name" },  218         { "HELP", HELP, OSTR, 1,        "[ ]" },  219         { NULL,   0,    0,    0,        0 }  220 };  221 extern struct tab cmdtab[];  222 extern struct tab sitetab[];  223  224 %}                                                                                                                                              重新编译,没有错误 4、安装ftpd,直接将ftpd拷贝到根文件系统目录下的/usr/sbin中,然后配置启动文件 在etc目录下的init.d/rcS文件中,添加如下内容:   # These are standard services. # ftp stream tcp nowait root /usr/sbin/ftpd /usr/sbin/ftpd #telnet stream tcp nowait root /usr/sbin/telnetd /usr/sbin/telnetd -i ftp stream tcp nowait root /usr/sbin/ftpd /usr/sbin/ftpd #telnet stream tcp nowait root /usr/sbin/telnetd /usr/sbin/telnetd -i   修改/etc/passwd文件,添加如下内容: root::0:0:root:/:/bin/sh ftp::14:50:FTP User:/var/ftp: bin:*:1:1:bin:/bin: daemon:*:2:2:daemon:/sbin: nobody:*:99:99:Nobody:/: plg:$1$wwtsqwnk$sWaEJGcJFTqaCW18sbUK7/:502:502:Linux User,,,:/home/plg:/bin/sh   但是,发现启动ftp服务后,需要挺长时间才能登陆上。因此推荐大家还是使用vsftpd-2.3.4,感觉比ftpd好用。 VSftpd-2.3.4使用:http://blog.csdn.net/alan00000/article/details/7194702