linux自动备份文件的脚本需求

需求
两种情况,
1.A机器已经自动压缩备份好了文件.tar.gz,只需要从A的备份路径下自动复制文件到B的路径下,(B的路径已挂载了weddav)。
2.A机器没有自动备份,手动写脚本,需要自动压缩备份目标文件夹或者文件.tar.gz,到B的路径下,(B的路径已挂载了weddav)。

这样我备份数据就在云端了。

请注意
1.需要有一个自动删除a路径下的文件,比如超过7天的就自动删除。
2.压缩级别需要可以设置。
3.顺带也提供一下,开机自启动wevdav,并且能自动挂载的方法。我实际操作,挂载好了,重启就没了。不知道是不是在/etc/fstab编辑文件,操作,需要具体方法。

3.或许您有更多好的自动备份数据到云端的方法,也可以提供一下,向 Duplicati这种有点重,我服务器才1G内存,我还要装docker,还要再装这个,显得有笨重。

感谢。

引用new bing作答:
以下是针对您的需求编写的脚本示例:

#!/bin/bash

# 备份源文件夹路径
source_path=/path/to/source/folder

# 备份目标文件夹路径
backup_path=/path/to/backup/folder

# weddav挂载路径
weddav_path=/mnt/weddav

# 备份文件名
backup_filename=$(date +%Y%m%d)_backup.tar.gz

# 压缩级别
compression_level=9

# 自动删除7天前的备份文件
find $backup_path/* -mtime +7 -exec rm {} \;

# 检查是否存在需要备份的文件或文件夹
if [ -e "$source_path" ]; then
  # 源文件夹存在,进行备份
  tar -czvf $backup_path/$backup_filename --level=$compression_level $source_path
  
  # 检查weddav是否已挂载
  if ! mount | grep $weddav_path > /dev/null; then
    # weddav未挂载,尝试自动挂载
    mount -t davfs -o uid=1000,gid=1000,rw,file_mode=0777,dir_mode=0777 https://your-webdav-server.com $weddav_path
  fi
  
  # 复制备份文件到weddav挂载路径
  cp $backup_path/$backup_filename $weddav_path/$backup_filename
  
  # 卸载weddav挂载路径
  umount $weddav_path
else
  # 源文件夹不存在,给出错误提示
  echo "Error: Source folder not found."
  exit 1
fi

exit 0

请将上述脚本保存为一个可执行文件,比如backup.sh,并根据您的实际情况修改脚本中的变量值和注释。

此脚本可以自动检测是否存在需要备份的文件或文件夹,如果存在则将其压缩成一个.tar.gz文件,并将其复制到weddav挂载路径下。同时,脚本会自动删除7天前的备份文件,以避免备份文件夹占用过多磁盘空间。

对于自动挂载weddav,您可以将相关命令添加到系统启动脚本(比如/etc/rc.local),以确保系统重启后仍然能够挂载成功。对于如何自动挂载weddav,您可以参考weddav的官方文档或相关教程。

另外,您也可以考虑使用其他备份软件或服务,比如rsync、BorgBackup、restic等。这些软件通常比较轻量级,而且支持自动备份、增量备份等功能,可以更好地满足您的需求。


以下是一个备份文件的自动化脚本,能够实现你的需求:

#!/bin/bash

# 设置备份目录和要备份的文件或目录名
backup_dir="/path/to/backup/dir"
backup_file="file_or_folder_name"

# 设置压缩级别,这里设置为最高级别(9)
compression_level=9

# 设置备份目标目录,这里假设你已经将B机器挂载到本地路径/mnt/weddav
backup_target_dir="/mnt/weddav"

# 设置备份时间(unix时间戳),这里设置为7天前的时间
backup_time=$(date +%s --date "7 days ago")

# 如果备份文件已经存在,则直接拷贝到备份目标目录中
if [ -f $backup_dir/$backup_file.tar.gz ]; then
    cp -p $backup_dir/$backup_file.tar.gz $backup_target_dir
else
    # 否则,先备份文件,再拷贝到备份目标目录中
    tar -czvf $backup_dir/$backup_file.tar.gz --level $compression_level $backup_dir/$backup_file
    cp -p $backup_dir/$backup_file.tar.gz $backup_target_dir
fi

# 删除7天前的备份文件
find $backup_dir -name "*.tar.gz" -type f -mtime +7 -delete

# 开机自启动weddav并挂载云端目录
# 编辑/etc/fstab文件,在末尾添加以下行:
# //weddav_address/remote/path /mnt/weddav cifs username=your_username,password=your_password 0 0

# 重启系统后,挂载应该就能自动恢复了

# 其他备份方式
# 如果你寻找其他的备份方式,可以考虑使用rsync、scp、ftp、rsnapshot等工具,
# 这些工具也能够很好地实现备份数据到云端的需求。

参考脚本


#!/bin/bash

# 备份源文件路径
SOURCE_PATH="/path/to/source"
# 备份目标路径
TARGET_PATH="/path/to/target"
# 备份文件名称(不包括 .tar.gz 后缀)
BACKUP_NAME="backup"
# 备份文件压缩级别
COMPRESS_LEVEL=6
# 备份文件保留天数
KEEP_DAYS=7

# 情况一:已有备份文件,直接复制
if [ -f "${SOURCE_PATH}/${BACKUP_NAME}.tar.gz" ]; then
    cp "${SOURCE_PATH}/${BACKUP_NAME}.tar.gz" "${TARGET_PATH}"
    echo "File copied."
else
    # 情况二:没有备份文件,需要创建并压缩
    tar czf "${BACKUP_NAME}.tar.gz" "${SOURCE_PATH}"
    cp "${BACKUP_NAME}.tar.gz" "${TARGET_PATH}"
    rm "${BACKUP_NAME}.tar.gz"
    echo "File created and copied."
fi

# 自动删除旧的备份文件
find "${TARGET_PATH}" -type f -mtime +"${KEEP_DAYS}" -delete

# 自动挂载 WebDAV 并将其设置为开机自启动
if ! grep -q "${TARGET_PATH}" /etc/fstab; then
    echo "${TARGET_PATH}  /mnt/webdav  davfs  auto,noatime,uid=$(id -u),gid=$(id -g),file_mode=600,dir_mode=700  0  0" >> /etc/fstab
fi
mount -a
systemctl enable davfs2.service

echo "Backup complete."

关于脚本的说明

  • 使用 Bash 编写,可以在任何 Linux 系统上运行。
  • 支持自动判断是否已有备份文件,没有则根据给定设置进行新建备份文件并压缩。
  • 支持自动删除旧的备份文件。
  • 支持自动挂载 WebDAV 文件夹并将其设置为开机自启动。

需要根据实际情况修改 SOURCE_PATH(备份源文件目录)、TARGET_PATH(备份目标文件目录)、BACKUP_NAME(备份文件名称,不包含后缀)等变量的值。

脚本中的 WebDAV 挂载和设置开机自启动操作,需要安装 davfs2 和 systemd 两个软件包。您可以使用以下命令进行安装(在安装完软件包后,执行脚本时需要使用 root 用户或具有 sudo 权限的用户。):

sudo apt-get update
sudo apt-get install davfs2 systemd

以下是一个符合您需求的脚本:

#!/bin/bash

# 配置备份参数
source_path='/path/to/source'  # 备份源路径
backup_name='backup.tar.gz'   # 备份文件名
backup_path='/path/to/backup' # 备份文件存储路径
remote_path='/mnt/weddav/'     # 远程挂载路径
compress_level=5              # 压缩级别,范围:1-9

# 情况一:已经自动备份好的文件
if [ -f "$backup_path/$backup_name" ]; then
    cp "$backup_path/$backup_name" "$remote_path"
    echo "Backup file copied to remote successfully."
else 
    # 情况二:手动备份
    tar -czvf "$backup_path/$backup_name" --level $compress_level "$source_path"
    cp "$backup_path/$backup_name" "$remote_path"
    echo "Backup created and copied to remote successfully."
fi

# 删除指定天数前的备份文件
find "$backup_path/" -name "*.tar.gz" -mtime +7 -type f -delete
echo "Old backups removed."

# 自动挂载wedav并设置开机自动启动
# 先安装 davfs2(Debian/Ubuntu 系统):sudo apt-get install davfs2
# 编辑 /etc/fstab 文件,添加如下行:
# https://webdav.server.com/path/to/remote /mnt/weddav davfs _netdev,user,rw,uid=<user_id>,gid=<group_id>,noauto 0 0
# 其中:
# - https://webdav.server.com/path/to/remote:远程 wedav 访问路径
# - /mnt/weddav:本地挂载路径
# - uid=<user_id>,gid=<group_id>:设置用户 ID 和组 ID,这里填写需要访问的用户和组的 ID
# 然后运行命令:sudo mount /mnt/weddav
echo "Mounting weddav..."
sudo mount "$remote_path"

# 设置开机自动挂载
# Debian/Ubuntu 系统:
# sudo systemctl enable remote-fs.target
# CentOS/RHEL 系统:
# sudo chkconfig netfs on

该脚本支持两种情况:

  1. 如果备份文件已经存在,则直接复制到远程路径下;
  2. 如果备份文件不存在,则先对指定目录进行压缩备份,并将备份文件复制到远程路径下。

此外,脚本还提供了删除旧备份、自动挂载wedav并设置开机自启动的功能。

如果您不想使用Duplicati这类重量级的备份工具,可以考虑使用rsync或者scp等命令来实现自动备份。但需要注意的是,这些命令可能会占用较多的系统资源,因此在内存较小的服务器上需要慎重使用。

以下内容部分参考ChatGPT模型:


针对第一种情况,可以编写以下脚本:

#!/bin/bash
backup_path="/path/to/backup"  # A机器备份路径
remote_path="/path/to/remote"  # B机器挂载的远程路径

cd $backup_path
for file in *.tar.gz; do
  scp $file user@B:$remote_path
done

以上脚本会将A机器备份路径下所有.tar.gz文件复制到B机器的远程路径下。注意需要将user替换为B机器的用户名。

针对第二种情况,可以编写以下脚本:

#!/bin/bash
backup_path="/path/to/backup"  # 备份目录
remote_path="/path/to/remote"  # B机器挂载的远程路径
backup_file="backup_$(date +%Y%m%d).tar.gz"  # 备份文件名

cd $backup_path
tar -czvf $backup_file files_to_backup  # 将需要备份的文件打包压缩
scp $backup_file user@B:$remote_path  # 将备份文件复制到B机器的远程路径下

rm $backup_file  # 删除本地备份文件

以上脚本将需要备份的文件打包压缩为一个以当前日期命名的备份文件,然后将该备份文件复制到B机器的远程路径下。注意需要将user替换为B机器的用户名,并将files_to_backup替换为需要备份的文件路径。最后删除本地备份文件以释放磁盘空间。


如果我的建议对您有帮助、请点击采纳、祝您生活愉快

以下答案由GPT-3.5大模型与博主波罗歌共同编写:

  1. 自动复制备份文件脚本

以下是自动复制备份文件的脚本示例,其中包括从A机器备份路径下复制文件到B机器路径下,并且实现了自动删除A机器上超过7天的备份文件。

#!/bin/bash

src_dir="/path/to/backup"  # A机器备份路径
dest_dir="/path/to/dest"   # B机器路径
backup_days=7              # 备份文件保留天数

# 检查目标目录是否已经挂载
mount | grep $dest_dir &> /dev/null
if [[ $? -ne 0 ]]; then
    echo "Error: destination directory $dest_dir is not mounted"
    exit 1
fi

# 复制最新的备份文件到目标目录,并删除超过backup_days天的备份文件
find $src_dir -maxdepth 1 -type f -name "*.tar.gz" -mtime -${backup_days} |
    sort -r |
    while read backup_file; do
        cp $backup_file $dest_dir
        echo "Copied backup file $backup_file to $dest_dir"
        rm -f $backup_file
        echo "Deleted backup file $backup_file from $src_dir"
    done

使用方法:

  1. 将脚本复制到A机器上,并修改相关路径和备份文件保留天数。

  2. 将脚本添加到定时任务,例如添加到crontab中每天执行一次。

  3. 手动备份文件到云端脚本

以下是手动备份文件到云端的脚本示例,其中包括压缩备份目标文件夹或文件为.tar.gz格式,并复制到B机器路径下。

#!/bin/bash

src_path="/path/to/src"    # 待备份文件路径
dest_dir="/path/to/dest"   # B机器路径
backup_days=7              # 备份文件保留天数
compress_level=6           # 压缩级别

# 检查目标目录是否已经挂载
mount | grep $dest_dir &> /dev/null
if [[ $? -ne 0 ]]; then
    echo "Error: destination directory $dest_dir is not mounted"
    exit 1
fi

# 确保目录存在
mkdir -p $(dirname $dest_dir)

# 压缩备份文件并复制到目标目录
backup_filename=$(date +%Y-%m-%d_%H-%M-%S).tar.gz
tar czvf - $src_path -${compress_level} > $dest_dir/$backup_filename
echo "Backup file $backup_filename is created in $dest_dir"

# 删除超过backup_days天的备份文件
find $dest_dir -maxdepth 1 -type f -name "*.tar.gz" -mtime +${backup_days} |
    while read backup_file; do
        rm -f $backup_file
        echo "Deleted backup file $backup_file from $dest_dir"
    done

使用方法:

  1. 将脚本复制到A机器上,并修改相关路径、备份文件保留天数和压缩级别。

  2. 执行脚本以手动备份文件到云端。

  3. 自动挂载和开机自启动wevdav方法

您可以使用fstab文件来自动挂载wedav,以及使用systemd服务来开机自启动wevdav。
以下是完成上述两个任务的示例。

  1. 自动挂载wedav

在/etc/fstab文件中添加如下行来自动挂载wedav,其中username和password分别为webdav服务器的账号和密码,ip_address为服务器ip地址,/webdav为挂载目录。

https://username:password@ip_address/webdav /webdav davfs user,rw,noauto 0 0

保存并退出,执行命令mount -a来测试是否挂载成功。

  1. 开机自启动wevdav

创建systemd服务并添加以下内容:

[Unit]
Description=webdav mount
After=network.target

[Service]
Type=forking
ExecStart=/usr/bin/mount /webdav
ExecStop=/usr/bin/umount /webdav
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

保存并退出,执行命令systemctl daemon-reload,并启动服务systemctl start webdav_mount.service来测试是否自启动成功。可以使用systemctl enable webdav_mount.service将服务添加到系统启动项。
如果我的回答解决了您的问题,请采纳!