Данный скрипт был создан мною для автоматизации ежедневного бекапа сайта на удаленный ftp-сервер.
Скрипт синхронизирует содержимое локальной директории на сервере с директорией на ftp (делает зеркало сайта) и пытается сделать бекап в виде архива и, в случае неудачи по причине нехватки места, удаляет самый старый архивный файл бекапа и повторяет попытку.
В качестве ftp-клиента выступает lftp. Протестировано на ftp-сервере proftpd.
#!/bin/bash dir_to_backup=/var/www backup_name_prefix=wiki ftpserver=ftp.server.com username=username password=secretpassword currentdate=$(date +%d-%m-%Y_%H_%M) echo "lftp -e 'set ssl:verify-certificate no ssl:check-hostname false net:connection-limit 4; mirror -c -R $dir_to_backup /; bye;' ftp://$username:$password@$ftpserver" | /bin/bash tar cf - $dir_to_backup | pigz > /tmp/$backup_name_prefix-$currentdate.tar.gz ftp_error=$(echo "lftp -e 'set ssl:verify-certificate no; set ssl:check-hostname false; lcd ~; cd wiki; put /tmp/$backup_name_prefix-$currentdate.tar.gz; bye;' -u $username,$password $ftpserver" | /bin/bash 2>&1) ftp_result=$? echo $ftp_result echo $ftp_error | grep "Disk full" disk_is_full=$? while [ $ftp_result != 0 ]&&[ $disk_is_full ]; do echo "lftp -e 'set ssl:verify-certificate no; set ssl:check-hostname false; lcd ~; cd $backup_name_prefix; rm $backup_name_prefix-$currentdate.tar.gz; bye;' -u $username,$password $ftpserver" | /bin/bash 2>&1 oldestfile=$(echo "lftp -e 'set ssl:verify-certificate no; set ssl:check-hostname false; lcd ~; cd $backup_name_prefix; ls -A1 -t; bye;' -u $username,$password $ftpserver" | /bin/bash 2>&1 | tail -2 | head -1) echo "lftp -e 'set ssl:verify-certificate no; set ssl:check-hostname false; lcd ~; cd wiki; rm $oldestfile; bye;' -u $username,$password $ftpserver" | /bin/bash 2>&1 ftp_error=$(echo "lftp -e 'set ssl:verify-certificate no; set ssl:check-hostname false; lcd ~; cd wiki; put /tmp/$backup_name_prefix-$currentdate.tar.gz; bye;' -u $username,$password $ftpserver" | /bin/bash 2>&1) ftp_result=$? echo $ftp_error | grep "Disk full" disk_is_full=$? done rm -f /tmp/$backup_name_prefix-$currentdate.tar.gz