[ Пред. ] [ Содержание ] [ След. ]

ftp

[ @debian @console @ftp @lftp @ncftp @vsftpd ]

 


На всякий случай надо знать: File Transfer Protocol (FTP) был придуман в начале 1970х и безопасность там до сих пор условная, логин и пароль возможны, но передаются в открытом виде. Есть разработка SSH File Transfer Protocol (SFTP), но это создаётся и настраиватся при создании ftp-сервера, поэтому оно sftp есть, но не везде.


Работа с файлами на ftp-сервере


Подразумеваем, что есть удаленный ftp-ресурс вроде шаред-каталога на домашнем NAS, и к нему можно обращаться по условному url или по ip „192.168.10.10:21”, где 21 — стандартный порт для ftp, и что нам надо закинуть туда туда каталоги/файлы и снять с него на hdd другие.


Простейший способ


Любое ПО для работы с файлами, в том числе и по ftp:

  1. Krusader
  2. FileZilla
  3. LeechFTP
  4. что угодно ещё…

Или в консоли через утилиту „ncftp”.


В консоли нативно невозможно закачивать на удалённый ftp-сервер каталоги — только файлы, и также бывают бесконечно неиллюзорные трудности с удалением каталогов, внутри которых есть файлы и/или другие каталоги. „ncftp” решает всё это незаметно.


Пример закачивания каталога со всем его содержимым на удалённый ftp-сервер с запросом пароля у пользователя:


  1. ncftpput -R -v -u ТВОЙ_ftp_ЛОГИН 192.168.10.10 /ПОЛНЫЙ_ПУТЬ/КАТАЛОГ_НА_FTP/ /полный_путь/каталог_с_файлами/на_hdd/*
  2. будет запрошен пароль, при вводе его заменят *****

Пример закачивания каталога со всем его содержимым на удалённый ftp-сервер без взаимодействия с пользователем (идеально для автоматизации действий в bash):


  1. ncftpput -R -v -u ТВОЙ_ftp_ЛОГИН -p ТВОЙ_ftp_ПАРОЛЬ 192.168.10.10 /ПОЛНЫЙ_ПУТЬ/КАТАЛОГ_НА_FTP/ /полный_путь/каталог_с_файлами/на_hdd/*

Примеры


Скачать несколько файлов с ftp


Если залогинился на удаленный ftp-сервер, то:


mget *.txt


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


prompt


В ответ получим „Interactive mode off”. Ещё раз повторить mget и все файлы, попадающие под запрос, будут сняты на hdd.


Можно не логиниться, а снять файлы через wget — но только файлы, каталоги будут проигнорированы в любом варианте:


wget --user='ТВОЙ_ftp_ЛОГИН' --password='ТВОЙ_ftp_ПАРОЛЬ' ftp://192.168.10.10/folder/file.txt


Закачать на ftp-сервер файлы


Зайти в каталог с нужными файлами на hdd.


mput *


Закачать на ftp-сервер каталоги


В консоли в нативном окружении это невозможно. Закачивать на ftp можно только файлы, а каталоги (и подкаталоги) на ftp-серевере надо создавать с нуля и закачивать в них файлы последовательно.


Стандартное решение — архивы tar:

  1. на hdd добавить все нужные каталоги/файлы в [[:Common:HowTo:zip]> (или в tar, мы же наследники древнего unix; в „tar“ проще дописывать файлы или прямо в консоли — вынимать из него файлы и каталоги по-отдельности)
  2. закинуть этот файл-архив по ftp
  3. распаковать его на ftp

Автоматизировать на bash закачивание файлов на ftp


Подразумеваем, что на ftp-сервере постоянно находится директория „inbox“, в которую надо залить все файлы из определенного каталога с hdd (назовем его /home/user/sendToFtp)


Создать исполняемый sh-файл с таким содержимым:


#!/bin/bash

# add variables
REMOTEHOST='192.168.10.10'
USER='логин'
PASSWORD='пароль'
LOCALFOLDER='/home/user/sendToFtp'
REMOTEFOLDER='/ПОЛНЫЙ_ПУТЬ/inbox'


ftp -n -v $REMOTEHOST [[ EOT
ascii
user $USER $PASSWORD
prompt
lcd $LOCALFOLDER
cd $REMOTEFOLDER
mput *
ls -la
bye
EOT


Но будут заброшены только файлы, каталоги ftp игнорирует. Или добавить команды для создания промежуточного файла-контейнера без компрессии „filename.tar“, и через „put filename.tar” закинуть его на ftp-сервер (и распаковать, если надо), или же используем однострочник, в котором даже нет смысла отдельно заявлять переменные:


#!/bin/bash

ncftpput -R -v -u ТВОЙ_ЛОГИН -p ТВОЙ_ПАРОЛЬ 192.168.10.10 /ПОЛНЫЙ_ПУТЬ/inbox/ /home/user/sendToFtp/*

И всё содержимое „/home/user/sendToFtp/” улетает на сервер — и файлы, и каталоги с сохранением всей структуры.


Поднять свой ftp-сервер


vsftpd