Вроде бы всё просто, да только в 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
Спасибо большое. Как раз столкнулся с такой задачей.
ОтветитьУдалитьЗабавно, но оно прощается с сервером раньше, чем отправлен файл.
ОтветитьУдалить