19

I am writing a Linux shell script to copy a local directory to a remote server (removing any existing files).

Local server: ftp and lftp commands are available, no ncftp or any graphical tools.

Remote server: only accessible via FTP. No rsync nor SSH nor FXP.

I am thinking about listing local and remote files to generate a lftp script and then run it. Is there a better way?

Note: Uploading only modified files would be a plus, but not required.

  • ncftp is totally out the question ? Would be easiest imho. (and i know it'll do it as i use it that way) – Sirex Jan 11 '11 at 9:30
  • Sirex: I would rather do it with tools that come by default on RedHat. If lftp proves unusable, I will add a requirement for users to install ncftp. – Nicolas Raoul Jan 11 '11 at 9:40
  • The syntax for wput (a wget-like ftp-uploader): wput dir/ ftp://user:pass@host/dir – kenorb Jun 7 '15 at 12:47
39

lftp should be able to do this in one step, in particular with lftp mirror:

EDIT: the lftp command syntax is confusing, original invocation I posted doesn't work. Try it like this:

lftp -e "mirror -R {local dir} {remote dir}" -u {username},{password} {host}

note the quotes around the arguments to the -e switch.

  • 1
    +1 for tipping me that lftp's mirror mode works even if FXP is not available (I was convinced of the opposite after reading tutorials.papamike.ca/pub/lftp.html which says "both servers must support this protocol for this operation to succeed"). However, this particular command fails on my Ubuntu server: lftp: mirror: Name or service not known, Unknown command `-R'. – Nicolas Raoul Jan 11 '11 at 8:13
  • I reworded my answer with a better invocation of lftp, hopefully that helps. – Phil Hollenback Jan 11 '11 at 8:47
  • I finally gt it to work! It seems that you must switch remote and local for it to work. Please update and I will accept this answer. Here is a command line that works: lftp -e "mirror -R /tmp/mylocalfiles /var/www" -u remoteuser,remotepassword remoteserver – Nicolas Raoul Jan 12 '11 at 2:24
  • I think I saw in the lftp docs that you had to switch the local and remote dirs when using -R but I must have forgot. Updated my answer. – Phil Hollenback Jan 12 '11 at 2:29
  • How does it fail? Have you tried running 'lftp -vvv' for more verbose output to determine what it's trying to do? – Phil Hollenback Jan 12 '11 at 2:55
1

Based on Phil's idea of using lftp's mirror mode, this command does the trick:

lftp -c 'open -e "mirror /tmp/thedir ftp://nico:mypass@remotehost/~/destination/" ftp://nico:mypass@localhost'

A drawback is that it requires the local server to have an FTP server running.

1
cd {local_dir}
lftp {server}
cd {remote_dir}
mput {local_dir}/*

This worked for me, many other attempts were failing. Once in lftp, more info available via:

help mput
  • 2
    It would probably be better to use mirror -R here. – gauteh Mar 24 '17 at 7:29
  • @gauteh you're right. best answer ^ – austin Mar 27 '17 at 23:42
0

Finally got the answer!!! Create shell script ftpmirror.sh

#!/bin/bash 
path = /local-dir-path
lftp -e "mirror -R $path /$path" -u username,password ftp-server-ip
  • Path = local directory which we want to copy into ftp server
  • username = ftp server user name
  • password = ftp server password
  • ftp-server-ip = IP address of ftp server

If lftp package is not installed the installed it using yum.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.