如何创建自定义备份脚本?

0 scripts tar

我将创建一个 shell 脚本文件来压缩主目录中的所有文件,但是在我更改权限后 tar 没有运行。

#!/bin/bash
tar -zxvf homefiles.tar.gz /home/
Run Code Online (Sandbox Code Playgroud)

pa4*_*080 9

不清楚:您更改了哪些权限?但我会忽略这条消息:)

通常系统用户在他们自己的主目录之外没有写权限,默认情况下是/home/<user>. 此外,用户 A 无法读取用户 B 的大部分文件。因此,根据您问题中的路径,要备份位于 中的所有文件和目录/home,您应该使用sudo.

此外,您使用了错误的选项 -x相反c- 使用tar --help

tar -cf archive.tar foo bar  # Create archive.tar from files foo and bar.
tar -xf archive.tar          # Extract all files from archive.tar.
Run Code Online (Sandbox Code Playgroud)

所以正确的命令应该是以下命令之一:

sudo tar -zcvf /home/homefiles.tar.gz /home/ --exclude=/home/homefiles.tar.gz # the backup will be created in the directory `/home`
tar -zcvf /home/<user>/homefiles.tar.gz /home/<user> --exclude=/home/<user>/homefiles.tar.gz
Run Code Online (Sandbox Code Playgroud)

这是为您提供的扩展示例:

如何创建自定义备份脚本

让我们假设与/home目录一起还有 Apache 和 MySQL 服务器,我们希望对系统进行更完整的备份。

1.创建一个名为mybackup; 使其可执行;将其定位/usr/local/bin为可在 shell 命令系统范围内访问。创建将存储备份文件的目录:

sudo touch /usr/local/bin/mybackup && sudo chmod +x /usr/local/bin/mybackup
sudo mkdir /var/backup
Run Code Online (Sandbox Code Playgroud)

将以下脚本粘贴为文件内容/usr/local/bin/mybackup并保存:

#!/bin/bash

## Get the current date as variable.
TODAY="$(date +%Y-%m-%d)"

## Delete backup files older than 2 weeks before create the new one.
find /var/backup/ -mtime +14 -type f -delete

## MySQL Section. The first line is if you are using `mysqldump`,
## the next line is for `automysqlbackup`. I'm using both.
mysqldump -u'root' -p'<my-pwd>' --all-databases | gzip > /var/backup/mysql-all-db.sql.gz
automysqlbackup

## Tar Section. Create a backup file, with the current date in its name.
## Add -h to convert the symbolic links into a regular files.
## Backup some system files, also the entire `/home` directory, etc.
## --exclude some directories, for example the the browser's cache, `.bash_history`, etc.
tar zcvf "/var/backup/my-backup-$TODAY.tgz" \
/etc/hosts /etc/sudoers* /var/spool/cron/crontabs /etc/cron* \
/etc/apache2 /etc/letsencrypt /etc/php/7.0/apache2/php.ini \
/etc/phpmyadmin/apache.conf /etc/mysql/debian.cnf \
/etc/ssh/sshd_config* /etc/pam.d/sshd \
/usr/local/bin \
/var/backup/mysql-all-db.sql.gz /var/lib/automysqlbackup/latest/*.sql.gz \
/root \
/home \
/var/www \
--exclude=/home/<some-user>/.composer --exclude=/home/<some-user>/.npm

## MySQL Section - remove the DB backup files, if you want:
#rm /var/lib/automysqlbackup/latest/*.sql.gz
rm /var/backup/mysql-all-db.sql.gz
Run Code Online (Sandbox Code Playgroud)
  • 如果这是一个 VPS,也许您想通过网络浏览器从 Internet 访问您的备份文件。在这种情况下,我们可以加密文件以提高安全性。如果您是 7zip 的粉丝,请在脚本底部添加一些命令:

    rm /var/www/html/the-location/*
    7za a -tzip -p'<my-strong-pwd>' -mem=AES256 "/var/www/html/the-location/my-backup-$TODAY.tgz.7z" "/var/backup/my-backup-$TODAY.tgz"
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果这是一个桌面,您可能希望Downloads为每个用户排除整个目录。您还可以排除所有大于或/并排除某些文件的扩展名的文件

  • 请注意上面使用的所有命令都位于/bin/usr/bin列在$PATHCron的默认值中。如果您打算使用 Cron 作业来自动执行任务,并且您有位于这些目录之外的命令(脚本),则应使用/the/full/path/to/the/script:)

2.要手动创建备份,现在您可以使用以下命令:

sudo mybackup
Run Code Online (Sandbox Code Playgroud)

3.要自动执行任务,您可以crontab通过命令在 root 中添加一个新条目sudo crontab -e。例如,要在每晚 1:15 执行脚本,Cron 作业定义应为:

15 1 * * * /usr/local/bin/mybackup > /var/log/mybackup-cron.log 2>&1
Run Code Online (Sandbox Code Playgroud)
  • 这还将创建/var/log/mybackup-cron.log将包含的日志文件和错误消息(2>&1如果有)。定期阅读日志以确保一切正常。

或者,我更愿意在以下位置创建脚本/etc/cron.daily/

sudo touch /etc/cron.daily/mybackup && sudo chmod +x /etc/cron.daily/mybackup
Run Code Online (Sandbox Code Playgroud)

文件的内容应该是这样的:

#!/bin/sh
test -x /usr/local/bin/mybackup || exit 0
echo -e "*** Log Begin $(date +%Y-%m-%d) ***\n" >> /var/log/mybackup-cron.log
/usr/local/bin/mybackup > /var/log/mybackup-cron.log 2>&1
echo -e "*** Log End $(date +%Y-%m-%d) *** \n" >> /var/log/mybackup-cron.log
Run Code Online (Sandbox Code Playgroud)

更新:

上面的脚本可以在名为Simple Backup Solutions的 GitHub 存储库中找到。