Super User is a question and answer site for computer enthusiasts and power users. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I need to upload a single file to FTP server from Ubuntu. This operation should be done in a script (in non-interactive mode). What is the right syntax for ftp?

I'm trying this, to no avail:

$ ftp -u my-local-file.txt
ftp: Invalid URL `ftp://'
share|improve this question

migrated from Aug 15 '11 at 1:55

This question came from our site for system and network administrators.

How do I man page? – Ignacio Vazquez-Abrams Aug 15 '11 at 2:18
I don't know much about the ftp tool in Ubuntu, but it looks like it's choking on the ftp://. try taking that out maybe? – Nate Koppenhaver Aug 15 '11 at 4:15
@IgnacioVazquez-Abrams man ftp at command line – c.gutierrez Mar 13 '15 at 3:46
Similar: Syncronizing files over FTP, but for multiple files. – kenorb Apr 15 '15 at 19:04
I'm getting '-u unknown option'. – Robert Reiz Aug 25 '15 at 11:58
up vote 95 down vote accepted

Here is one approach:

$ ftp -n <<EOF
user user secret
put my-local-file.txt

Alternatively, create (or edit) the ~/.netrc file in the home dir of the user that will run the ftp command, give it appropriate perms (chmod 0600 ~/.netrc), and add the following:

# ~/.netrc
login user
password secret

Then omit the login information, as in:

$ echo put my-local-file.txt | ftp

Also, here's how you might do the same thing using curl:

$ curl -T my-local-file.txt --user user:secret
share|improve this answer
Wow, I didn't know curl supported ftp! It's super handy. – Sebastien Jun 25 '13 at 16:25
+1 for the curl solution. Why even bother with the other one? – Asaph Oct 9 '13 at 20:55
@Asaph because curl is not installed where I need to do this, so the other solution came in handy. Thanks. – bobef Sep 11 '14 at 8:12
+1 for the curl. Neat, clean and straight to the point! In Debian/Ubuntu "apt-get install curl", if you don't have it. – GTodorov Mar 6 at 18:57
the curl solution is the best and the easiest – Spartan Mar 28 at 16:40

You need to fix the URL given in your statement. You received the error because the URL was incomplete - it was missing the name of the object you are uploading. Once you add the filename after '' as I have done below, you will see the single command does indeed work as you intended.

Try this:

ftp -u my-local-file.txt

share|improve this answer
ftp: invalid option -- 'u' – user2529583 Aug 1 '14 at 17:06
Indeed :( ftp: u: unknown option – webDEVILopers Oct 28 '14 at 10:24

I can recommend ftp-upload. It's a neat little tool that you can install under ubuntu through sudo apt-get install ftp-upload.

Usage example:

ftp-upload -h {HOST} -u {USERNAME} --password {PASSWORD} -d {SERVER_DIRECTORY} {FILE_TO_UPLOAD}
share|improve this answer
Can you provide a link to the tool or its documentation? – bwDraco Jan 27 '15 at 16:11
Hi DragonLord, if you are in Ubuntu and you have installed ftp-upload (using the command I gave before) you can just do man ftp-upload. Hope that helps. – Floris Feb 3 '15 at 18:01

Install ncftp and use the ncftpput tool that comes along with it, pretty much something like this syntax:

ncftpput -u ftpuser -p ftppass ftphostname /path/where/to/upload
if [ $? -ne 0 ]; then echo "Upload failed"; fi

You can even check if the upload status is good or bad. The normal ftp client can also be used along with expect.

share|improve this answer

You can also try lftp.

Here is an example:

lftp -e 'cd folder1/folder2; put /home/path/yourfile.tar; bye' -u user,password

Refer here for more details


share|improve this answer

Upload a file to a remote location via command line

#$1 is the file name
#usage:this_script <filename>

quote USER $USER
put $FILE 
exit 0
share|improve this answer

I use BusyBox's ftpput to do this:

# /bin/busybox ftpput

BusyBox v1.20.2 (Debian 1:1.20.0-7) multi-call binary.


Upload a file to a FTP server

    -v,--verbose            Verbose
    -u,--username USER      Username
    -p,--password PASS      Password
    -P,--port NUM           Port

Note: busybox ftpget work well too.

share|improve this answer

You could also use the sftp or ftp command

sftp {user}@{IP}
put {path To File On Local Computer}

share|improve this answer

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .