Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 使用gdrive将文件上载到google驱动器在crontab上不起作用_Linux_Crontab - Fatal编程技术网

Linux 使用gdrive将文件上载到google驱动器在crontab上不起作用

Linux 使用gdrive将文件上载到google驱动器在crontab上不起作用,linux,crontab,Linux,Crontab,我为我的电脑写了备份脚本。备份场景如下所示: 0 3,12 * * * sh /local_share/backup/backup2.0.sh &>> /local_share/backup/backup.sh.log 根目录下的所有目录每天两次(凌晨3点和12点)绑定到tar.gz中,这个归档文件将使用gdrive应用程序上传到谷歌硬盘。每凌晨3点 这是剧本 #!/bin/bash

我为我的电脑写了备份脚本。备份场景如下所示:

0 3,12 * * * sh /local_share/backup/backup2.0.sh &>> /local_share/backup/backup.sh.log
根目录下的所有目录每天两次(凌晨3点和12点)绑定到tar.gz中,这个归档文件将使用gdrive应用程序上传到谷歌硬盘。每凌晨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上运行这个脚本时,除了将tarball上传到googledrive之外,它工作得非常好,尽管手动运行脚本时整个脚本工作得非常好。只有上载进程在crontab上运行时不起作用

有人能帮我吗

Crontab条目如下所示:

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

我有完全相同的问题,但有一些细微的差别。我在CentOS系统上使用gdrive。设置很好。作为root用户,我设置了gdrive。在命令行中,“驱动器列表”工作正常。我使用了以下博客帖子来设置gdrive:

我编写了一个PHP脚本来备份一些目录。当我从命令行以root用户身份运行PHP脚本时,一切正常,并上传到GoogleDrive

所以我扔:

1 1 * * * php /root/my_backup_script.php
进入root的crontab。脚本执行得很好,但上传到谷歌硬盘的操作不正常。我做了一些调试,行:

drive upload --file /root/myfile.bz2
只是不起作用。唯一的命令行返回值是空字符串。非常混乱。我不是unix专家,但我认为当crontab作为用户运行时,它作为用户运行(在本例中为root用户)。为了测试,我做了以下操作,这是非常不安全的,不推荐使用:

我创建了一个根密码为/root/.rootpassword的文件

chmod 500.rootpassword

将crontab行更改为:

1 1 * * * cat /root/.rootpassword | sudo -kS php /root/my_backup_script.php
现在它可以工作了,但这是一个可怕的解决方案,因为根密码存储在系统上的纯文本文件中。该文件只能由root用户读取,但它仍然是一个非常糟糕的解决方案

我不知道为什么(同样,没有unix专家)我必须让root crontab以sudo的方式运行命令才能使其工作。我知道问题出在gdrive设置期间生成的gdrive令牌上。crontab运行时,令牌不匹配,上载失败。但是当您将crontab sudo作为root并运行php脚本时,它就可以工作了

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

0 3,12 * * * sh /local_share/backup/backup2.0.sh &>> /local_share/backup/backup.sh.log
在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,都应该运行备份

最后,编辑根目录的crontab并添加:

1 1 * * * wget http://my-website.com/non-indexable-directory/2DJAj23DAJE123.php >/dev/null 2>&1
理论上,这应该是可行的。不存储任何密码。唯一的安全漏洞是,如果其他人执行了2DJAj23DAJE123.php,他们可能会运行您的备份

可以添加进一步的检查,比如在2DJAj23DAJE123.php开始时检查系统时间,并在执行之前确保它与crontab运行时匹配。如果时间不匹配,只需退出脚本,什么也不做

以上都是理论,没有经过检验。我认为应该行得通,但我对这个问题感到非常厌倦


我希望这是有帮助的,不要过于复杂,但谷歌驱动器是复杂的,因为他们在今年早些时候转换身份验证方法。您在网上找到的许多帖子/博客帖子都不起作用。

我也有同样的问题,并通过指示
驱动器
命令文件的位置进行了修复

例:

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

将命令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 upload--config/home/.gdrive-p/path/to/file\u to\u be\u upload

来源

您正在使用哪个客户端?您是如何安装的。很可能,脚本需要
gdrive
命令的完整路径。我正在使用gdrive,可以在这里下载:非常感谢您真诚的回答!