вторник, 25 августа 2009 г.

Автоматизация sFTP

Столкнулся с такой проблемой, нужно было делать бэкап ряда папок и пересылать их на sFTP сервер.
Вроде бы всё просто, да только в sFTP нельзя задать пароль при коннекте, он спрашивается только после соединения, т.е. возникает проблема автоматизации данного процесса, не всегда удобно вводить руками пароль...
Отсюда я нашёл 2 выхода:
1) Создание пары ключей
2) Автоматизирование ввода пароля

Т.к.про первый способ много где написано и, это не так интересно, я решил разобраться со вторым способом.
Немного покопал в интернете, наткнулся на программку Expect(инструмент для автоматизации и тестирования в ОС Unix). Оказалась очень полезной и интересной программой(я не давно в мире администрирования Linux, поэтому был очень доволен своей находкой).

Итак приступим к написанию самого скрипта:



#!/bin/bash
#Вначале зададим все переменные, с которым мы будем работать:
#Путь до папки, которую нужно забэкапить
BACKUPPATH="/home/nol1ght/backupfolder"
#Адрес сервера, на котором находится sFTP сервер
HOST="www.nol1ght.ru"
#Номер порта, на котором висит sFTP
PORT="22"
#Имя пользователя
USER="nol1ght"
#Пароль
PASS="yeah:)"
#Название и местоположение нашего архива. 
#(назовём его backup_+сегодняшняя дата)
FILENAME="/home/nol1ght/backup_"`eval date +%d.%m.%y`".tar"

#Для начала всех операций сбрасываем всю нашу папку в архив.
tar -cvzpf $FILENAME $BACKUPPATH

#Теперь переходим к более интересному:
#Существует несколько способов работы с sFTP.
#С помощью expect можно ими воспользоваться. 
#Я покажу два способа:

#Способ первый: работа с файлом содержащим скрипты FTP
#Этот способ позволяет работать с фтп в режими построчного 
#чтения файла, т.е. каждая строка - это команда, 
#которую будет выполнять ftp сервер

#запускаем expect с следующим параметром -c, 
#дальше после него расписываем все команды, 
#которые будут выполнены при помощи expect
expect -c
#командой expect - spawn запускаем наш sftp 
#с параметрами для работы с файлом скриптов, 
#с определением пользователя, сервера и порта подключения.
"spawn sftp -o \"BatchMode no\" -b /home/nol1ght/sftpscript -oport=$PORT $USER@$HOST
#Дожидаемся когда сервер попросит у нас пароль
expect \"password:\"
#Отсылаем серверу пароль
send \"$PASS\r\"
#передаём управление и вывод программе, которую вызывали, 
#т.е. нашему sftp с загруженым скриптом
interact"

#Способ второй: обычная работа
#Запускаем sftp с параметрами пользователя, 
#сервера и порта подключения.
expect -c "spawn sftp -oport=$PORT $USER@$HOST
#ждём запроса пароля
expect \"password:\"
#отсылаем пароль
send \"$PASS\r\"
#ожидаем авторизации и момента, 
#когда можно будет вводить следующую команду
expect \"sftp>\"
#высылаем наш файл на фтп
send \"put $FILENAME\r\"
#ожидаем выполнения и момента, 
#когда можно будет вводить следующую команду
expect \"sftp>\"
#Прощаемся с сервером
send \"bye\r\"
#ожидаем закрытия сервера
expect \"eof\"
"

#под конец операций удаляем наш файл, 
#чтобы не занимал лишнего места
rm $FILENAME


Cодержание файла /home/nol1ght/sftpscript:
put /home/nol1ght/backup_*.tar
exit

И на последок, добавим всё в крон для регулярных бэкапов, открываем кронтаб:
crontab -e
и вписываем строчку, к примеру:
0 02 * * * /home/nol1ght/sftp
Теперь все бэкапы и переброс информации будут происходить в 2 часа ночи ежедневно.


Задача оказалось совсем не сложной. Главное, правильно выбрать инструмент. Я был очень рад познакомиться с expect, надеюсь, что ещё не раз обращусь к его помощи. Так же рад если Вам мой пост был полезен.

source:
ftp

2 комментария:

  1. Спасибо большое. Как раз столкнулся с такой задачей.

    ОтветитьУдалить
  2. Забавно, но оно прощается с сервером раньше, чем отправлен файл.

    ОтветитьУдалить