Как рекурсивно загрузить каталог на FTP-сервер, используя только ftp или lftp?

19

Я пишу сценарий оболочки Linux, чтобы скопировать локальный каталог на удаленный сервер (удалив все существующие файлы).

Локальный сервер: ftp и lftpкоманды доступны, нет ncftp или какие-либо графические инструменты.

Удаленный сервер: доступен только через FTP. Ни Rsync, ни SSH, ни FXP.

Я думаю о выводе списка локальных и удаленных файлов, чтобы сгенерировать скрипт lftp и затем запустить его. Есть ли способ лучше?

Примечание: загрузка только измененных файлов будет плюсом, но не обязательна.

Николас Рауль
источник
ncftp полностью вне вопроса? Было бы проще имхо. (и я знаю, что это будет сделано так, как я использую это таким образом)
Sirex
Sirex: Я бы предпочел сделать это с помощью инструментов, которые поставляются по умолчанию в RedHat. Если lftp окажется непригодным для использования, я добавлю требование для пользователей установить ncftp.
Николас Рауль
Синтаксис для wput(подобный wget ftp-uploader):wput dir/ ftp://user:pass@host/dir
kenorb

Ответы:

39

lftp должен быть в состоянии сделать это за один шаг, в частности с помощью lftp mirror:

РЕДАКТИРОВАТЬ: синтаксис команды lftp сбивает с толку, исходный вызов, который я опубликовал, не работает. Попробуйте это так:

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

обратите внимание на кавычки вокруг аргументов -eпереключателя.

Фил Холленбек
источник
1
+1 за подсказку, что зеркальный режим lftp работает, даже если FXP недоступен (я убедился в обратном после прочтения tutorials.papamike.ca/pub/lftp.html, в котором говорится, что «оба сервера должны поддерживать этот протокол для успешного выполнения этой операции». «). Однако эта конкретная команда не выполняется на моем сервере Ubuntu: lftp: mirror: Имя или служба неизвестна, неизвестная команда `-R '.
Николас Рауль
Я перефразировал свой ответ лучшим вызовом lftp, надеюсь, это поможет.
Фил Холленбек
Я наконец-то получил его на работу! Кажется, что вы должны переключиться на удаленный и локальный, чтобы он работал. Пожалуйста, обновите, и я приму этот ответ. Вот командная строка, которая работает: lftp -e "mirror -R / tmp / mylocalfiles / var / www" -u remoteuser, remotepassword remoteserver
Николас Рауль
Я думаю, что видел в документах lftp, что вам приходилось переключать локальные и удаленные каталоги при использовании -R, но я, должно быть, забыл. Обновил мой ответ.
Фил Холленбек
Как это терпит неудачу? Вы пытались запустить 'lftp -vvv' для более подробного вывода, чтобы определить, что он пытается сделать?
Фил Холленбек
1

Основываясь на идее Фила об использовании зеркального режима lftp, эта команда добивается цели:

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

Недостаток заключается в том, что на локальном сервере должен быть запущен FTP-сервер.

Николас Рауль
источник
1
cd {local_dir}
lftp {server}
cd {remote_dir}
mput {local_dir}/*

Это сработало для меня, многие другие попытки потерпели неудачу. Однажды в lftp, больше информации доступно через:

help mput
Остин
источник
2
Вероятно, было бы лучше использовать mirror -Rздесь.
Гаут,
@gauteh ты прав. Лучший ответ ^
Остина
0

Наконец-то получил ответ !!! Создать сценарий оболочки ftpmirror.sh

#!/bin/bash 
path = /local-dir-path
lftp -e "mirror -R $path /$path" -u username,password ftp-server-ip
  • Путь = локальный каталог, который мы хотим скопировать на FTP-сервер
  • username = имя пользователя сервера ftp
  • пароль = пароль ftp сервера
  • ftp-server-ip = IP-адрес ftp-сервера

Если пакет lftp не установлен, установите его, используя yum.

Киран Зинджурде
источник