Why cannot `ftp` program read a file in /tmp directory?

While making an automated ftp upload script, I noticed a very strange behaviour of ftp program: if I want to send a file which belongs to /tmp directory, ftp will always fail and give an error message: cannot create file.

See this:

^_^ ~ > touch /tmp/file1

^_^ ~ > touch file2

^_^ ~ > ftp <server>
Connected to <server> (<server ip>).
220 (vsFTPd 2.2.2)
Name (<server:username>): <username>
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.

ftp> put /tmp/file1
local: /tmp/file1 remote: /tmp/file1
227 Entering Passive Mode (<ip>).
553 Could not create file.

ftp> put file2
local: file2 remote: file2
227 Entering Passive Mode (<ip>).
150 Ok to send data.
226 Transfer complete.
ftp> 

What is wrong with ftp reading a file from /tmp?

There is no SELinux or AppArmor on the server nor on the ftp client.


The problem isn’t reading the file from /tmp –– read the error message: “553 Could not create file.”  When you say

put a_single_file_name

that is equivalent to

put  single_file_name   that_same_file_name_again

So put /tmp/file1 is equivalent to put /tmp/file1 /tmp/file1, and this fails if the FTP server doesn’t have a writable /tmp directory configured.  Try put /tmp/file1 file1, or maybe put /tmp/file1 ./file1.


Note that when you run ftp you are connected to a remote machine. Use the lcd to change directories on your local machine; cd will change directories on the remote machine. In your case

lcd /tmp
put file1
lcd <to original directory>