• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Backupscript für nur eine wichtige Textdatei

Hallo, lange nicht mehr hier gewesen...

Ich brauche ein Backupscript für nur eine wichtige Textdatei.
Alle 24 Stunden soll eine Backup (mit einem Timestamp(*)) angelegt werden,
und, falls möglich, soll auch eine E mail an mich gesendet werden... mit dem Verlauf.
Ich dachte an Bash-Script und Cronjobs - aber gibt es vielleicht ein "CLI"tool, das das machen kann - und falls ja, welches?

Werft mich doch mal in die richtige Richtung. :eek:ps:

Grüße

Anmerkung: Hoffentlich in der richtigen Subkategorie geschrieben

(*) Und vielleicht auch mit "Fehlerkorrigierenden Codes"...
 

marce

Guru
Hast Du schon ein anderes Backuptool auf dem System laufen? Wenn ja - würde ich das dafür verhaften.

Ansonsten - für eine einzelne Datei braucht's dann nur eine einzelne Zeile in der crontab - "der Rest" (Mail, Liste, ...) kommt bei passender Systemkonfiguration quasi automatisch mit.
 
marce schrieb:
Wenn ja - würde ich das dafür verhaften.

Wieso denn das? Nein, kein bisheriges Backuptool.

marce schrieb:
für eine einzelne Datei braucht's dann nur eine einzelne Zeile

Ich hätte aber gern ein tool dafür.

marce schrieb:

In der crontab wäre aber ein referenziertes Script besser...

marce schrieb:
"der Rest" (Mail, Liste, ...) kommt bei passender Systemkonfiguration quasi automatisch mit.

Das System ist schon "passend" konfiguriert.

Ich beschreibe nochmal die oben etwas "ungenau" angegebenen funktionalen Anforderungen:

- jede 24 Stunden ein Backup einer Textdatei erstellen
- naming der Textdatei...
- prooving der Textdatei (bei "Bit-/Byte"dreher"" wiederherstellbar)...
- Archivierung der Textdatei...
- Verschlüsselung der Textdatei (AES256(cbc) ausreichend)...
- Protokollierung jedes Vorgangs an meine E mail...

Realisierbar?
 
ichHabMalNeFrage schrieb:
Ich beschreibe nochmal die oben etwas "ungenau" angegebenen funktionalen Anforderungen:

- naming der Textdatei...
- prooving der Textdatei (bei "Bit-/Byte"dreher"" wiederherstellbar)...
Ich verstehe das nicht.
 
In Python (3.x aufwärts) für Windows und über Anpassung des Pfads auch für Linux hab ich mir das so gedacht (noch einige Unschönheiten enthalten):

Code:
from pathlib import Path
from subprocess import call
import sys
import time
import datetime

try:
    # file_name = "wichtige_textdatei.txt"
    file_name = sys.argv[1]
    file_name_2 = file_name[:-4]
    file_for_back = Path(file_name)
    if file_for_back.is_file():
        time_se = int(time.time())
        time_day = datetime.datetime.fromtimestamp(time_se).day
        time_hour = datetime.datetime.fromtimestamp(time_se).hour
        file_name_3 = "{:s}-{:011d}-{:02d}-{:02d}.7z".format(
            file_name_2, time_se, time_day, time_hour)
        call(["C:\\Program Files\\7-Zip\\7z.exe", "a", r"-p\{12345\}", file_name_3, file_name])
        print("Suc:", Path(file_name_3))
    else:
        print("Failure:", "File does not seem to exist")
except:
    print("An error:", sys.exc_info()[0])

Dabei ist das mailing noch weggelassen.


Gräfin Klara schrieb:
Ich verstehe das nicht.

naming = sinnvolle Backupdateinamen
prooving = wenn man in der Textdatei bspw ein Zeichen ändert, dann soll das mithilfe einer check sum wiederrückgängig gemacht werden können

Nun ist eine Zeichenänderung mind eine Byteänderung, deswegen befürchte ich da :eek:ps:
 

uhelp

Member
Ich denke, du machst einige Denkfehler.

Wenn du eine Datei kopierst, und der Kopierjob erfolgreich verläuft, IST schon sichergestellt, dass die Dateien identisch (von Inhalt her) sind. (von Hardwareprobleme abgesehen)

Wenn du eine Datei per Script verschlüsseln willst, so muss das Passwort irgendwie verfügbar sein.
Das ist vorsätzliche Unsicherheit.

Wenn du aus einer Konsole Mails verschicken willst, so kann das JEDES Linuxdistri von Haus aus.
Aber meist sind nur lokale Mails zugelassen, da jeder anständige Mailprovider solche Mails ablehnen wird.
Du müsstest also einen __wirklich__ __richtigen__ Mailaccount dafür verwenden.
Also kennt dein BackupScript schon ZWEI Spasswörter.
Das ist doppelt vorsätzliche Unsicherheit.

Wenn du zwei Dateien auf Gleichheit prüfen willst, so hat jede Distri die folgenden Programme parat: sha1sum, sha224sum, sha256sum, sha384sum, sha512sum, md5sum.
Und alle diese Programme können nicht nur die entsprechende Prüfsumme bilden, sondern auch direkt vergleichen.
Das wäre also in einem Shellscript grade mal ein Einzeiler, der nebenbei noch den gewüschten Dateinamen bilden kann.
Sowas, wie
Code:
dummCommand --ganzarg meinNeuerDateiName_$(date +"%Y-%m-%d_%H:%M)

Natürlich kannst du ein solches Script auch sicher schreiben.
Dazu musst du dann aber irgendeine Form von sicherem Spasswortspeicher basteln/installieren.
Es gibt einige Programme, die effektiv verschlüsseln.
Aber der Aufwand ist insgesamt für eine wichtige Textdatei viel zu groß.

Weshalb eine ordentliche Backuplösung zu bevorzugen ist.
borgbackup könnte das alles in einem Rutsch. Lediglich ein systemd.timer muss dafür noch gebastelt werden.
Dann wird das Ding via SSH mit Key transportiert, vollständig dedupliziert, und du kannst den Backup JEDEN Tages einfach mounten.
Die Archive sind spasswortgeschützt und verschlüsselt.

Es gibt aber auch unzählig andere Backuplösungen, die das auch alles bieten. (die Deduplizierung von borg erreichen sie jedoch nicht).
 
ichHabMalNeFrage schrieb:
In Python (3.x aufwärts) für Windows und über Anpassung des Pfads auch für Linux hab ich mir das so gedacht (noch einige Unschönheiten enthalten):
Das ist hässlich!
Schreib dein script in bash, 10-15 Zeilen sollten genügen

ichHabMalNeFrage schrieb:
naming = sinnvolle Backupdateinamen
prooving = wenn man in der Textdatei bspw ein Zeichen ändert, dann soll das mithilfe einer check sum wiederrückgängig gemacht werden können
Nun ist eine Zeichenänderung mind eine Byteänderung, deswegen befürchte ich da :eek:ps:
Dein "prooving" funktioniert so nicht und du brauchst es auch nicht.

Wie eine Frau das machen würde:

1. Diese heikle Datei in die Backupumgebung kopieren und die Kopie prüfen. Das ist eine simple Scriptzeile.
2. Kopierte Datei verschlüsseln.
Das ist ein wenig komplizierter, weil du mit einem öffentlichen Schlüssel arbeiten mußt und du diesen Vorgang auch verstehen sollst,
sonst kannst du die Datei nicht mehr entschlüsseln.
3. Aus dieser verschlüsselten Datei eine komprimierte Datei erstellen und gleichzeitig diesem Archive einen Namen geben, z.B 2018-05-07_irgendwas.bz2
Ist auch nur ein Einzeiler.
4. Mail absetzen mit Betreff und einer schönen Statusmeldung. Ist unter Linux keine Hexerei.
5. Dieses script als job in deinen cron einbauen. Ist nicht schwierig,
Fertig

Entspricht das deinen Anforderungen?
 
Mir ist noch etwas eingefallen...

NUR wenn der Änderungszeitpunkt der Textdatei größer gleich AktuelleZeitInSekunden - 60*60*1Sekunden ist, soll ein Backup erstellt werden... Also... nur wenn die Textdatei nicht älter als eine Stunde ist, denn dann/sonst wurde bereits ein Backup erstellt - und ein neues muss nicht erstellt werden. :irre:

Wetten dass das in der Bash nicht so ohne Weiteres möglich ist? :p


uhelp schrieb:
Ich denke, du machst einige Denkfehler.

Ich würd das nicht nach ein paar Beiträgen beurteilen wollen, ob ich einen Schaden habe. :roll:
 

marce

Guru
ichHabMalNeFrage schrieb:
Wetten dass das in der Bash nicht so ohne Weiteres möglich ist? :p
Wette verloren.


ichHabMalNeFrage schrieb:
uhelp schrieb:
Ich denke, du machst einige Denkfehler.
Ich würd das nicht nach ein paar Beiträgen beurteilen wollen, ob ich einen Schaden habe. :roll:
Von "Schaden haben" hat keiner geredet.

Dein Konzept klingt trotzdem nicht ausgereift, durchdacht - kann aber dran liegen, daß wir nicht alle Infos haben, die notwendig sind.

So oder so - alles was Du willst ist technisch problemlos umsetzbar. Manches davon klingt für mich nach "warum auch immer" oder "falscher Ansatz" - aber das musst Du für Dich wissen.
 

abgdf

Guru
marce schrieb:
ichHabMalNeFrage schrieb:
Wetten dass das in der Bash nicht so ohne Weiteres möglich ist? :p
Wette verloren.
Jo:
Code:
#!/bin/bash
filename="myfile.txt"
nowsecs=$(date +%s)
filesecs=$(stat -c "%Y" $filename)
diffsecs=$(expr $nowsecs - $filesecs)
onehour=3600
if test $diffsecs -gt $onehour
then
    echo "'$filename' is older than one hour."
else
    echo "'$filename' is not older than one hour."
fi
Aber Python ist schon ok. Macht Vieles einfacher als in bash. Aber bitte Version 2.7, und nicht so'n 3.x-Kram.
 
A

Anonymous

Gast
abgdf schrieb:
Aber Python ist schon ok. Macht Vieles einfacher als in bash. Aber bitte Version 2.7, und nicht so'n 3.x-Kram.
Wenn es einfacher ist sich mit Programmiersprachen rumzuschlagen die sich überhaupt keine Mühe mehr geben mit sich selbst kompatibel zu sein. ;)

Aber auch mit der Bash muss man nicht so rumeiern, und mit stat die Zeiten aus der Datei holen mit der von date vergleichen und das dann noch in eine if Verzeigung packen. geht's noch, dafür gibt es solche Hammerbefehle wie find, die machen das nebenbei alles in einem Aufruf.
Code:
find "$MY_PATH" -mmin +60 -name "$FILE_NAME" -exec scp {}  ${B_PATH}/${FILE_NAME%.txt}.$(date +"%Y-%m-%d_%H:%M")   \;
Ich würde ja auch gerne noch Komprimierung, Signierung der Datei inclusive seiner Checksumme mit einem x509 Certifikat und eventuell noch weitere Sicherheitsmerkmale und Zugriffsbeschränkungen in weiteren Script-Zeilen einbauen, aber eines versehe ich hier überhaupt nicht, deshalb lasse ich das mal.

Wieso benötigte ich denn für eine Datei die sich ständig (oder zumindest ab und zu mal) ändert, die ohne irgendwelche Hindernisse jederzeit problemlos auszulesen zu sein scheint( eventuell sogar von jedermann), ein verschlüsseltes Hochsicherheits-Backup bei dem jegliches schief-anschauen mit protokolliert wird, und das Alles dann auch noch auf dem selben Rechner? Das ist doch als wenn man täglich das Geld das auf dem Tisch liegend fotografiert, und dann die Fotos anschließen im Safe aufbewahrt, das Geld aber immer auf dem Tisch liegen bleibt. :???:

robi
 

abgdf

Guru
robi schrieb:
Aber auch mit der Bash muss man nicht so rumeiern, und mit stat die Zeiten aus der Datei holen mit der von date vergleichen und das dann noch in eine if Verzeigung packen. geht's noch, dafür gibt es solche Hammerbefehle wie find, die machen das nebenbei alles in einem Aufruf.
Wohl wahr, ich bin halt nicht so der bash-Freund oder -Experte, der jede noch so versteckte Option von "find" kennt.

Aber letztlich ist insgesamt auch ähnlicher C-Code in "find". Ob man solchen Code nun in einem Befehl aufruft oder ähnlichen Code aus mehreren Befehlen zusammenstöpselt, ist letztlich auch kein großer Unterschied. Sofern es nicht auf Performance ankommt.
Mir macht es auch nichts aus, ein paar Zeilen mehr zu schreiben, ich muß nicht alles in eine Zeile packen.
"Explicit is better than implicit" ist ein Grundsatz in Python, "terse syntax" ist nicht so gefragt, da später auch schwerer zu warten. Erinnert man sich in 6 Monaten noch, was diese find-Zeile mit den vielen Optionen macht? Am Ende müßte man dann 'eh einen Kommentar dazuschreiben, was sie eigentlich tut.
Ich würde den Code auch gern in einer Funktion "checkFileAge()" oder so kapseln.
 

LarsBcz

Newbie
abgdf schrieb:
marce schrieb:
ichHabMalNeFrage schrieb:
Wetten dass das in der Bash nicht so ohne Weiteres möglich ist? :p
Wette verloren.
Jo:
Code:
#!/bin/bash
filename="myfile.txt"
nowsecs=$(date +%s)
filesecs=$(stat -c "%Y" $filename)
diffsecs=$(expr $nowsecs - $filesecs)
onehour=3600
if test $diffsecs -gt $onehour
then
    echo "'$filename' is older than one hour."
else
    echo "'$filename' is not older than one hour."
fi
Aber Python ist schon ok. Macht Vieles einfacher als in bash. Aber bitte Version 2.7, und nicht so'n 3.x-Kram.

Das war ja elegant :D
 
Oben