2016-05-24 6 views
2

Ich schrieb Backup-Skript für meinen Computer. Das Backup-Szenario ist wie folgt:Hochladen von Datei auf Google-Laufwerk mit Gdrive funktioniert nicht auf Crontab

ganze Verzeichnisse im Root-Verzeichnis in tar.gz gebunden sind zweimal täglich (03.00 und 00.00), und das Archiv wird hochgeladen werden GDrive App google-Laufwerk. jeden 3.00 Uhr.

und hier ist das Skript

#!/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 

Hier ist das Problem!

Wenn Sie dieses Skript auf Crontab ausführen, funktioniert es ziemlich gut, außer das Hochladen von Teerball auf Google-Laufwerk, obwohl das ganze Skript perfekt funktioniert, wenn Sie das Skript manuell ausführen. Nur der Upload-Prozess funktioniert nicht, wenn es auf Crontab läuft!

Kann mir jemand helfen?

Crontab Eintrag ist wie folgt:

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

Welchen Client benutzen Sie? Und wie hast du es installiert? – khrm

+0

Höchstwahrscheinlich benötigt das Skript den vollständigen Pfad für den Befehl 'gdrive'. – fedorqui

+0

Ich benutze gdrive, das hier heruntergeladen werden kann: [github] (https://github.com/prasmussen/gdrive) –

Antwort

1

Ich hatte genau das gleiche Problem mit kleinen Unterschieden. Ich verwende Gdrive auf einem CentOS-System. Setup war in Ordnung. Als root habe ich gdrive eingerichtet. Über die Befehlszeile funktionierte "Laufwerksliste" einwandfrei. Ich benutzen die folgende Blog-Post einzurichten GDrive:

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

ich einen PHP-Skript schrieb eine Sicherung einiger Verzeichnisse zu tun. Wenn ich das PHP-Skript als root über die Befehlszeile ausführte, funktionierte und funktionierte alles in Google Drive. So

Ich warf:

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

In root crontab. Das Skript wurde ordnungsgemäß ausgeführt, aber das Hochladen auf Google Drive funktionierte nicht. Ich habe ein Debugging, die Zeile:

drive upload --file /root/myfile.bz2 

Gerade funktionierte nicht. Die einzige Rückgabe der Befehlszeile war eine Nullzeichenfolge. Sehr verwirrend. Ich bin kein Unix-Experte, aber ich dachte, wenn Crontab als Benutzer ausgeführt wird, wird es als Benutzer ausgeführt (in diesem Fall root). Um zu testen, habe ich die folgenden, und das ist sehr unsicher und nicht zu empfehlen:

ich /root/.rootpassword

chmod 500 .rootpassword

Changed die crontab eine Datei mit dem Root-Passwort erstellt Zeile:

1 1 * * * cat /root/.rootpassword | sudo -kS php /root/my_backup_script.php 

Und jetzt ist es funktioniert, aber das ist eine schreckliche Lösung, da das root-Passwort in einer Textdatei auf dem System gespeichert ist. Die Datei ist nur von root lesbar, aber es ist immer noch eine sehr schlechte Lösung.

Ich weiß nicht warum (wieder, kein Unix-Experte) Ich muss root crontab einen Befehl als sudo ausführen, um diese Arbeit zu machen. Ich weiß, dass das Problem mit dem gdrive-Token auftritt, das während des gdrive-Setups generiert wurde. Wenn crontab ausgeführt wird, stimmt das Token nicht überein und der Upload schlägt fehl. Aber wenn Sie Crontab Sudo als root haben und das PHP-Skript ausführen, funktioniert es.

Ich habe über eine mögliche Lösung nachgedacht, die das root-Passwort in einer Textdatei auf dem System nicht speichern muss. Ich bin jetzt müde und habe es nicht versucht. Ich habe ungefähr vier Tage an diesem Problem gearbeitet und verschiedene Google Drive-Backup-Lösungen ausprobiert. Es geht im Grunde so:

Führen Sie das Gdrive Setup alle innerhalb der PHP/Apache-Interpreter. Dies wird (vielleicht) das Gdrive-Token auf Apache setzen. Beispiel:

Erstellen Sie ein PHP-Skript unter /home/public_html/gdrive_setup.php. Diese Datei muss das gesamte gdrive- und Token-Setup durchlaufen.

Führen Sie das Skript in einem Browser, Get Grive und das Token alle eingerichtet.

-Test GDrive, schreiben Sie ein PHP-Skript so etwas wie:

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

Speicher als gdrive_test.php und in einem Browser ausgeführt werden. Wenn es Ihre Google Drive-Dateien ausgibt, funktioniert es.

Schreiben Sie Ihr Backup-Skript in PHP. Legen Sie es in ein nicht-indexierbaren Web-Verzeichnis und nennen Sie es etwas zufällig wie 2DJAj23DAJE123.php

Jetzt, wann immer Sie 2DJAj23DAJE123.php in einem Webbrowser ziehen, sollte Ihr Backup laufen.

Schließlich bearbeiten crontab für root und fügen:

1 1 * * * wget http://my-website.com/non-indexable-directory/2DJAj23DAJE123.php >/dev/null 2>&1 

In der Theorie sollte diese Arbeit. Es sind keine Passwörter gespeichert. Die einzige Sicherheitslücke ist, dass jemand anders Ihre Sicherung ausführen kann, wenn sie 2DJAj23DAJE123.php ausgeführt haben.

Weitere Überprüfungen können hinzugefügt werden, wie die Überprüfung der Systemzeit zu Beginn von 2DJAj23DAJE123.php und sicherstellen, dass sie mit der Crontab-Laufzeit übereinstimmt, bevor sie ausgeführt wird. Wenn die Zeiten nicht übereinstimmen, einfach das Skript beenden und nichts tun.

Das obige ist alles Theorie und nicht getestet. Ich denke, es sollte funktionieren, aber ich bin sehr müde von diesem Problem.

Ich hoffe, das war hilfreich und nicht übermäßig kompliziert, aber Google Drive IS kompliziert seit ihrer Umstellung in Authentifizierungsmethode früher in diesem Jahr. Viele der Posts/Blogposts, die Sie online finden, werden einfach nicht funktionieren.

+0

Vielen Dank für Ihre aufrichtige Antwort! –

0

Ich hatte das gleiche Problem und behoben, indem Sie angeben, wo die drive Befehlsdatei ist.

Ex:

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

Ich habe denselben Fall. Dies ist meine Lösung

Ihren Befehl GDrive zu

GDrive Befehl absoluten Pfad ändern

Beispiel:

nicht gesetzt cron wie dieser Pfad absolut

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

Verwenden

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

Es funktioniert einwandfrei

+0

Danke, das hat funktioniert! –

Verwandte Themen