43

I've set up vsftpd on Amazon EC2 with the Amazon Linux AMI. I created a user and can now successfully connect via ftp. However, if I try to upload something I get the error message

553 Could not create file.

I assume this has to do with permissions, but I don't know enough about it to be able to fix it. So basically, what do I have to do to be able to upload files?

2
  • Check the selinux Settings. configure boolean allow_ftpd_full_access to ON
    – user125748
    Jul 31, 2015 at 12:40
  • i had this issue because there was not enough space to write the files.
    – Niklas
    Jul 29, 2020 at 10:11

15 Answers 15

53

Could you try this

chown -R ftpusername /var/www/html
10
  • 11
    chmod 757 -R /var/www/html Nov 5, 2015 at 19:49
  • 3
    @HernánEche thanks for the tip, I had been hunting for hours and this finally fixed my issue.
    – Tr0yJ
    May 19, 2016 at 9:46
  • Could you elaborate on the situation, is this on the server or locally? Mar 28, 2017 at 23:22
  • 1
    @HernánEche Hey, It worked for me too, but is it secure. It wasn't working with 755
    – viv
    Mar 31, 2017 at 7:42
  • 1
    @HernánEche you should make this a separate answer. Your suggestion worked for me where nothing else did.
    – Shaul Behr
    Apr 25, 2018 at 11:59
26

There are two likely reasons that this could happen -- you do not have write and execute permissions on the directories leading to the directory you are trying to upload to, or vsftpd is configured not to allow you to upload.

In the former case, use chmod and chown as appropriate to make sure that your user has these permissions on every intermediate directory. The write bit allows the affected user to create, rename, or delete files within the directory, and modify the directory's attributes, whilst the read bit allows the affected user to list the files within the directory. Since intermediate directories in the path also affect this, the permissions must be set appropriately leading up to the ultimate destination that you intend to upload to.

In the latter case, look at your vsftpd.conf. write_enable must be true to allow writing (and it is false by default). There is good documentation on this configuration file at man 5 vsftpd.conf.

2
  • 13
    Neither of these seem to be the issue. I tried chmoding everything to 777 (unsafe) and settings write_enable=YES, but I still get this useless error message.
    – Cerin
    Aug 5, 2013 at 19:54
  • @Cerin were you able to fix it? If yes, can you share the details? Sep 16, 2019 at 9:12
14

The command ftp put /path/to/local_file doesn't work with vsftpd. Try the following:

ftp put /path/to/local_file remote_file_name 

You may choose any name you wish for the remote_file_name, but you must specify one.

3
  • 2
    You might want to consider adding more detail to your answer (for example, some documentation that supports your solution's validity).
    – HalosGhost
    Jun 29, 2014 at 3:11
  • This happens because (and if) /path/to/ doesn't exist (and/or isn't accessible through the FTP session) on the server. This is why ftp put local_file does work without explicit destination. (Hint : check the local: … remote: … line in the FTP client.) May 22, 2016 at 9:26
  • 1
    It worked for me! :)
    – Paulo
    Jan 11, 2018 at 12:51
4

I had the same issue and fixed changing SELinux to allow writing in the folder I configured to be used by vsftp = /var/ftp/pub.

These links can be helpful:

If you don't want to go further with your SELinux do not change it, so you will see as default /etc/selinux/config

SELINUX=enforcing

then just run the commands as root or with sudo:

sudo setsebool -P ftpd_anon_write 1
sudo setsebool -P ftpd_full_access 1

as already described above in other comment.

0
3

The FTP home directory (ftp_home_dir) is most likely turned off in SeLinux. To see status of your ftpd control files, issue: getsebool -a and locate the ftpd section. You may notice ftp_home_dir is turned off. To turn it on, use the following command: setsebool -P ftp_home_dir=1

Verify your input using getsebool -a, then Try the upload again.

Note: Ignore the punctuation marks

0
3

Check your vsftpd.conf for this setting:

guest_enable=YES # set it to NO then restart the vsftpd service.

If it's set to YES, it will also cause the 553 Could not create file.

From: http://www.vsftpd.beasts.org/vsftpd_conf.html

guest_enable If enabled, all non-anonymous logins are classed as "guest" logins. A guest login is remapped to the user specified in the guest_username setting.

Default: NO

1
  • if the user is "virtual" you can also chown the chroot dir (i.e local_root) to allow write from guest_username (by default ftp), e.g: chown ftp /var/ftp/<virtual_user>
    – tutuDajuju
    Mar 18, 2021 at 10:35
3

Try this

chmod 757 -R /var/www/html
1
  • chmod -R 755 /var/www/html , 7 is 111 read/write/execute, 5 is 101 read/execute, the values are user/group/everyone, the final value being everyone, I don't think it should be 7
    – Harley
    Feb 9, 2022 at 6:21
1

The next parameter will give ftpd access to write anywhere:

setsebool -P ftpd_full_acess=true 

Do not use ftpd_anon_write unless you want anonymous uploads to be allowed.

1

In my case problem was with filesystem.

There was a space but filesystem run out of inodes df -i

# df -i
Filesystem      Inodes   IUsed  IFree IUse% Mounted on
/dev/xvdf1     3276800 3276800      0  100% /ftp-data01
0

For Fedora23 run the commands:

setsebool -P ftpd_anon_write 1 
setsebool -P ftpd_full_access 1

It worked for me.

0

Another possibility : check disk quotas for the user/group

ext:

repquota -a

xfs:

xfs_quota -x -c 'report' /mount_point
0

You are likely to have unsupported characters in filename

0

In my case, the ftp user had no permissions in the directory it was in.

I just had forgotten to cd into the target directory, which I did have the right permissions for.

0

In my case (CentOS7 + vsftpd) changing directory permissions to 775 by command "chmod 775 /home/user/ftpdir/" not helped.

I checked selinux status by command "sestatus", it was enabled, i list ftp related options: "getsebool -a|grep ftp"

and enabled the disabled option ftpd_full_access by command "setsebool ftpd_full_access on". Then it started writing the file.

0
nano /etc/vsftpd.conf

# modify these lines
write_enable=YES
chroot_local_user=YES

# add these lines
userlist_enable=YES
userlist_file=/etc/vsftpd.userlist

add the user to /etc/vsftpd.userlist

usermod --home /var/www/html/ username
chown -R username /var/www/html
chmod -R 755 /var/www/html

7 is user, 5 is group, 5 is other

7 is binary 111, 5 is binary 101

111 = read (yes), write (yes), execute (yes)

101 = read (yes), write (no), execute (yes)

So, the user can read, write, execute but other people can't write.

You must log in to answer this question.