我为我的计算机编写了备份脚本。备份场景是这样的:
root 下的整个目录每天两次(凌晨 3 点和中午 12 点)绑定到 tar.gz 中,并且该存档将使用 gdrive 应用程序上传到 google-drive。每凌晨 3 点。
这是脚本
#!/bin/bash
#Program: arklab backup script version 2.0
#Author: namil son
#Last modified date: 160508
#Contact: [email protected]
#It should be executed as a super user
export LANG=en
MD=`date +%m%d`
TIME=`date +%y%m%d_%a_%H`
filename=`date +%y%m%d_%a_%H`.tar.gz
HOST=$HOSTNAME
backuproot="/local_share/backup/"
backup=`cat $backuproot/backup.conf`
gdriveID="blablabla" #This argument should be manually substituted to google-drive directory ID for each server.
#Start a new backup period at January first and June first.
if [ $MD = '0101' -o $MD = '0601' ]; then
mkdir $backuproot/`date +%y%m`
rm -rf $backuproot/`date --date '1 year ago' +%y%m`
echo $backuproot/`date +%y%m` > $backuproot/backup.conf #Save directory name for this period in backup.conf
backup=`cat $backuproot/backup.conf`
gdrive mkdir -p $gdriveID `date +%y%m` > $backup/dir
awk '{print $2}' $backup/dir > dirID
rm -f $backup/dir
fi
#make tar ball
tar -g $backup/snapshot -czpf $backup/$filename / --exclude=/tmp/* --exclude=/mnt/* --exclude=/media/* --exclude=/proc/* --exclude=/lost+found/* --exclude=/sys/* --exclude=/local_share/backup/* --exclude=/home/* \
--exclude=/share/*
#upload backup file using gdrive under the path written in dirID
if [ `date +%H` = '03' ]; then
gdrive upload -p `cat $backup/dirID` $backup/$filename
gdrive upload -p `cat $backup/dirID` $backup/`date --date '15 hour ago' +%y%m%d_%a_%H`.tar.gz
fi
问题来了!
当在 crontab 上运行此脚本时,除了将 tar 球上传到 google-drive 之外,它运行得很好,尽管在手动运行脚本时整个脚本运行得很好。只有上传过程在crontab上运行时不起作用!
有人可以帮助我吗?
Crontab 条目是这样的:
0 3,12 * * * sh /local_share/backup/backup2.0.sh &>> /local_share/backup/backup.sh.log
我也有同样的情况。 这是我的解决方案
将命令 gdrive 更改为 gdrive 命令的绝对路径
示例:不要这样设置 cron
0 1 * * * gdrive upload abc.tar.gz
使用绝对路径
0 1 * * * /usr/local/bin/gdrive upload abc.tar.gz
它将完美工作
http://linuxnewbieguide.org/?p=1078
我编写了一个 PHP 脚本来备份一些目录。当我从命令行以 root 身份运行 PHP 脚本时,一切正常并上传到 Google Drive。所以我扔了:
1 1 * * * php /root/my_backup_script.php
进入 root 的 crontab。该脚本执行良好,但上传到 Google 云端硬盘无法正常工作。我做了一些调试,行:
drive upload --file /root/myfile.bz2
只是没工作。唯一的命令行返回是空字符串。很混乱。我不是 unix 专家,但我认为当 crontab 作为用户运行时,它会作为用户(在本例中为 root)运行。为了测试,我做了以下操作,这是非常不安全的,不推荐:
我在 /root/.rootpassword 处创建了一个包含 root 密码的文件
chmod 500 .root密码
将 crontab 行更改为:
1 1 * * * cat /root/.rootpassword | sudo -kS php /root/my_backup_script.php
现在它可以工作了,但这是一个可怕的解决方案,因为 root 密码存储在系统上的纯文本文件中。该文件只能由 root 读取,但这仍然是一个非常糟糕的解决方案。
我不知道为什么(再次强调,不是 unix 专家)我必须让 root crontab 以 sudo 的身份运行命令才能完成这项工作。我知道问题出在 gdrive 设置期间生成的 gdrive 令牌。当 crontab 运行时,令牌不匹配,上传失败。但是当你以 root 身份使用 crontab sudo 并运行 php 脚本时,它就可以工作了。
我想到了一种可能的解决方案,不需要将 root 密码存储在系统上的文本文件中。我现在很累,还没有尝试过。我已经研究这个问题大约 4 天了,尝试了各种 Google Drive 备份解决方案......都失败了。基本上是这样的:
在 PHP/Apache 解释器中运行 gdrive 设置。这(可能)会将 gdrive 令牌设置为 apache。例如:
在 /home/public_html/gdrive_setup.php 创建 PHP 脚本。该文件需要逐步完成整个 gdrive 和令牌设置。
在浏览器中运行脚本,设置 gdrive 和令牌。
测试 gdrive,编写一个 PHP 脚本,如下所示:
$cmd = exec("drive list");
echo $cmd;
另存为 gdrive_test.php 并在浏览器中运行。如果它输出您的谷歌驱动器文件,则它正在工作。
用 php 编写备份脚本。将其放在不可索引的 Web 目录中并随机命名为 2DJAj23DAJE123.php
现在,只要您在网络浏览器中打开 2DJAj23DAJE123.php,您的备份就应该运行。
最后,编辑 root 的 crontab 并添加:
1 1 * * * wget http://my-website.com/non-indexable-directory/2DJAj23DAJE123.php >/dev/null 2>&1
理论上这应该可行。不存储密码。唯一的安全漏洞是其他人如果执行 2DJAj23DAJE123.php,则可能能够运行您的备份。
可以添加进一步的检查,例如在执行之前检查 2DJAj23DAJE123.php 开始时的系统时间并确保它与 crontab 运行时间匹配。如果时间不匹配,只需退出脚本而不执行任何操作。
以上均为理论,未经测试。我认为它应该有效,但我对这个问题感到非常疲倦。
我希望这对您有所帮助并且不会过于复杂,但是自从今年早些时候他们切换了身份验证方法以来,Google Drive
IS就变得很复杂。您在网上找到的许多帖子/博客文章都不起作用。
drive
命令文件的位置来修复。例如:
/usr/sbin/drive upload --file xxx..
<~~~ Run this command to fix.