ARM(AM5728)板移植VSFTPD


简介:在ARM板上搭建VSFTPD一直出现各种奇怪的问题,搜寻许多资料未果,现已解决,特此分享。

说明:以下的分享均是VSFTPD的初级用法以及我所遇到的问题,x86使用源码安装也可使用此方式进行安装。

一、环境

硬件: ARM板(AM5728)
软件:vsftpd3.0.2

二、资源获取

⑴ 官网获取:https://security.appspot.com/downloads/vsftpd-3.0.2.tar.gz
⑵ 自行百度获取

三、交叉编译、移植操作步骤

⑴ 解压
tar -vxf vsftpd-3.0.2.tar.gz

(2) 更改MAKEFILE
① 使用交叉编译

CC = gcc 更改为 CC = arm-linux-gnueabihf-gcc

② 添加支持

LDFLAGS = -fPIE -pie -Wl,-z,relro -Wl,-z,now后添加,-lcap.

以下为我修改后的MAKEFILE

# Makefile for systems with GNU tools
CC      =       arm-linux-gnueabihf-gcc
INSTALL =       install
IFLAGS  = -idirafter dummyinc
#CFLAGS = -g
CFLAGS  =       -O2 -fPIE -fstack-protector --param=ssp-buffer-size=4 \
        -Wall -W -Wshadow -Werror -Wformat-security \
        -D_FORTIFY_SOURCE=2 \
        #-pedantic -Wconversion

LIBS    =       `./vsf_findlibs.sh`
LINK    =       -Wl,-s
LDFLAGS =       -fPIE -pie -Wl,-z,relro -Wl,-z,now,-lcap

OBJS    =       main.o utility.o prelogin.o ftpcmdio.o postlogin.o privsock.o \
                tunables.o ftpdataio.o secbuf.o ls.o \
                postprivparent.o logging.o str.o netstr.o sysstr.o strlist.o \
    banner.o filestr.o parseconf.o secutil.o \
    ascii.o oneprocess.o twoprocess.o privops.o standalone.o hash.o \
    tcpwrap.o ipaddrparse.o access.o features.o readwrite.o opts.o \
    ssl.o sslslave.o ptracesandbox.o ftppolicy.o sysutil.o sysdeputil.o \
    seccompsandbox.o


.c.o:
        $(CC) -c $*.c $(CFLAGS) $(IFLAGS)

vsftpd: $(OBJS) 
        $(CC) -o vsftpd $(OBJS) $(LINK) $(LDFLAGS) $(LIBS)

install:
        if [ -x /usr/local/sbin ]; then \
                $(INSTALL) -m 755 vsftpd /usr/local/sbin/vsftpd; \
        else \
                $(INSTALL) -m 755 vsftpd /usr/sbin/vsftpd; fi
        if [ -x /usr/local/man ]; then \
                $(INSTALL) -m 644 vsftpd.8 /usr/local/man/man8/vsftpd.8; \
                $(INSTALL) -m 644 vsftpd.conf.5 /usr/local/man/man5/vsftpd.conf.5; \
        elif [ -x /usr/share/man ]; then \
                $(INSTALL) -m 644 vsftpd.8 /usr/share/man/man8/vsftpd.8; \
                $(INSTALL) -m 644 vsftpd.conf.5 /usr/share/man/man5/vsftpd.conf.5; \
        else \                                                                                                                                                               
                $(INSTALL) -m 644 vsftpd.8 /usr/man/man8/vsftpd.8; \
                $(INSTALL) -m 644 vsftpd.conf.5 /usr/man/man5/vsftpd.conf.5; fi
        if [ -x /etc/xinetd.d ]; then \
                $(INSTALL) -m 644 xinetd.d/vsftpd /etc/xinetd.d/vsftpd; fi

clean:
        rm -f *.o *.swp vsftpd

(3) 编译
make

(4) 移植到ARM板
① 将vsftpd拷贝到ARM板/usr/sbin/下
② 将vsftpd.conf拷贝到ARM板/etc/下
③ 将xinetd.d拷贝到ARM板/etc/下
④ 将RedHat/vsftpd.pam拷贝到ARM板/etc/pam.d/下
⑤ chmod +x /usr/sbin/vsftpd

(4) 修改vsftpd.conf配置文件及其他
① 修改配置文件

#anonymous_enable=YES
local_enable=YES

② FTP默认配置需要

adduser nobody
mkdir /usr/share/empty

③ 查看pam认证

ldd /usr/sbin/vsftpd
在这里插入图片描述

若有以上带libpam.so.0字样,则

  • 在/etc/vsftpd.conf中添加pam_service_name=vsftpd
  • mv /etc/pam.d/vsftpd.pam /etc/pam.d/vsftpd
  • 注释掉auth required /lib/security/pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed
  • 注释掉auth required /lib/security/pam_shells.so

(5) 运行测试


/usr/sbin/vsftpd &	

使用其他设备连接
ftp 192.168.2.224

四、开机自启动

(1) sysVinit启动方式
直接将/usr/sbin/vsftpd & 添加到/etc/rc.local

(2) service启动方式
以下给出vsftpd.service

[Unit]
Description=vsftpd FTP server
After=network.target

[Service]
Type=simple
ExecStart=/usr/sbin/vsftpd /etc/vsftpd.conf
ExecReload=/bin/kill -HUP $MAINPID
ExecStartPre=-/bin/mkdir -p /var/run/vsftpd/empty

[Install]
WantedBy=multi-user.target

① 将vsftpd.service拷贝到/usr/lib/systemd/system下
② systemctl enable vsftpd.service

具体怎么添加,自行百度。

五、故障解决

(1) 登录FTP,提示500OPS: vsftpd: cannot locate user specified in ‘ftp_username’:ftp
解决办法:请仔细核对“修改vsftpd.conf配置文件及其他”中的修改"配置文件"小节。

(2) 登录FTP,提示500 OOPS: vsftpd: not found: directory given in ‘secure_chroot_dir’:/usr/share/empty错误
解决办法:请仔细核对“修改vsftpd.conf配置文件及其他"中的"FTP默认配置"需要小节。

(3) 登录FTP,提示 530 Login incorrect错误
解决办法:请仔细核对“修改vsftpd.conf配置文件及其他"中的查看"pam认证"小节。

你可能感兴趣的:(linux)