我正在 Netbeans 中开发一个网站,我配置了 FTP 来将文件上传到我的服务器。在服务器(Ubuntu 14.04 LTS)上,我专门为此任务创建了一个名为“ftpuser”的用户。我安装了 vsFTPd 来处理文件上传。它的配置如下:
listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
file_open_mode=0644
local_umask=022
dirmessage_enable
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
allow_writeable_chroot=YES
chroot_local_user=YES
secure_chroot_dir=/var/run/vsftpd/empty
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
ftpuser的起始目录是/var/www:
ftpuser:x:1005:1007:ftp user,,,:/var/www:/bin/bash
每次我尝试上传文件时,Netbeans 都会显示“错误,未发送文件:file.php”,并且使用 wireshark 的数据包检查会返回以下错误:
226 - Transfer done (but failed to open directory)
553 - Could not create file.
即使仅使用 PUT 操作执行 ftp 也会出现错误 553。FTP 用户可以轻松登录并更改目录。
该目录及其所有子目录和文件的权限设置为 755 (777 - local_umask)。
我是不是漏掉了什么?它以前运行得很好,我不记得在 Netbeans 或 vsFTPd 中更改过任何东西。
更新
目录(以及子目录/文件)的所有者设置为:
drwxr-xr-x 6 marijn marijn 4096 Sep 1 14:21 noc
即使将其 chown 为 ftpuser:ftpuser 也没有任何作用。
答案1
幸运的是,我的开发服务器上有一个可用的配置。有时我需要将一些更改直接上传到实时服务器,并且我以某种方式配置了不同的 vsftpd.conf。此外,Netbeans 中的 FTP 配置也不同。
这是我的 vsftpd.conf 现在的样子:(注意没有 chroot)
listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
secure_chroot_dir=/var/run/vsftpd/empty
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
Netbeans 中的起始目录设置为:
/var/www/noc
答案2
这是很容易忽视的事情,但请检查 vsftpd 配置的端口是否在防火墙上打开。
我遇到过类似的问题,我与 ftp 服务器的连接可以顺利进行,但我无法获取文件夹的目录列表。我花了 6 个小时漫无目的地寻找解决方案,但这解决了我的问题。
检查您的配置文件中指定的端口:
vi /etc/vsftpd.conf
您正在寻找以下两行:
pasv_max_port=12100
pasv_min_port=12000
在这种情况下,我将打开端口 12000-12100 进行被动模式传输:
ufw allow 12000:12100 /tcp
高血压
答案3
根据您的详细信息,我认为您的用户没有权限写入您尝试上传到的目录。
所有者/组是 marijn。但只有用户可以写入目录,组和其他用户只能读取和进入目录。
您的用户是 ftpuser。
因此,您要么将 ftpuser 添加到 marijn 组,并将权限授予组 marijn/var/www/noc
和子目录:chmod -R g+w /var/www/noc
或者您必须让 ftpuser 成为您要写入的目录的所有者。