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>