[ @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:
- Krusader
- FileZilla
- LeechFTP
- что угодно ещё…
Или в консоли через утилиту „ncftp”.
Пример закачивания каталога со всем его содержимым на удалённый ftp-сервер с запросом пароля у пользователя:
- ncftpput -R -v -u ТВОЙ_ftp_ЛОГИН 192.168.10.10 /ПОЛНЫЙ_ПУТЬ/КАТАЛОГ_НА_FTP/ /полный_путь/каталог_с_файлами/на_hdd/*
- будет запрошен пароль, при вводе его заменят *****
Пример закачивания каталога со всем его содержимым на удалённый ftp-сервер без взаимодействия с пользователем (идеально для автоматизации действий в bash):
- 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:
- на hdd добавить все нужные каталоги/файлы в [[:Common:HowTo:zip]> (или в tar, мы же наследники древнего unix; в „tar“ проще дописывать файлы или прямо в консоли — вынимать из него файлы и каталоги по-отдельности)
- закинуть этот файл-архив по ftp
- распаковать его на ftp
Автоматизировать на bash закачивание файлов на ftp
Подразумеваем, что на ftp-сервере постоянно находится директория „inbox“, в которую надо залить все файлы из определенного каталога с hdd (назовем его /home/user/sendToFtp)
Создать исполняемый sh-файл с таким содержимым:
#!/bin/bash
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/” улетает на сервер — и файлы, и каталоги с сохранением всей структуры.