使用gdrive将文件上传到google-drive无法在crontab上运行

时间:2016-05-24 06:11:32

标签: linux crontab

我为我的电脑编写了备份脚本。备份方案如下:

  

root下的整个目录每天两次(上午3点和上午12点)绑定到tar.gz,此档案将使用gdrive app上传到google-drive。每凌晨3点。

这是脚本

#!/bin/bash                                                                                                                                                                                                          
#Program: arklab backup script version 2.0                                                                                                                                                                           
#Author: namil son                                                                                                                                                                                                   
#Last modified date: 160508                                                                                                                                                                                          
#Contact: 21100352@handong.edu                                                                                                                                                                                       
#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 ball上传到google-drive之外,它的效果非常好,但是在手动运行脚本时,整个脚本运行正常。在crontab上运行时,只有上传过程无效!

有人能帮助我吗?

Crontab条目是这样的:

0 3,12 * * * sh /local_share/backup/backup2.0.sh &>> /local_share/backup/backup.sh.log

4 个答案:

答案 0 :(得分:2)

我有同样的情况。 这是我的解决方案

将命令gdrive更改为绝对路径更改为gdrive命令

示例:

不要像这样设置cron

0 1 * * * gdrive upload abc.tar.gz

使用绝对路径

0 1 * * * /usr/local/bin/gdrive upload abc.tar.gz

它将完美地运作

答案 1 :(得分:1)

我有完全相同的问题,但有细微差别。我在CentOS系统上使用gdrive。安装很好。作为root,我设置了gdrive。从命令行,'驱动器列表'工作得很好。我使用以下博客文章来设置gdrive:

http://linuxnewbieguide.org/?p=1078

我写了一个PHP脚本来备份一些目录。当我从命令行以root身份运行PHP脚本时,一切正常并上传到Google云端硬盘。

所以我扔了:

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 .rootpassword

将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一样随机调用它

现在,无论何时在Web浏览器中提取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 很复杂,因为他们今年早些时候在身份验证方法中进行了切换。您在网上找到的很多帖子/博客文章都无法使用。

答案 2 :(得分:0)

我遇到了同样的问题,并通过指示drive命令文件的位置来修复。

前:

/usr/sbin/drive upload --file xxx..

答案 3 :(得分:0)

有时会由于gdrive的配置路径而发生此问题,这意味着gdrive无法找到默认配置,因此为了避免此类问题,我们添加了--config标志

gdrive upload --config /home/<you>/.gdrive -p <google_drive_folder_id> /path/to/file_to_be_uploaded 

来源GDrive w/ CRON