使用 gdrive 将文件上传到 google-drive 在 crontab 上不起作用

uploading file to google-drive using gdrive is not working on crontab

我为我的电脑写了备份脚本。备份场景是这样的:

Whole directories under root are bound into tar.gz twice a day(3AM, and 12AM), and this archive is going to be uploaded to google-drive using gdrive app. every 3AM.

这是脚本

#!/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 }' $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 上 运行ned 时上传过程不工作!

有人可以帮我吗?

crontab 入口是这样的:

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

我遇到了完全相同的问题,但有细微差别。我在 CentOS 系统上使用 gdrive。设置很好。作为 root,我设置了 gdrive。在命令行中,'drive list' 工作正常。我使用以下博客 post 来设置 gdrive:

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

我写了一个 PHP 脚本来备份一些目录。当我从命令行以 root 身份 运行 PHP 脚本时,一切正常并上传到 Google 驱动器就好了。

所以我扔了:

1 1 * * * php /root/my_backup_script.php

进入 root 的 crontab。脚本执行正常,但无法上传到 Google Drive。我做了一些调试,行:

drive upload --file /root/myfile.bz2

只是没有用。唯一的命令行 return 是空字符串。非常混乱。我不是 unix 专家,但我认为当 crontab 运行s 作为用户时,它 运行s 作为用户(在本例中为 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 运行s 令牌不匹配时,上传失败。但是当你以 root 身份使用 crontab sudo 和 运行 php 脚本时,它就可以工作了。

我想到了一个可能的解决方案,不需要将 root 密码存储在系统的文本文件中。我现在很累,还没有尝试过。我已经在这个问题上工作了大约 4 天,尝试了各种 Google 驱动器备份解决方案……都失败了。它基本上是这样的:

运行 gdrive 设置都在 PHP/Apache 解释器中。这将(可能)将 gdrive 令牌设置为 apache。例如:

在 /home/public_html/gdrive_setup.php 创建一个 PHP 脚本。此文件需要逐步完成整个 gdrive 和令牌设置。

运行 浏览器中的脚本,获取 gdrive 和令牌。

测试 gdrive,编写一个 PHP 脚本,类似于:

$cmd = exec("drive list"); 
echo $cmd;

在浏览器中另存为 gdrive_test.php 和 运行。如果它输出您的 google 驱动器文件,则它正在运行。

在 php 中编写备份脚本。将它放在一个不可索引的 Web 目录中,并将其命名为 运行dom,例如 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 很复杂,因为他们在今年早些时候切换了身份验证方法。您在网上找到的许多 posts/blog post 都行不通。

我遇到了同样的问题,并通过指出 drive 命令文件所在的位置来解决。

例如:

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

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

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

示例:

不要这样设置cron

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

使用绝对路径

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

它将完美运行

有时候这个问题是因为gdrive的配置路径,意味着gdrive找不到默认配置所以为了避免这样的问题我们添加--config标志

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

来源GDrive w/ CRON