sudo apt-get install vsftpd之后,在Ubuntu上执行vsftpd然后在附件/etc/vsftpd.conf文件中进行configuration。 匿名ftp允许cd直接上传,并允许把在服务器上创build的myfile.txt,但然后客户端挂起,永远不会继续。 服务器上的文件保持在0字节。
这是文件夹和权限:
root@support:/home/ftp# ls -ld . drwxr-xr-x 3 root root 4096 Jun 22 00:00 . root@support:/home/ftp# ls -ld pub drwxr-xr-x 3 root root 4096 Jun 21 23:59 pub root@support:/home/ftp# ls -ld pub/upload drwxr-xr-x 2 ftp ftp 4096 Jun 22 00:06 pub/upload root@support:/home/ftp#
这里是vsftpd.conf文件:
root@support:/home/ftp# grep -v '#' /etc/vsftpd.conf listen=YES anonymous_enable=YES write_enable=YES anon_upload_enable=YES dirmessage_enable=YES xferlog_enable=YES anon_root=/home/ftp/pub/ connect_from_port_20=YES chown_uploads=YES chown_username=ftp nopriv_user=ftp secure_chroot_dir=/var/run/vsftpd pam_service_name=vsftpd rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
这是一个试图上传的文件示例:
root@support:/home/ftp/pub/upload# ls -l total 0 -rw------- 1 ftp nogroup 0 Jun 22 00:06 build.out
这是客户端尝试上传…在这一点上被冻结:
$ ftp 173.203.89.78 Connected to 173.203.89.78. 220 (vsFTPd 2.0.6) User (173.203.89.78:(none)): ftp 331 Please specify the password. Password: 230 Login successful. ftp> put build.out 200 PORT command successful. Consider using PASV. 553 Could not create file. ftp> cd upload 250 Directory successfully changed. ftp> put build.out 200 PORT command successful. Consider using PASV. 150 Ok to send data.
编辑:事实certificate,FTP客户端工作从其他系统运行Linux。 上面的错误信息仅在使用命令行ftp的Windows 7主机上使用ftp进行。
实际上,在同一台Windows 7机器上,如果将地址放入Windows资源pipe理器,则可以正常工作。 它可以复制和粘贴文件,并在服务器上显示正确上传。
所以这个问题只发生在Windows 7的命令行ftp上。 注意:我仔细检查了防火墙在这台机器上是完全禁用的。
它看起来像你正在尝试使用主动FTP,但服务器和(或)您的客户端之间的防火墙阻止数据通道。 一个FTP事务由两个通道或连接组成:命令通道(端口21)和数据通道(通常与端口20相关)。 客户端在命令通道上发出命令,而有效载荷(文件内容和像ls这样的命令的输出)在数据通道上。 如果您的防火墙或路由器干扰数据通道,则可以login,所有内容都会显示,直到您尝试从服务器获取信息或从服务器发送信息 – 此时所有内容都将显示为挂起。 服务器试图连接回客户端,但是不能这样做。
在主动模式下(默认除非你发送PASV命令[并且注意vsftpdbuild议你Consider using PASV ]),服务器将尝试打开到客户端的数据通道连接。 这是正确的 – 服务器连接到客户端,并在一个大于1023的端口。防火墙往往反对这一点,如果你在NAT后面,它根本无法工作。
这就是被动FTP进入的地方。对于被动FTP,服务器使用已build立的connamd通道告诉客户端数据通道使用什么端口和IP地址,然后客户端打开第二个连接到服务器的数据通道。 这解决了客户端在防火墙后面的问题。 所有你需要做的是在PUT之前从客户端发出PASV命令。 如果这不起作用,那么你可能需要帮助vsftpd一点点。 您可能需要的configuration项目包括pasv_min_port和pasv_max_port ,它们允许您控制一系列端口vsftpd,告诉客户端连接到,以便您可以在防火墙中打开它们。 另外,如果服务器没有监听客户端连接到的同一个IP地址(也许是在一个NAT内部), pasv_address告诉vsftp客户端实际想要连接到的地址(它不会自动使用命令的地址频道打开)。