Часто требуется автоматизировать процессы скачивания, загрузки и удаления файлов 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:
Далее, работа с 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.
Для этого необходимо выполнить следующий набор команд:
В итоге получим требуемый результат:
Обратите внимание, что при указании полного пути на FTP-сервере используется знак «/» между директориями, а для указания пути на локальном компьютере будет использоваться, как обычно, знак «\». Кроме того, если путь будет содержать пробелы, то следует заключить его в кавычки.
Возможен также запуск команды ftp и в пакетном режиме. Эту же задачу можно решить, выполнив команду «ftp -v -n -s:transport.txt» ,
где файл transport.txt находится в директории «C:\example» и содержит тот же набор операторов:
2. Пример bat-файла для загрузки файла на FTP
Теперь попробуем написать «батник» для загрузки файлов на FTP-сервер. Для этого создадим новый текстовый документ, и переименуем его в put_on_ftp.bat . Редактировать его можно обычным Блокнотом, но удобнее это делать с помощью бесплатной программы Notepad++.
Для начала напишем «батник», который будет загружать на сервер tavalik.ru файл file_data.dat из «С:\example» . Алгоритм работы bat-файла будет такой:
- Создаем файл transport.txt с последовательностью операторов ftp;
- Выполняем команду ftp, указав в качестве параметров созданный файл;
- Удаляем transport.txt.
В данном примере имя файла и директорий жестко прописаны в файле. Это не всегда удобно. Доработаем bat-файл таким образом, чтобы данные для загрузки он получал в качестве параметров, а также вынесем все изменяемые значения в переменные файла. Получим следующий код (скачать файл):
Соответственно, чтобы скопировать файл file_data.dat из «C:\example» на FTP-сервер в «Temp\Backup» , потребуется запустить этот «батник» указав в качестве параметров имя файла, локальный и удаленный каталоги.
Аналогичным образом можно написать bat-файлы для получения файлов и удаления файлов на FTP-сервере, а также исполняющий файл с произвольным набором инструкций.
Подскажите а как закачивать с FTP файлы по маске допустим так *.txt или *.*
Подскажите пожалуйста, как должен выглядеть файл? Задача:
1) Должен подключиться к FTP.
2) Забрать из нужной папки файл.
3) Затем скопировать в заданную папку другой файл.
Ваша инструкция прекрасна, но все равно разобраться не могу. Буду очень признателен.
для копирования по маске надо вместо put написать
prompt
mput *.txt
Добрый день.
Мануал отличный. Получилось с первого раза, но есть такой вопрос. Есть у меня 200 ftp-серверов, структура файлов, логин и пароль одинаковые. Разница только в именах (IP-адресах). есть 2 папки, в которых лежать файлы на сервере (/mnt/sda2/folder/ и /mnt/sda3/folder/) в которых лежат разные файлы. file1 и file2 в /mnt/sda2/folder/, а file3 и file4 в /mnt/sda3/folder/. Вопрос, как мне правильно всё прописать в скрипте, чтобы за 1 раз все файлы перезаписать по папкам на все сервера?
Мой вам поклон за этот мануал и именно за подобное решение! Хоть и пришлось вывихивать голову на тему, как получить из каталога имя файла для отправки и прикрутить автоматизацию к самому скрипту, но все заработало! Спасибо еще раз!
И вам спасибо за комментарий.
Здравствуйте.
Помогите пожалуйста решить задачу на Windows с помощью bat файла.
Нужно забирать файлы с ftp сервера и перемещать их на облачное хранилище (Dropbox или google drive или яндекс диск) или на другой бесплатный ftp. При этом на компьютере сохранять файлы не нужно. В крайнем случае, компьютер можно использовать для временного хранения файлов при перемещении, но не желательно. После перемещения файлы с исходного ftp нужно удалить.
Ftp сервер без пароля, anonymous.
Спасибо за мануал!! Все получилось с первого раза, практически скопипастила файл для того, чтобы взять документ с фтп-сервера!
Но есть одна проблема… Если я запускаю бат-файл из командной строки, то все ок. если двойным щелчком , то он зацикливается на строке 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%
Файл случайно не
ftp.bat
назвали? Переименуйте, а то он сам себя запускает, из-за этого циклится.Добрый день! Подскажите пожалуйста, мне нужно из определенной папки перемещать файлы на ftp, но предварительно нужно их заархивировать, как это сделать?
Вопросответ : руками или из Батника ?
Добрый день! помогите скопировать файл из локальной машины на удаленную … делаю все как описывается в просторах инета … но почему то не идет точнее команды все вроде проходят нормально но файл так и копируется.. лишь один раз получилось .. да и тот оказался почему то размером 0 кб….в чем проблема??? (так для инф…. я с винды на линукс подключаюсь ….)
Вы правда просто супер!
1) при попытке создать уже существующий каталог вылетает ошибка… как проверить существование каталога ?
2) в самом конце перед удалением файла как проверить что все закончилось успешно ?
Приведённая ниже последовательность команд корректно загружает файл в 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.
Благодарю Вас! Из многих статей в инете ваша инструкция самая понятная. Все по ней сделал, заработала сразу.
добрый день! Помогите пожалуйста, если можно прям тестом батника, потому как я только начинаю осваивать данную тематику, необходимо с сервера ftp скачивать, новые файлы (на компьютере есть папка куда скидываем файлы с ftp руками) и желательно что бы эти же скачиваемые файлы отправлялись в другую папку для дальнейшей обрабтки. Спасибо
Здравствуйте.
Относительно скачивания, так текст такого батника, как раз и проводится в статье.
По поводу дальнейшего копирования в папку, то тут вам поможет команда
copy
, в скрипт добавится одна строчка, что-то вродеcopy C:\Users\desktop\Example.txt D:\backup\Example.txt
Спасибо за статью! От себя хотел добавить, что, если функционала встроенной команды FTP все-таки кому-то будет недостаточно (в чем я убедился на собственном опыте), рекомендую воспользоваться альтернативой в виде свободно (GNU GPL 3) распространяемого WGET. Он кроссплатформенный, крохотный размер, но очень функциональный!
Статья может быть и правильная.
Но встроенный в винду ftp клиент не поддерживает пассивный режим.
А значит на большинстве серверов получит пинка под жопу.
Поэтому у меня ничего не получилось.
Какие есть ещё способы?
Хотел сделать скачивание в фоновом режиме через командную строку filezilla, но пока, кроме подключения ничего не получается.
Пытаюсь автоматизировать выгрузку файлов с локального компьютера на ФТП. Задача такая: Зайти в папку с названием своего района (с этим проблем нет), создать папку с названием типа текущая дата, например, 14042018 — тут загвоздка у меня. А затем положить в неё файлы с локального компьютера (это тоже без проблем)
Уже сделал по Вашему примеру:
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
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%
файл удаляется с фтп но новый не копируется по указанному пути. Делал батник только на копирование, тоже не отрабатывает. В чем дело, помогите разобраться
Добрый день! Подскажите пожалуйста, мне нужно из определенной папки на локальном сервере перемещать файлы на ftp, но я не знаю их имени, как это сделать? Когда я знаю имя, я использую curl.
C:\curl\curl.exe -u login:pass -T D:\Base_1C\__BAT_FOR_1C\clients.csv ftp://11111.222222.ua/inbox/
Добрый день!
Спасибо за инструкцию. Почти работает, но почему-то файлы передаются с размером 0, а при выполнении bat-файла происходит ошибка
200 PORT command successful
425 Unable to build data connection: Connection refused
В чем может быть проблема ? Брандмауер и антивирус отключен.
Спасибо
Бренд маур отключи!