shell脚本 - Linux定时备份并通过WebDAV上传至坚果云
为了保证数据的安全与完整, 对Linux上的重要数据和配置进行备份是很必要的, 备份文件最好在本地存一份, 上传到云服务一份. 我的服务器上的数据比较少, 打包压缩完大概是100M左右, 思来想去打算用WebDAV的方式传到坚果云. 坚果云存储空间不限量但是普通用户每月的上传流量限制是1G, 对我来说是绰绰有余了.
准备
- 坚果云账号, 在网页端右上角 账户信息 -> 安全选项 里添加一个应用, 记住生成的WebDAV密码, 账户, WebDAV服务器地址
- 根据 这篇文章(https://www.cnblogs.com/misterh/p/9830905.html) 安装cadaver, 并配置非交互式登录
代码
保存以下sh代码, 根据你的情况修改directories, db_user, db_password, db_names, backup_file等变量
#!/bin/bash # 定义要备份的目录 directories=("/etc/nginx" "/opt" "/var/www") # 定义数据库账户密码 db_user="user" db_password="passwd" # 定义要备份的数据库名称列表 db_names=("mydb") DATE=$(date +%Y%m%d) # 定义生成的备份文件名,以日期命名 backup_file="backup_${DATE}.tar.gz" # 输出当前时间和开始信息 start_time=$(date +%s) echo "======================Backup started at $(date)=========================" # 创建一个临时目录来存放SQL文件 temp_dir="temp_backup" mkdir ${temp_dir} # 导出每个数据库到SQL文件 for db_name in "${db_names[@]}"; do sql_file="${temp_dir}/${db_name}.sql" mysqldump -u ${db_user} -p${db_password} ${db_name} >${sql_file} done # 将目录和SQL文件添加到备份中 tar -czf ${backup_file} --transform 's,^,backup/,' "${directories[@]}" -C ${temp_dir} . # 删除临时目录及其中的SQL文件 rm -rf ${temp_dir} # 计算并输出耗时 end_time=$(date +%s) elapsed_time=$((end_time - start_time)) # 获取备份文件的大小 backup_file_size=$(stat --format "%s" ${backup_file}) # 输出完成信息、备份文件大小和耗时 echo "Backup completed. File: ${backup_file}, Size:$(numfmt --to=iec-i --suffix=B ${backup_file_size})" # WebDav上传, 路径中的serverBackup要求是坚果云上已创建好的文件夹, 也可以不填最后这个路径, 则是上传到根目录 echo "Uploading..." cadaver https://dav.jianguoyun.com/dav/serverBackup << EOF put ${backup_file} quit EOF echo "Upload Done! " echo "Elapsed time: ${elapsed_time} seconds" echo "===================== Backup Done at $(date)================================="
bash backup.sh
测试一下, 如果没问题就可以进行下一步了 
设定crontab定时任务
让脚本每周一凌晨3点定时运行并输出日志到指定文件
0 3 * * 1 /root/backup.sh >> /opt/log/backup.log

扩展
如果你的备份文件比较大, 坚果云的免费流量无法满足你的要求, 可以考虑使用各云服务商的对象存储, 看了七牛, 阿里, 腾讯的都不是很贵, 也提供了shell上传的示例代码. 如果你的服务器在国外, 那么像Amazon, Cloudflare等国外云服务商的对象存储貌似更加便宜.