Содержание

Профиты от использования консольного FTP-клиент lftp

Занимаясь веб-разработкой мы часто сталкиваемся с такой типовой задачей: надо забрать с клиентского хостинга сайт, что-то там покрутить, вернуть обновлённую версию обратно. При этом клиентские виртуальные хостинги бывают разные: не на каждом есть SSH или SFTP доступ. Зато старый пыльный FTP есть везде. Если задача простая и затрагивает 1-2 файла, то их «забирает» напрямую программист к себе в IDE, редактирует и выгружает обновления на боевой хост, благо современные IDE снабжены FTP-клиентами. Но если задача требует экспериментов или тестирования, то на боевом клиентском хостинге её решать нельзя стыдно, надо делать «зеркало» у себя. А значит необходим удобный инструмент, позволяющий забрать файлы сайта к себе на сервер по FTP и потом выгрузить их обратно. Задачу блестяще решает консольный FTP-клиент lftp.

Вообще мы долго обходились возможностями mc, но наш серверный администратор на него ругается, не рекомендует через него лазить по многогигабайтным tar`ам, качать большие сайты по FTP и т.

д. И также сразу отмечу, что идейно верным решением был бы rsync, но из-за того, что не к любому виртуальному хостингу его применишь — он не подходит тоже. Поэтому вернёмся к герою сегодняшнего обзора.

В Ubuntu из коробки lftp отсутствует, поэтому для начала экспериментов надо его установить. Как обычно:

sudo apt-get install lftp

Далее можно смело запускать программу, для удобства сразу же передав ей реквизиты удалённого хоста в формате логин:пароль@хост (такой же стандарт используется в mc и вообще описан в RFC 1738):

lftp ftp://user:[email protected]

После успешного коннекта вас ждёт приглашение вида:

lftp [email protected]:~>

Теперь вы можете вводить команды в интерактивном режиме. К счастью, запомнить придётся только несколько самых простых и понятных команд, потом сразу перейдём к самому вкусному.

  • exit — выход из lftp
  • pwd — вывод текущего пути на удалённом сервере (в общем, помогает узнать, где вы находитесь в структуре файлов и каталогов)
  • ls — листинг текущей директории на удалённом сервере
  • ls -al — листинг с расширенными параметрами представления (объём, права и т.
    п.)
  • cd dir — переход в директорию dir на удалённом сервере
  • lpwd — вывод текущего пути на локальной машине (куда по умолчанию будут скачиваться файлы и директории или откуда закачивать на удалённый сервер)
  • lcd dir — переход в директорию dir на локальной машине
  • !ls — листинг текущей директории на локальной машине (на самом деле, вы можете после ! написать любую команду и она будет выполнена локально: например, вместо lpwd можно использовать !pwd)
  • !ls -al — ну, вы поняли
  • get file
    — скачать file из текущей директории удалённого сервера в текущую локальную директорию (file может быть не только относительным, но и абсолютным именем, что конечно же позволяет забирать файл не обязательно из текущей директории)
  • get rfile -o lfile — скачать rfile с удалённого сервера и сохранить на локальном как rfile
  • put file — закачать file из локальной директории на удалённый сервер
  • put lfile -o rfile — закачать lfile на удалённый сервер как rfile
  • help — справка по доступным командам (вы удивитесь, но среди команд есть torrent — и, да, это простенький встроенный торрент-клиент)

Перечисленного выше минимума хватит чтобы освоиться и что-то сделать руками.

Но руками придётся делать немногое, поскольку мы переходим к самому вкусному — команде mirror. Простейшие примеры использования:

  • mirror public_html — синхронизирует директорию public_html с удалённого сервера на локальный, включая все поддиректории и файлы, с сохранением прав и всего такого прочего
  • mirror -R public_html — синхронизирует директорию public_html в обратном направлении, с локальной машины на удалённую

Тут с удовольствием поясню, что значит «синхронизирует». При первом запуске будет произведено полное рекурсивное копирование. Но при повторных запусках передаваться по сети будут только те файлы, которые изменились с момента предыдущей синхронизации. Насколько я понял, факт изменения устанавливается по двум параметрам: дата последнего сохранения файла и его объём. Никакие хеши, конечно, не считаются, но и без с них, к счастью, мы сильно сокращаем скорость синхронизации и объём передаваемых данных.

Вот пример отчёта о первой синхронизации (скачивании) довольно большого сайта в несколько гигабайт:

Total: 1307 directories, 48196 files, 0 symlinks
New: 48196 files, 0 symlinks
3962870501 bytes transferred in 495 seconds (7.

64M/s)

Зато повторный запуск и выполнение той же команды занимает несколько секунд (в этом конкретном случае около 20). И отчёт мы получаем примерно такой:

Total: 1307 directories, 48196 files, 0 symlinks
New: 10 files, 0 symlinks

В итоге в нашем распоряжении оказывается современный механизм (синхронизация) поверх древних технологий (FTP). И это отлично!

В интерактивный режим lftp входить не обязательно, можно из локальной консоли сразу дать такую команду, чтобы директорию синхронизировалась, например:

lftp -e 'mirror -c public_html /var/www/testsite/public_html; bye;' ftp://user:[email protected]

Ключ -e

для lftp позволяет указать команду(ы) для выполнения, а после команд идёт хост с реквизитами доступа.

Параметром ключу -e мы в кавычках передаём последовательность команд, сначала команду mirror, она будет синхронизировать контент из удалённой папки . /public_html в локальную /var/www/testsite/public_html, потом FTP-команду bye — для закрытия соединения.

Ключ для команды mirror активирует докачку (поэтому его лучше всегда использовать).

Для верности дам ещё один пример, в котором мы обратно на удалённый сервер синхронизируем данные из локальной директории (например, после того, как изменим пару файлов локально):

lftp -e 'mirror -c -R /var/www/testsite/public_html public_html; bye;' ftp://user:[email protected]

Разница тут в том, что мы добавили уже известный ключ -R, ну и поменяли местами каталоги (сначала указывается откуда, а потом куда синхронизировать).

Можно любую последовательность команд вынести в отдельный файл и запустить lftp с ключом -f для выполнения этой последовательности:

lftp -f commands.ftp

Контент commands.ftp может быть таким (для примера выполню там те же действия, что и в предыдущем запуске):

open ftp://user:PassW0rd@example. com
mirror -c -R /var/www/testsite/public_html public_html
exit

В интерактивном режиме lftp позволяет легко устанавливать кодировки для удалённого сервера. Вот так:

set ftp:charset cp1251

Ещё одна полезная опция (которая по умолчанию добавляет ключ -a к FTP-команде LIST на удалённом сервере, в результате чего начинают видеться и копироваться «скрытые» файлы и папки, названия которых начинаются с точки):

set ftp:list-options -a

Вообще команда set позволяет на лету и на время перенастраивать lftp не лазя руками в конфиг. Все действующие параметры конфига можно посмотреть так:

set -a

Базовый конфиг хранится в /etc/lftp.conf, а логи и история хранятся в директории ~/.lftp отдельно для каждого пользователя.

Могу вам порекомендовать в базовом конфиге раскомментировать вот эти две строчки (ищите их ближе к концу файла /etc/lftp. conf):

set at-exit "set > ~/.lftp/settings"
source ~/.lftp/settings

Тогда все настройки, задаваемые через

set будут сохранятся перед выходом из lftp.

Кроме упомянутого торрент-клиента в lftp есть ещё много примочек, например, очереди (см. help queue в интерактивном режиме) и альясы (см. help alias). lftp умеет работать с протоколами FTPS, FISH и SFTP, т.е. если к файловой системе хостинга есть хоть какой-то доступ, то lftp вам поможет забрать и выгрузить файлы. А ещё lftp поддерживает FXP — это протокол, позволяющий передавать файлы с одного FTP-сервера на другой напрямую, не копируя их на локальную машину. В lftp такая передача реализуется командой типа get ftp://... -o ftp://...

Надеюсь, что lftp пропишется у вас если уж не на боевом сервере, то хотя бы на сервере для разработки.

lftp: зеркалируем локальные и удаленные каталоги : DevOps: servers abuse

lftp — программа для передачи файлов в сложных условиях ftp, http и других соединений. lftp имеет встроенную поддержку зеркалирования всего дерева каталогов. Она так же может зеркалировать в обратном режиме, т.е. сделать зеркало локального каталога на сервере, загрузив все файлы. Еще одна интересная возможность: зеркалирование двух удаленных серверов по протоколу FXP, если он доступен на серверах.

mirror
mirror options
mirror -c
mirror -R

Пример: Как сделать зеркало удаленного каталога (скачать файлы)

Для начала необходимо подключиться к удаленному серверу:

lftp ftp.example.com

Введите имя пользователя и пароль:

lftp ftp.example.com:~> user [email protected]

Пример вывода:

Password:
lftp [email protected]@ftp.example.com:~>

Введите ls, чтоб увидеть список файлов:

lftp ftp.example.com:~> ls

Пример вывода:

-rw-r--r--    1 80       www      36809419 Jun 24 23:59 2012-06-24.log.gz
-rw-r--r--    1 80       www      100912271 Jun 25 23:59 2012-06-25.log.gz
-rw-r--r--    1 80       www      102926055 Jun 26 23:59 2012-06-26. log.gz

Для зеркалирования всех файлов в текущий каталог введите:

lftp ftp.example.com:~> mirror

С командой mirror вы можете указать исходный каталог и каталог назначения. Если каталог назначения будет оканчиваться на слеш («/»), то имя исходного каталога будет добавлено к каталогу назначения.

lftp ftp.example.com:~> mirror source destination

или

lftp ftp.example.com:~> mirror logs/ /data/logs

Я очень рекомендую использовать опцию, которая позволяет продолжить скачивание, если вдруг соединение оборвалось:

lftp ftp.example.com:~> mirror -c source destination

или

lftp ftp.example.com:~> mirror --continue

Чтоб скачать только новые файлы (не работает с -c):

lftp ftp.example.com:~> mirror -n

или

lftp ftp.example.com:~> mirror --only-newer

Вы можете ускорить загрузку файлов используя опцию параллельной загрузки:

lftp ftp. example.com:~> mirror -p

Чтоб указать количество потоков, введите:

lftp ftp.example.com:~> mirror --parallel=10

Пример: как сделать обратное зеркалирование (загрузка файлов)

Для создание обратного зеркала каталога вам необходимо передать опцию -R или —reverse команде mirror. Для начала вам необходимо подключиться к серверу, как было показано в предыдущем примере.

Сменить локальный каталог:

lftp ftp.example.com:~> lcd /home/silver/project/lftp

Пример вывода:

lcd ok, local cwd=/home/silver/project/lftp

Для загрузки дерева файлов и каталогов на сервер:

lftp ftp.example.com:~> mirror -R

или укажите локальный и удаленный каталоги:

lftp ftp.example.com:~> mirror -R /home/silver/project/lftp /var/www/html

Для выхода из FTP сессии:

lftp ftp.example.com:~> quit

12 команд lftp для управления файлами с примерами

В этом руководстве мы собираемся установить LFTP, который представляет собой FTP-клиент командной строки. LFTP поддерживает множество протоколов в дополнение к FTP, например HTTP, HTTPS, HFTP, FISH, FTPS и FXP. Он поддерживает зеркальное отображение каталогов, и вы можете вводить команды в двух режимах.

LFTP работает в оболочке командной строки или прямо из оболочки bash. Оболочка Bash особенно полезна, если вы собираетесь написать сценарий, использующий LFTP.

Настройка FTP-сервера

Поскольку LFTP является FTP-клиентом, для работы с ним нам потребуется некоторая настройка FTP-сервера. Итак, давайте настроим базовый FTP-сервер, который мы будем использовать для демонстрации возможностей LFTP. Простым ftp-сервером в Ubuntu является vsftpd, и мы собираемся установить его из репозиториев

 sudo apt install vsftpd 

После его установки нам нужно разрешить пользователям запись на сервер. По умолчанию FTP-сервер доступен только для чтения.

 sed -i.orig 's/#write_enable=YES/write_enable=YES/g' /etc/vsftpd.conf 

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

 systemctl restart vsftpd 

Проверить статус, чтобы увидеть, работает ли демон сервера

 sudo systemctl status vsftpd 

Использование LFTP для подключения к FTP-серверу на другой компьютер, виртуальную машину или сервер.

Тот, где мы установим LFTP и подключимся к FTP-серверу. LFTP также присутствует в репозиториях Ubuntu, так что давайте его.

 sudo apt install lftp 

Прежде чем подключаться к FTP-серверу, давайте создадим каталог, из которого будем подключаться

 $ mkdir ftp
$ cd ftp/ 

и заполните его файлами для работы с

 $ touch test{1..9} 

Теперь мы можем использовать lftp для подключения к FTP-серверу

 lftp ftp://[email protected]
Пароль: 

Введите пароль вашего пользователя, и вы вошли в систему. Поскольку я находился в ftp-каталоге, когда выполнял FTP-подключение, рабочий локальный каталог на клиенте — ~/ftp. Первая команда, которую мы попробуем, это загрузить файл на ftp-сервер

1. Команда Put

Эта команда берет один файл из локального каталога и загружает его на сервер. Мы загрузим файл test1.

 lftp [email protected]:~> put test1 

2. Список содержимого удаленного каталога

Мы можем проверить, что было сделано с помощью команды ls.

 lftp [электронная почта защищена]:~> ls
-rw------- 1 1000 1000 0 01 дек 12:13 test1 

Мы видим, что файл был скопирован на FTP-сервер.

3. Обратное зеркальное отображение каталога

Если мы хотим отразить весь каталог на сервере, мы будем использовать команду обратного зеркалирования.

 lftp [электронная почта защищена]:~> зеркало -R 

Это скопирует содержимое нашего локального каталога на сервер. Противоположный процесс без -R . Когда мы не добавляем никаких путей к файлам, используются текущие локальные и удаленные каталоги. В нашем случае это ~/ftp и ~/.

4. Изменить локальный каталог

Локальный каталог можно изменить с помощью команды lcd

 lftp [электронная почта защищена]:~> lcd /home/miki/Videos/
lcd ok, local cwd=/home/miki/Videos 

5. Распечатать локальный рабочий каталог

9C Прерывание lftp [электронная почта защищена]:~> зеркало -R -c

7. Загрузка файла с ftp-сервера

Загрузка файлов из удаленного каталога в локальный каталог выполняется с помощью команды pget

 lftp [электронная почта защищена]:~> pget ubuntu-16. 04.1-server-amd64.iso 
 Вывод
  421705192 байт передано  

8. Зеркальное отображение с сервера в локальный каталог

Ранее мы показывали, как сделать обратное, теперь мы используем команду зеркала для получения данных с сервера

 зеркало 

Это просто зеркало.

9. Зеркалирование с произвольными каталогами

Также можно зеркалировать с данными, которых нет в рабочем локальном каталоге, например такой командой:

 зеркало . /home/miki/Videos/ 

Это вытянет данные из рабочего каталога сервера (. — это первый путь, поэтому это текущий каталог) в ~/Videos на нашей локальной машине. Неважно, если мы не использовали lcd для перехода в ~/Vidoes, пулл сработает.

10. Выход из оболочки

Команда для выхода из оболочки lftp пока. Это важно, если вы собираетесь создавать скрипты для операций lftp.

11. Использование команд LFTP как часть сценария

После того, как мы вышли из LFTP, давайте посмотрим, как мы можем использовать приведенные выше команды без входа на ftp-сервер. Таким образом, вы можете встроить его в скрипт bash.

 [email protected]:~$ lftp -e 'mirror /home/miki/ /home/miki/Videos/' -u miki,пароль ftp://192.168.122.65 

12. Зеркалирование сайта

Lftp также может использовать протокол HTTP, что делает его пригодным для загрузки обычных веб-сайтов.

 [email protected]:~$ lftp -e "mirror -c" http://linuxopsys.com/ 

Заключение

Мы выполнили все необходимые команды для успешного использования LFTP. Вы можете использовать его для многих задач, таких как совместное использование файлов на двух ваших компьютерах, периодическое резервное копирование вашего сервера или резервное копирование какого-либо интернет-сайта, который вам нравится.

Спасибо за прочтение, оставляйте свои отзывы и предложения.

Лучший и полный учебник по командам lftp

Команда lftp (lftp Manuel Page) — это программа для передачи файлов, которая позволяет использовать сложные FTP, HTTP и другие соединения с другими хостами. Команда lftp имеет встроенное зеркало, которое может загружать или обновлять все дерево каталогов. Существует также обратное зеркало (mirror -R), которое загружает или обновляет дерево каталогов на сервере. Зеркало также может синхронизировать каталоги между двумя удаленными серверами, используя FXP, если он доступен.

Как подключиться к FTP-серверу через lftp? #

Этот процесс очень прост и возможен двумя способами:

Код

lftp HostName (или IP)

затем введите имя пользователя и пароль:

lftp.biz ftp:mahdi ~> пользователь mahdi

выходы:

 пароль:
lftp [электронная почта защищена]:~> 

Как войти на FTP с помощью однострочной команды: #

также мы можем войти с помощью lftp с помощью однострочной команды, как показано ниже:

 lftp -u mahdi,passWORDgoeshere example.com 

НО , Если ваш FTP-пароль содержит специальные символы, такие как $ или ) , вы хотите оставить пароль таким образом, а затем введите его вручную при появлении запроса:

 lftp -u mahdi example. com 

В некоторых случаях некоторые серверы теперь позволяют вам подключаться к lftp с настройками по умолчанию, вы можете попробовать следующее, чтобы подключиться к этим типам серверов:

 lftp -u userna5,пароль example.com -e "set ftp:ssl-allow off" 

после успешного входа в систему:

Чтобы просмотреть список файлов, введите ls command:

lftp ls результат команды

Чтобы отразить все указанные выше файлы в текущем каталоге, введите:

  зеркало  

Эта команда синхронизирует данные с удаленного компьютера на локальный. (текущий каталог в локальном)

и результат:

, как вы видите на картинке выше, все удаленные файлы зеркалируются в локальный текущий каталог.

С помощью команды mirror lftp вы можете указать исходный каталог в качестве локального целевого каталога. Если целевой каталог заканчивается косой чертой, исходное базовое имя добавляется к имени целевого каталога. Источник и/или цель могут быть URL-адресами, указывающими на каталоги. Синтаксис:

  зеркальный исходный целевой  

С помощью зеркальной команды lftp вы можете указать исходный каталог как локальный целевой каталог. Если целевой каталог заканчивается косой чертой, исходное базовое имя добавляется к имени целевого каталога. Источник и/или цель могут быть URL-адресами, указывающими на каталоги. Синтаксис:

 LFTP [Электронная почта защищена]: ~>  зеркальный источник источника  

Код

LFTP [Электронная почта защищена]:/> Mirror 2000//root/data

Результат:

. вы используете опцию возобновления при использовании команды «Зеркало», так что сеть прерывается во время процесса передачи файла, он будет загружать только частичный файл.

  зеркало -c источник цель  

ИЛИ :

  зеркало --продолжить  

Для загрузки только новых файлов (-c не работает):

  зеркало --только-новее  

ИЛИ

  зеркало -n  

1 Вы можете ускорить ftp операция зеркалирования путем загрузки файлов параллельно ( -P (заглавная P) или --parallel=N ) с использованием следующего синтаксиса:

  зеркало -P  

Чтобы загрузить 10 файлов параллельно, введите:

  зеркало --parallel=10  

Вы можете использовать pget для передачи каждого отдельного файла:

  зеркало -c --use-pget-n=10  

Как синхронизировать локальные файлы с удаленным ftp-сервером (загружать файлы) #

Вам нужно передать -R или --reverse вариант сделать обратное зеркало, т. е. поместить все файлы с локального диска на удаленный ftp-сервер, включая подкаталоги и все файлы в нем. В этом примере обратное зеркало /home/mahdi/ на мой ftp-сервер:

 

 lftp mahdiserver.net lftp [email protected]:~>  пользователь mahdi  
 Пароль:
lftp [электронная почта защищена]:~> 

Сменить локальный каталог на: /home/mahdi

 Для загрузки (синхронизации): 

  зеркало -R  

ИЛИ установите локальный каталог и каталог удаленной загрузки следующим образом:

  зеркало -R /home/mahdi /new  

При использовании -R первый каталог является локальным, а второй удаленным. Если второй каталог опущен, используется базовое имя первого каталога. Если оба каталога опущены, используются текущие локальный и удаленный каталоги. Если целевой каталог заканчивается косой чертой (кроме корневого каталога), то добавляется базовое имя исходного каталога.