> Ubuntu >

在Ubuntu 12.04环境下以源码编译方式安装vsftp 2.3.2

下载vsftp

vsftp的官方网站是http://vsftpd.beasts.org/,现在国内好像访问不了。可以另外通过代理的方式,或者搜索国内的下载地址,例如站长下载。

 

下载vsftp到/usr/local/src目录:

cd /usr/local/src
sudo wget http://zj.down.chinaz.com/201101/vsftpd-2.3.2.tar.gz
sudo tar zxvf vsftpd-2.3.2.tar.gz

 

将下载的文件解压缩,解压缩后的目录为/usr/local/src/vsftpd-2.3.2。

sudo tar zxvf vsftpd-2.3.2.tar.gz
cd  vsftpd-2.3.2

 

配置builddefs.h

vsftp使用builddefs.h处理编译时的配置信息,该文件默认的内容如下:

#ifndef VSF_BUILDDEFS_H
#define VSF_BUILDDEFS_H

#undef VSF_BUILD_TCPWRAPPERS
#define VSF_BUILD_PAM
#undef VSF_BUILD_SSL

#endif /* VSF_BUILDDEFS_H */

 

默认的builddefs.h只开启了pamtcp_wrappersssh是关闭的。我们可以根据自己的需要进行调整这些配置。

 

编译vsftp

vsftp使用vsf_findlibs.sh脚本来查找相关的库文件。但是,由于我的Ubuntu是64位版本,库文件的位置与vsf_findlibs.sh脚本定义的位置不同,需要修改vsf_findlibs.sh脚本。

 

查看自己电脑的硬件架构:

$ uname -m
x86-64

如果输出x86_64,说明是64位平台。

 

vsftp使用了libpam.so库,我们可以使用locate命令快速地定位到Ubuntu当前的库文件存放位置:

$ locate libpam
/lib/x86_64-linux-gnu/libpam.so.0
/lib/x86_64-linux-gnu/libpam.so.0.83.0
/lib/x86_64-linux-gnu/libpam_misc.so.0
/lib/x86_64-linux-gnu/libpam_misc.so.0.82.0
/lib/x86_64-linux-gnu/libpamc.so.0
/lib/x86_64-linux-gnu/libpamc.so.0.82.1
... ...

由此可知,Ubuntu将库文件位置移到了/lib/x86_64-linux-gnu目录。

 

先备份vsf_findlibs.sh,然后用vi编辑器将其打开,简单的用下面的命令将原来的/lib目录替换为新的/lib/x86_64-linux-gnu目录:

:%s?/lib/?/lib/x86_64-linux-gnu/?

 

现在我们可以执行make命令编译vsftp了:

make

 

编译完成后检查是否成功:

$ ls -l vsftpd
-rwxrwxr-x 1 amonest amonest 124088  6月 21 09:31 vsftpd

 

vsftp的先决条件

vsftp默认配置需要"nobody"帐户,用下面的命令确认该帐户是否存在:

$ useradd nobody
useradd: user 'nobody' already exists

 

vsftp默认配置需要空目录"/usr/share/empty",用下面的命令确认该目录是否存在:

sudo mkdir /usr/share/empty

 

对于匿名FTP,vsftp需要一个"ftp"的帐户和一个有效的home目录。

sudo mkdir /var/ftp
sudo useradd -d /var/ftp ftp

 

注意:创建的/var/ftp目录默认所有者为root,不要将所有者修改为ftp,否则后面在客户端用ftp帐户连接时会提示“refusing to run with writable anonymous root”错误。

 

创建"ftp"的帐户后,应该再使用passwd命令修改它的密码:

sudo passwd ftp

 

安装vsftp

执行命令make install安装vsftp

sudo make install

 

安装过程中处理的内容定义在Makefile文件:

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

 

如果安装时提示man目录找不到,可以手工创建这些目录:

sudo mkdir /usr/local/man/man5
sudo mkdir /usr/local/man/man8

 

安装过程没有复制默认配置文件,建议这样处理:

sudo cp vsftpd.conf /etc

 

测试vsftp

vsftp可以运行在独立模式(standalone) ,也可以运行在inetd模式(inetd或xinetd)。以inetd模式运行vsftp,可以有更多的控制权,例如流量和连接数等。我们这里简单的以独立模式运行vsftp测试安装是否成功。

 

编辑/etc/vsftpd.conf,确保listen选项是开启的:

listen=YES

这实际上就是告诉vsftp,当前以独立模式运行。

 

启动vsftp:

sudo /usr/local/sbin/vsftpd &

 

连接vsftp,测试是否正常运行:

$ ftp localhost
Connected to localhost.
220 (vsFTPd 2.3.2)
Name (localhost:amonest): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw-r--r--    1 0        0            1361 Jun 21 03:03 README
-rw-r--r--    1 0        0             112 Jun 21 03:03 README.security
-rw-r--r--    1 0        0            2115 Jun 21 03:03 README.ssl
-rw-r--r--    1 0        0             125 Jun 21 03:03 REWARD
226 Directory send OK.
ftp>

 

最后上一张FlashFXP连接vsftp的图:

(责任编辑:IT)