Коллеги, сегодня я хочу поделиться с вами небольшим скриптом полного бекапирования сервера и выгрузки архива на внешний SFTP-сервер. Архивирование производилось как обычно, с помощью tar, с игнорированием некоторых ненужных каталогов. Затем следовало бы выгрузить этот архив по протоколу SCP на другой сервер, однако последний не поддерживал доступ по ключам.
Немного поискав в инете, я нашел, что можно передавать пароль программе scp с помощью утилиты expect. Вкратце, expect позволяет имитировать действия пользователя, выполняя определенные инструкции в зависимости от текстового вывода в консоли. Например, с помощью expect можно организовать беспарольный SSH-доступ, когда сам сервер не поддерживает доступ по ключам.
Так мы и поступим. Сначала генерируем дату вида 2012-11-01 (немного костыльным способом, но хотелось все запихать в один файл, без аргументов). Создаем полный tar-архив. И, наконец, тыкаемся с помощью scp на сервер. Программа, что логично, спрашивает пароль, а более конкретно – выводит приглашение “password:”. Его-то мы как раз и ожидаем (expect – игра слов). После чего посылаем пароль. Все остальное сделает scp.
Теперь остается запихать этот скрипт в /etc/crontab и идти пить пиво.
#!/usr/bin/expect -f set timeout 100 set HOST "REMOTE_SFTP_SERVER" set USER "VERY_SECRET_LOGIN" set PASS "VERY_SECRET_PASSWORD" spawn date "+%Y-%m-%d" expect -re "(.*)\r\n" set DATE $expect_out(1,string) spawn /bin/tar --exclude=/var/backups --exclude=/dev --exclude=/sys --exclude=/proc -cf /var/backups/$DATE.tar / expect eof spawn scp /var/backups/$DATE.tar $USER@$HOST:/ expect "password: " send "$PASS\r" expect eof