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

问题描述 投票:0回答:5

我为我的计算机编写了备份脚本。备份场景是这样的:

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
linux cron
5个回答
2
投票

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

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

示例:

不要这样设置 cron

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

使用绝对路径

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

它将完美工作


1
投票
我遇到了完全相同的问题,但存在细微差别。我在 CentOS 系统上使用 gdrive。设置很好。作为 root,我设置了 gdrive。从命令行,“驱动器列表”工作正常。我使用以下博客文章来设置 gdrive:

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就变得很复杂。您在网上找到的许多帖子/博客文章都不起作用。


1
投票
有时出现问题是因为 gdrive 的

config 路径,意味着 gdrive 找不到默认配置,所以为了避免此类问题,我们添加 --config

 标志

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

来源GDrive w/CRON


0
投票
我遇到了同样的问题,并通过指示

drive

 命令文件的位置来修复。 

例如:

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

0
投票
cp /usr/local/bin/gdrive /usr/bin

<~~~ Run this command to fix.

© www.soinside.com 2019 - 2024. All rights reserved.