Скачивание, загрузка и удаление файлов с FTP-сервера из командной строки

connect_to_networkЧасто требуется автоматизировать процессы скачивания, загрузки и удаления файлов c FTP-сервера. Например, при работе с распределенными базами данных 1С или для сохранения резервных копий. Но не все знают, что эти процедуры можно выполнять из командной строки, не прибегая к дополнительному программному обеспечению, то есть средствам Windows. Ниже я приведу синтаксис команд для работы с FTP, а также примеры bat-файлов для этих операций.

 

1. Команда ftp

Для обмена файлами с FTP-сервером используется команда ftp, вот ее синтаксис:

FTP [-v] [-d] [-i] [-n] [-g] [-s:имя_файла] [-a] [-A] [-x:sendbuffer]
[-r:recvbuffer] [-b:asyncbuffers] [-w:windowsize] [узел]

-v Отключение вывода на экран ответов с удаленного сервера.
-n Отключение автоматического входа при начальном подключении.
-i Отключение интерактивных запросов при передаче нескольких
файлов.
-d Включение отладочного режима.
-g Отключение глобализации имен файлов (см. команду GLOB).
-s:имя_файла Задание текстового файла, содержащего команды FTP, которые
будут выполняться автоматически при запуске FTP.
-a Использование локального интерфейса для привязки соединения.
-A Анонимный вход в службу.
-x:send sockbuf Переопределение стандартного размера буфера SO_SNDBUF (8192).
-r:recv sockbuf Переопределение стандартного размера буфера SO_RCVBUF (8192).
-b:async count Переопределение стандартного размера счетчика async (3)
-w:windowsize Переопределение стандартного размера буфера передачи (65535).
узел Задание имени или адреса IP удаленного узла,
к которому необходимо выполнить подключение.

Как видно, здесь нет операторов для подключения к серверу и работы с файлами. Дело в том, что эта команда только запускает сеанс ftp:

komanda_ftp_01

Далее, работа с FTP-сервером происходит уже при помощи следующих операторов (пропустить) :


!
Временный переход в оболочку.


append
Добавление в файл.


ascii
Установка режима передачи файлов в формате ascii.


bell
Выдача звукового сигнала по завершении команды


binary
Установка режима передачи файлов в двоичном формате.


bye
Завершение сеанса ftp и выход.


cd <удаленный_каталог>
Изменение рабочего каталога на удаленном компьютере, где:
<удаленный_каталог> — имя каталога, который станет рабочим.


close
Завершение сеанса ftp.


debug
Переключение режима отладки.


delete <удаленный_файл>
Удаление файла на удаленном компьютере, где:
<удаленный_файл> — имя файла для удаления.


dir [<удаленный_каталог>] [<локальный_файл>]
Вывод содержимого каталога удаленного компьютера, где:
<удаленный_каталог> — каталог, содержимое которого будет выведено, если не задан, используется текущий каталог;
<локальный_файл> — задает локальный файл, для сохранения в список, если не задан, список выводится на экран.


disconnect
Завершение сеанса ftp.


get <удаленный_файл> [<локальный_файл>]
Получение файла, где:
<удаленный_файл> — удаленный файл для копирования;
<локальный_файл> — имя файла на локальном компьютере.


glob
Переключение метасимвольного расширения имен локальных файлов.


hash
Переключение вывода «#» для каждого переданного блока данных.


help [<команда>]
Вывод справочных сведений для команды ftp, где:
<команда> — Команда, описание которой будет выведено, если не задана, произойдет вывод всех команд.


lcd [<локальный_каталог>]
Изменение локального каталога рабочего компьютера, где:
<локальный_каталог> — Имя нового локального каталога, если не задан то будет использоваться имя текущего каталога.


literal <команда_1> … <команда_n>
Отправка произвольной команды ftp, где:
<команда_n> — команды для отправки;


ls [<удаленный_каталог>] [<локальный_файл>]
Вывод сокращенного содержимого каталога удаленного компьютера, где:
<удаленный_каталог> — каталог, содержимое которого будет выведено, если не задан, используется текущий каталог;
<локальный_файл> — задает локальный файл, для сохранения в список, если не задан, список выводится на экран.


mdelete <удаленный_файл_1> … <удаленный_файл_n>
Удаление нескольких файлов на удаленном компьютере, где:
<удаленный_файл_n> — имена файлов для удаления.


mdir <удаленный_каталог_1> … <удаленный_каталог_n> <локальный_файл>
Вывод содержимого нескольких каталогов удаленного компьютера, где:
<удаленный_каталог_n> — каталог, содержимое которого будет выведено;
<локальный_файл> — задает локальный файл, для сохранения в список, если не задан, список выводится на экран.


mget <удаленный_файл_1> … <удаленный_файл_n>
Получение нескольких файлов, где:
<удаленный_файл_n> — удаленный файл для копирования.


mkdir <удаленный_каталог>
Создание каталога на удаленном компьютере, где:
<удаленный_каталог> — имя удаленного каталога для создания.


mls <удаленный_каталог_1> … <удаленный_каталог_n> <локальный_файл>
Вывод сокращенного содержимого нескольких каталогов удаленного компьютера, где:
<удаленный_каталог_n> — каталог, содержимое которого будет выведено, если не задан, используется текущий каталог;
<локальный_файл> — задает локальный файл, для сохранения в список.


mput <локальный_файл_1> … <локальный_файл_n>
Отправка нескольких файлов, где:
<локальный_файл_n> — имя локальных файлов, которые будут скопированы.


prompt
Переключение интерактивной подсказки для составных команд.


put <локальный_файл> [<удаленный_файл>]
Отправка одного файла, где:
<локальный_файл> — имя локального файл для копирования;
<удаленный_файл> — имя файла на удаленном компьютере.


pwd
Вывод рабочего каталога удаленного компьютера.


quit
Завершение сеанса ftp и выход в командную строку.


quote <команда>
Отправка произвольной команды ftp, где:
<команда> — команда для отправки.


recv <удаленный_файл> [<локальный_файл>]
Получение файла с использованием текущих настроек типов файлов, где:
<удаленный_файл> — удаленный файл для копирования;
<локальный_файл> — имя файла на локальном компьютере.


remotehelp [<команда>]
Получение справочных сведений о командах удаленной системы, где:
<команда> — команда удаленной системы, если не задан, то выводится список всех команд.


rename <имя_файла> <новое_имя_файла>
Переименование удаленного файла, где:
<имя_файла> — имя файла для переименования;
<новое_имя_файла> — новое имя файла.


rmdir <имя_каталога>
Удаление каталога на удаленном компьютере, где:
<имя_каталога> — имя каталога для удаления.


send <локальный_файл> [<удаленный_файл>]
Копирование одного файла с использованием текущих настроек типов файлов, где:
<локальный_файл> — имя локального файл для копирования;
<удаленный_файл> — имя файла на удаленном компьютере.


status
Отражение текущего состояния подключения ftp.


trace
Переключение трассировки пакетов.


type [<имя_типа>]
Установка типа передачи файлов, где:
<имя_типа> — тип передачи файлов, если не указан будет выведен текущий тип передачи файлов.


user <имя_пользователя> [<пароль>] [<учетная_запись>]
Отправка сведений для подключения к удаленному компьютеру, где:
<имя_пользователя> — имя пользователя для подключения к удаленному компьютеру;
<пароль> — пароль, для указанного имени пользователя, если не указан, но требуется для подключения, команда ftp запросит его у пользователя;
<учетная_запись> — учетная запись для подключения к удаленному компьютеру, если не указана, но требуется для подключения, команда ftp запросит ее у пользователя;


verbose
Переключение режима вывода сообщений.



Рассмотрим небольшой пример.

Пусть у нас есть FTP-сервер с адресом tavalik.ru, имя пользователя для подключения — tavalik, пароль — 1234567890. Требуется загрузить на сервер в директорию «Temp\Backup» файл file_data.dat из «C:\example», а затем сохранить его же на локальный компьютер, в эту же директорию, но уже под именем file_from_ftp.dat.

Для этого необходимо выполнить следующий набор команд:
komanda_ftp_02

В итоге получим требуемый результат:

komanda_ftp_03

Обратите внимание, что при указании полного пути на FTP-сервере используется знак «/» между директориями, а для указания пути на локальном компьютере будет использоваться, как обычно, знак «\». Кроме того, если путь будет содержать пробелы, то следует заключить его в кавычки.

Возможен также запуск команды ftp и в пакетном режиме. Эту же задачу можно решить, выполнив команду «ftp -v -n -s:transport.txt» ,

komanda_ftp_04

где файл transport.txt находится в директории «C:\example» и содержит тот же набор операторов:

komanda_ftp_05

2. Пример bat-файла для загрузки файла на FTP

Теперь попробуем написать «батник» для загрузки файлов на FTP-сервер. Для этого создадим новый текстовый документ, и переименуем его в put_on_ftp.bat . Редактировать его можно обычным Блокнотом, но удобнее это делать с помощью бесплатной программы Notepad++.

Для начала напишем «батник», который будет загружать на сервер tavalik.ru файл file_data.dat из «С:\example» . Алгоритм работы bat-файла будет такой:

  • Создаем файл transport.txt с последовательностью операторов ftp;
  • Выполняем команду ftp, указав в качестве параметров созданный файл;
  • Удаляем transport.txt.

komanda_ftp_06

В данном примере имя файла и директорий жестко прописаны в файле. Это не всегда удобно. Доработаем bat-файл таким образом, чтобы данные для загрузки он получал в качестве параметров, а также вынесем все изменяемые значения в переменные файла. Получим следующий код (скачать файл):

komanda_ftp_07

Соответственно, чтобы скопировать файл file_data.dat  из «C:\example» на FTP-сервер в «Temp\Backup» , потребуется запустить этот «батник» указав в качестве параметров имя файла, локальный и удаленный каталоги.

komanda_ftp_08

Аналогичным образом можно написать bat-файлы для получения файлов и удаления файлов на FTP-сервере, а также исполняющий файл с произвольным набором инструкций.

Помогла ли Вам данная статья?
Да, спасибо, все получилось.
Немного помогла.
Совсем не помогла.
Не то, что я искал(а).
Смотреть результаты
Запись опубликована в рубрике cmd с метками , , , . Добавьте в закладки постоянную ссылку.


27 Responses to Скачивание, загрузка и удаление файлов с FTP-сервера из командной строки

  1. георгий говорит:

    Подскажите а как закачивать с FTP файлы по маске допустим так      *.txt или *.*  

  2. Константин говорит:

    Подскажите пожалуйста, как должен выглядеть файл? Задача:
    1) Должен подключиться к FTP.
    2) Забрать из нужной папки файл.
    3) Затем скопировать в заданную папку другой файл.
    Ваша инструкция прекрасна, но все равно разобраться не могу. Буду очень признателен.

  3. Антон говорит:

    для копирования по маске надо вместо put написать
    prompt
    mput *.txt

  4. Вадим говорит:

    Добрый день.
    Мануал отличный. Получилось с первого раза, но есть такой вопрос. Есть у меня 200 ftp-серверов, структура файлов, логин и пароль одинаковые. Разница только в именах (IP-адресах). есть 2 папки, в которых лежать файлы на сервере (/mnt/sda2/folder/ и /mnt/sda3/folder/) в которых лежат разные файлы. file1 и file2 в /mnt/sda2/folder/, а file3 и file4 в /mnt/sda3/folder/. Вопрос, как мне правильно всё прописать в скрипте, чтобы за 1 раз все файлы перезаписать по папкам на все сервера?

  5. Сергей говорит:

    Мой вам поклон за этот мануал и именно за подобное решение! Хоть и пришлось вывихивать голову на тему, как получить из каталога имя файла для отправки и прикрутить автоматизацию к самому скрипту, но все заработало! Спасибо еще раз!

  6. Павел. говорит:

    Здравствуйте.
    Помогите пожалуйста решить задачу на Windows с помощью bat файла.
    Нужно забирать файлы с ftp сервера и перемещать их на облачное хранилище (Dropbox или google drive или яндекс диск) или на другой бесплатный ftp. При этом на компьютере сохранять файлы не нужно. В крайнем случае, компьютер можно использовать для временного хранения файлов при перемещении, но не желательно. После перемещения файлы с исходного ftp нужно удалить.
    Ftp сервер без пароля, anonymous.

  7. мария говорит:

    Спасибо за мануал!! Все получилось с первого раза, практически скопипастила файл для того, чтобы взять документ с фтп-сервера!
    Но есть одна проблема… Если я запускаю бат-файл из командной строки, то все ок. если двойным щелчком , то он зацикливается на строке echo bye>>%file_transport% и все.. подскажите, вчем дело?

    echo off

    set ftp_host=10.133.24.224
    set ftp_username=PetrukhinV
    set ftp_pass=KA_dp6ASyHvK
    set file_transport=C:\test\transport.txt
    set file_name=output.xlsx
    set t_year=%DATE:~6,4%
    set t_month=%DATE:~3,2%
    set t_day=%DATE:~0,2%
    set t_hour=%TIME:~0,2%
    set t_min=%TIME:~3,2%
    set t_sec=%TIME:~6,2%
    set file_format=output%t_year%-%t_month%-%t_day%_%t_hour%-%t_min%-%t_sec%
    set dir_from=/ttt/
    set dir_to=C:\test

    echo open %ftp_host%>>%file_transport%
    echo user %ftp_username% %ftp_pass%>>%file_transport%
    echo cd %dir_from%>>%file_transport%
    echo lcd %dir_to%>>%file_transport%
    echo get %file_name% %file_format%>>%file_transport%
    echo bye>>%file_transport%

    ftp -v -n -s:%file_transport%
    del %file_transport%

  8. Борис говорит:

    Файл случайно не ftp.bat назвали? Переименуйте, а то он сам себя запускает, из-за этого циклится.

  9. Аноним говорит:

    Добрый день! Подскажите пожалуйста, мне нужно из определенной папки перемещать файлы на ftp, но предварительно нужно их заархивировать, как это сделать?

  10. Даник говорит:

    Добрый день! помогите скопировать файл из локальной машины на удаленную … делаю все как описывается в просторах инета … но почему то не идет точнее команды все вроде проходят нормально но файл так и копируется.. лишь один раз получилось .. да и тот оказался почему то размером 0 кб….в чем проблема??? (так для инф…. я с винды на линукс подключаюсь ….)

  11. Игорь говорит:

    Вы правда просто супер!

  12. Влад говорит:

    1) при попытке создать уже существующий каталог вылетает ошибка… как проверить существование каталога ?

    2) в самом конце перед удалением файла как проверить что все закончилось успешно ?

  13. Игорь говорит:

    Приведённая ниже последовательность команд корректно загружает файл в lan, но со стороны wan заканчивается ровно так, как приведено ниже. Файл не загружается. Почему так?

    С уважением, Игорь

    E:\_proba>export.cmd

    E:\_proba>ftp -i -s:transport.ftp
    ftp> open 88.147.147.82 9021
    Связь с 88.147.147.82.
    220 Microsoft FTP Service
    200 OPTS UTF8 command successful — UTF8 encoding now ON.
    Пользователь (88.147.147.82:(none)):
    331 Password required for ftp1s.

    230 User logged in.
    ftp> binary
    200 Type set to I.
    ftp>
    ftp> put transport.ftp
    504 Command not implemented for that parameter
    150 Opening BINARY mode data connection.

  14. Максим говорит:

    Благодарю Вас! Из многих статей в инете ваша инструкция самая понятная. Все по ней сделал, заработала сразу.

  15. Виктор говорит:

    добрый день! Помогите пожалуйста, если можно прям тестом батника, потому как я только начинаю осваивать данную тематику, необходимо с сервера ftp скачивать, новые файлы (на компьютере есть папка куда скидываем файлы с ftp руками) и желательно что бы эти же скачиваемые файлы отправлялись в другую папку для дальнейшей обрабтки. Спасибо

    • Виталий Онянов говорит:

      Здравствуйте.
      Относительно скачивания, так текст такого батника, как раз и проводится в статье.
      По поводу дальнейшего копирования в папку, то тут вам поможет команда copy, в скрипт добавится одна строчка, что-то вроде
      copy C:\Users\desktop\Example.txt D:\backup\Example.txt

  16. Сергей К. говорит:

    Спасибо за статью! От себя хотел добавить, что, если функционала встроенной команды FTP все-таки кому-то будет недостаточно (в чем я убедился на собственном опыте), рекомендую воспользоваться альтернативой в виде свободно (GNU GPL 3) распространяемого WGET. Он кроссплатформенный, крохотный размер, но очень функциональный!

  17. Аноним говорит:

    Статья может быть и правильная.
    Но встроенный в винду ftp клиент не поддерживает пассивный режим.
    А значит на большинстве серверов получит пинка под жопу.

    • Евгений Б говорит:

      Поэтому у меня ничего не получилось.
      Какие есть ещё способы?
      Хотел сделать скачивание в фоновом режиме через командную строку filezilla, но пока, кроме подключения ничего не получается.

  18. Эдуард Король говорит:

    Пытаюсь автоматизировать выгрузку файлов с локального компьютера на ФТП. Задача такая: Зайти в папку с названием своего района (с этим проблем нет), создать папку с названием типа текущая дата, например, 14042018 — тут загвоздка у меня. А затем положить в неё файлы с локального компьютера (это тоже без проблем)

  19. Эдуард Король говорит:

    Уже сделал по Вашему примеру:
    set ddmmyyyy=%date:~0,2%%date:~3,2%%date:~6,4%
    echo user>>ASUJKU.out
    echo pasword>>ASUJKU.out
    echo cd Rayon>>ASUJKU.out
    echo mkdir %ddmmyyyy%>>ASUJKU.out
    echo cd %ddmmyyyy%>>ASUJKU.out
    echo prompt>>ASUJKU.out
    echo mput \\Local_serverr\Folder\*.*>>ASUJKU.out
    echo bye>>ASUJKU.out

    rem ****Запускаем на исполнение****
    ftp -s:ASUJKU.out ip_ftp

    rem **** Удаляем файл с командами FTP
    del ASUJKU.out

  20. Евгений говорит:

    echo open %ftp_host%>%file_transport%
    echo user %ftp_username% %ftp_pass%>>%file_transport%
    echo cd %dir_to%>>%file_transport%
    echo del %file_name%>>%file_transport%
    echo lcd %dir_from%>>%file_transport%
    echo put %file_name%>>%file_transport%
    echo bye>>%file_transport%
    файл удаляется с фтп но новый не копируется по указанному пути. Делал батник только на копирование, тоже не отрабатывает. В чем дело, помогите разобраться

  21. Julia говорит:

    Добрый день! Подскажите пожалуйста, мне нужно из определенной папки на локальном сервере перемещать файлы на ftp, но я не знаю их имени, как это сделать? Когда я знаю имя, я использую curl.
    C:\curl\curl.exe -u login:pass -T D:\Base_1C\__BAT_FOR_1C\clients.csv ftp://11111.222222.ua/inbox/

  22. Юрий Косинов говорит:

    Добрый день!
    Спасибо за инструкцию. Почти работает, но почему-то файлы передаются с размером 0, а при выполнении bat-файла происходит ошибка
    200 PORT command successful
    425 Unable to build data connection: Connection refused
    В чем может быть проблема ? Брандмауер и антивирус отключен.
    Спасибо

Добавить комментарий для Константин Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *