Автоматизация работы с FTP через макросы.
Как автоматизировать работу с несколькими FTP серверами в Linux? Как запускать задания для FTP через cron?
Стандартный способ работы с FTP через командную строку linux:
$ftp ftp.server.ru
на запросы сервера вводим логин и пароль, а можно логиниться сразу:
$ftp user:password@ftp.server.ru
можно получить файл с FTP одной строкой:
$echo get myfile.txt | ftp user:password@ftp.server.ru
(данный способ работает не на всех дистрибутивах – работает на SUSE, но не работает на Debian и RedHat)
А как нам автоматизировать работу с FTP? К примеру нам надо скопировать все файлы из папки ~/webfiles на локальном компьютере в директорию webdirectory на FTP сервере и автоматизировать данный процесс (запуск из cron).
создадим скрытый файл .netrc с нашей домашей директории:
$vim ~/.netrc
и впишем в него переменные среды для FTP:
machine 192.168.1.2
login bainm
password myftppassword
Теперь мы можем работать с FTP сервером по адресу 192.168.1.2 без ввода пароля:
$echo get testfile.txt | ftp 192.168.1.2
Connected to 192.168.1.2.
220 acamas.ilium FTP server (Version 6.4/OpenBSD/Linux-ftpd-0.17) ready.
331 Password required for bainm.
230 User bainm logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
local: testfile.txt remote: testfile.txt
227 Entering Passive Mode (192,168,1,2,9,203)
150 Opening BINARY mode data connection for ‘testfile.txt’ (0 bytes).
226 Transfer complete.
221 Goodbye.
Мы получили с сервера файл testfile.txt
Создание функции в bash. Создадим в bash функию compileFTP:
function compileFTP {
cat <<STOP
prompt off
lcd $1
#Don’t worry if the target directory already exists – FTP won’t complain:
mkdir $2
cd $2
mput *
STOP
}
далее если в командной строке ввести:
$compileFTP ~/webfiles webdirectory | ftp 192.168.1.2
после запуска мы автоматически заходим на сервер (без ввода логина и пароля, так как они прописаны в .netrc, на сервере создаётся каталог webdirectory в который закачиваются все файлы из директории ~/webfiles на локальном компьютере.
Но написание функций для FTP в bash неудобно, поэтому лучше пропишем эти действия в ~/.netrc как макрос и назовём его updateWeb:
$vim ~/.netrc
впишем в него:
macdef updateWeb
prompt off
lcd /home/bainm/webfiles
mkdir webdirectory
cd webdirectory
mput *
вызов данного макроса осуществляется следующим образом:
echo “$ updateWeb” | ftp 192.168.1.2
“$ updateWeb” говорит ftp клиенту использовать макрос с именем updateWeb.
теперь мы можем прописать наш макрос в cron для атоматического запуска в определённое время:
$crontab -e
вписываем:
0 0 * * * echo “$ updateWeb” | ftp 192.168.1.2
Чтобы не переписывать .netrc для каждого ftp сервера (к примеру у каждого из серверов различная структура каталогов и загрузка файлов для каждого из них долна происходить из разных каталогов), мы можем вписать в него:
macdef updateWeb
prompt off
lcd $1
mkdir $2
cd $2
mput *
теперь для вызова макроса нужно подставить в его аргументы значения (имена каталогов):
echo “$ updateWeb /home/bainm/webfiles webdirectory” | ftp 192.168.1.2

Leave a Reply