Freitag, 3. September 2010, 01:46 UTC+2

Sie sind nicht angemeldet.

  • Anmelden
  • Registrieren

Apensiv

Profi

Beiträge: 947

Distribution: Andere

Version: 5.0

Architektur: 32-Bit PC

Desktop: GNOME

Andere Distribution: Debian

1

Donnerstag, 1. November 2007, 01:08

Perl: Einfaches Backupskript

Moin Community,

habe mal wieder ein wenig gebastelt :)
Rausgekommen ist ein ziemlich kleines
und auch noch unfertiges Backupskript.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/perl
# backup.pl -- by Apensiv

use POSIX qw/strftime/;
use File::Copy;

$backup_medium = '/media/R2-D2';
$date = strftime "%d.%m.%Y", localtime;

mkdir ("$backup_medium/backup");
copy('/etc/apt/sources.list', "$backup_medium/backup/");
copy('/etc/X11/xorg.conf', "$backup_medium/backup/");
copy('/etc/fstab', "$backup_medium/backup/");
copy('/etc/samba/smb.conf', "$backup_medium/backup/");
copy('/home/apensiv/.mozilla/firefox/7x14efmv.default/bookmarks.html', "$backup_medium/backup/");
system("tar --remove-files -C $backup_medium -cvf $backup_medium/backup_$date.tar backup");
print "Done\n";


Dieses Skript speichert folgenden Dateien in einem tar-Archiv:

-sources.list
-xorg.conf
-fstab
-smb.conf
und die jeweiligen Favoriten des Firefox-Browsers.

Wenn jemand dieses Skript nutzen möchte,
muss er aber vorher den Pfad zu der bookmarks.html
und den Pfad zu dem Backupmedium für
sich angeben.

mfg

localhope

uıɹoʇɐɹǝpoɯ-ex

Beiträge: 1 343

Wohnort: Hamburg | Hildesheim

Distribution: Ubuntu

Version: 8.04

Architektur: 32-Bit PC

Desktop: GNOME

Andere Distribution: Gentoo 2008

2

Donnerstag, 1. November 2007, 10:17

Hallo Apensiv,

find ich gut. Man kann sich das Skript ja auch noch anpassen, eben für das, was man sichern möchte. Ist auf jedenfall ein nützliches kleines Tool. :)

Zudem muss man eh die Pfade für sich anpassen. Außer, man nennt sich auch Apensiv ;)

Zitat

copy('/home/apensiv/.mozilla/firefox/7x14efmv.default/bookmarks.html', "$backup_medium/backup/");


Als Ergänzung schlage ich noch die Sicherung des /home-Verzeichnisses vor.
Admin-Ausrede # 4465: secretary plugged hairdryer into UPS

Beiträge: 719

Wohnort: Berlin

Distribution: Ubuntu

Version: 8.04

Architektur: 32-Bit PC

Desktop: GNOME

3

Donnerstag, 1. November 2007, 11:18

gibt es eine systemvariable, die den aktuellen benutzernamen des eingeloggten users speichert? die könnteste ja an den entscheidenden stellen ins skript eintragen, dann braucht der arme user das nicht selbst zu ändern! :D


phil
Arbeitskiste: CPU: Athlon 64 X2 3800+ | Board: Abit AN8 SLI | GPU: Radeon X850XT | RAM: 1024 MB MDT PC3200 | HDD: 300 GB Samsung SATAII | Sound: Audigy 2 ZS | OS: Linux Mint 5.0 "Elyssa" & Ubuntu 8.04 "Hardy Heron"

Mobiler Kollege (Acer Extensa 5620): CPU: Intel Core 2 Duo T5250 | GPU: Radeon 2400XT | RAM: 2048 MB PC3200 | HDD: 160 GB | OS: Linux Mint 5.0 "Elyssa" & Windows Vista


Michael1306

Fortgeschrittener

Beiträge: 446

Wohnort: Bietigheim-Bissingen

Distribution: Andere

Version: WIN 7 x64

Architektur: 64-Bit PC

Desktop: GNOME

4

Donnerstag, 1. November 2007, 11:27

Hallo,

prima Idee.
Ich hätte da noch einen Zusatz.

Wenn man mal genötigt ist sein Ubuntu neu aufzusetzen, hab ich immer das Problem, dass ich nicht weiss was ich alles installiert hatte. Nach einigen Recherchen bin ich auf folgendes gestossen, was man meines Erachtens nach, auch mit in den Backup-Prozess nehmen sollte/könnte.

Auflistung aller installierten Pakete (das könnte noch mit ins Backup-Script):

Quellcode

1
dpkg --get-selections | grep -v deinstall > ubuntu-files


Folgendes ist wissenwert zum wiederherstellen:
Im Falle eines Falles, wenn man Ubuntu neu installieren musste kann man dann mit dem File ubuntu-files wieder schnell alles installieren:

Quellcode

1
2
3
4
5
6
7
sudo apt-get update
sudo apt-get dist-upgrade
dpkg --set-selections < ubuntu-files

sudo dselect

Nach Start von dselect  "I" druecken, nach Installation aller Pakete mit "Q" oder "B" (je nach Sprachversion) beenden.


So das war's.
Ich hab die Sicherung um die Auflistung der installierten Pakete bei mir ergänzt.
Danke Apensiv, dass du den Anfang gemacht hast.
Michael

Das Problem bei allen Betriebssystemen sitzt zwischen der Tastatur und dem Stuhl :D

This post was scanned by the German BKA and there was no suspicious activity found

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Michael1306« (1. November 2007, 11:39)


Beiträge: 99

Wohnort: Hannover

Distribution: Ubuntu

Version: 10.04

Architektur: 32-Bit PC

Desktop: GNOME

Andere Distribution: Debian Etch (Server), yaVDR 0.2.0

5

Donnerstag, 1. November 2007, 11:44

Zitat

Original von just_phil
gibt es eine systemvariable, die den aktuellen benutzernamen des eingeloggten users speichert? die könnteste ja an den entscheidenden stellen ins skript eintragen, dann braucht der arme user das nicht selbst zu ändern! :D

Jepp, gibt es.

HOME gibt das Homeverzeichnis des angmeldeten Benutzers aus. Das würde ich eher nehmen. Dann ist Sichergestellt, dass auch das richtige Verzeichnis genommen wird.

Bye Michael
Registered VDR User #1525
Registered Linux User #228306
________________________________
Die drei Todfeinde des Programmierers:
Sonnenlicht, frische Luft und das unerträgliche Gebrüll der Vögel.

Apensiv

Profi

Beiträge: 947

Distribution: Andere

Version: 5.0

Architektur: 32-Bit PC

Desktop: GNOME

Andere Distribution: Debian

6

Donnerstag, 1. November 2007, 19:25

Hoi,

erstmal danke für die ganzen Kommentare.
Aber was soll denn HOME für ein Befehl sein?
(Habe ihn schon als Perl und Bash-Befehl ausprobiert)

Zitat

HOME gibt das Homeverzeichnis des angmeldeten Benutzers aus. Das würde ich eher nehmen. Dann ist Sichergestellt, dass auch das richtige Verzeichnis genommen wird.


@Michael1306 : Die Idee mit den installierten Programmen ist wirklich gut :)

mfg

Beiträge: 99

Wohnort: Hannover

Distribution: Ubuntu

Version: 10.04

Architektur: 32-Bit PC

Desktop: GNOME

Andere Distribution: Debian Etch (Server), yaVDR 0.2.0

7

Donnerstag, 1. November 2007, 19:34

HOME ist kein Befehl, sondern eine Umgebungsvariabel, die mit einem echo $HOME auf der Konsole ausgelesen werden kann. Also lässt sich diese Variabel auch in jedem Shellscript verwenden.

Bye Michael
Registered VDR User #1525
Registered Linux User #228306
________________________________
Die drei Todfeinde des Programmierers:
Sonnenlicht, frische Luft und das unerträgliche Gebrüll der Vögel.

Apensiv

Profi

Beiträge: 947

Distribution: Andere

Version: 5.0

Architektur: 32-Bit PC

Desktop: GNOME

Andere Distribution: Debian

8

Donnerstag, 1. November 2007, 19:44

Ok, die $HOME-Variable funktionierte unter Bash gut.
Für Perl habe ich diesen Befehl nachgeschlagen:

Quellcode

1
print $ENV{'HOME'};


So gleich folgt ein Backup-Skript Update :)

mfg

Edit:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/perl
# backup.pl -- by Apensiv

use POSIX qw/strftime/;
use File::Copy;

$home = $ENV{'HOME'} . "/.mozilla/firefox/7x14efmv.default/bookmarks.html";
$backup_medium = '/media/R2-D2';
$date = strftime "%d.%m.%Y", localtime;

mkdir ("$backup_medium/backup");
system("dpkg --get-selections | grep -v deinstall > $backup_medium/backup/ubuntu-files");
copy('/etc/apt/sources.list', "$backup_medium/backup/");
copy('/etc/X11/xorg.conf', "$backup_medium/backup/");
copy('/etc/fstab', "$backup_medium/backup/");
copy('/etc/samba/smb.conf', "$backup_medium/backup/");
copy($home, "$backup_medium/backup/");

system("tar --remove-files -C $backup_medium -cvf $backup_medium/backup_$date.tar backup");
print "Done\n";


So nun wird die Datei ubuntu-files mitkopiert und
das Home-Verzeichnis wird automatisch ausgelesen.

Weitere Verbesserungsvorschläge bitte :)

mfg

Beiträge: 719

Wohnort: Berlin

Distribution: Ubuntu

Version: 8.04

Architektur: 32-Bit PC

Desktop: GNOME

9

Donnerstag, 1. November 2007, 21:43

Zitat

Original von Apensiv
Ok, die $HOME-Variable funktionierte unter Bash gut.
Für Perl habe ich diesen Befehl nachgeschlagen:

Quellcode

1
print $ENV{'HOME'};



jepp, genau das war meine intention! mir gefällt der verlauf dieses threads übrigens sehr gut, selten so viel konstruktives in einem beitrag gesehen. und natürlich nochmal danke an apensiv für die initialzündung sowie das engagement.


phil
Arbeitskiste: CPU: Athlon 64 X2 3800+ | Board: Abit AN8 SLI | GPU: Radeon X850XT | RAM: 1024 MB MDT PC3200 | HDD: 300 GB Samsung SATAII | Sound: Audigy 2 ZS | OS: Linux Mint 5.0 "Elyssa" & Ubuntu 8.04 "Hardy Heron"

Mobiler Kollege (Acer Extensa 5620): CPU: Intel Core 2 Duo T5250 | GPU: Radeon 2400XT | RAM: 2048 MB PC3200 | HDD: 160 GB | OS: Linux Mint 5.0 "Elyssa" & Windows Vista


Apensiv

Profi

Beiträge: 947

Distribution: Andere

Version: 5.0

Architektur: 32-Bit PC

Desktop: GNOME

Andere Distribution: Debian

10

Freitag, 2. November 2007, 20:17

So ein wenig weitergemacht, nun kontrolliert er auch ob das Backup erstellt
wurde und ob der Pfad zum Backup-Medium stimmt.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/usr/bin/perl
# backup.pl -- by Apensiv

use POSIX qw/strftime/;
use File::Copy;

my @log;
$home = $ENV{'HOME'} . "/.mozilla/firefox/7x14efmv.default/bookmarks.html";
$backup_medium = '/media/APENSIV';
$date = strftime "%d.%m.%Y", localtime;

if (-e "$backup_medium") {

mkdir ("$backup_medium/backup");
system("dpkg --get-selections | grep -v deinstall > $backup_medium/backup/ubuntu-files");
copy('/etc/apt/sources.list', "$backup_medium/backup/");
copy('/etc/X11/xorg.conf', "$backup_medium/backup/");
copy('/etc/fstab', "$backup_medium/backup/");
copy('/etc/samba/smb.conf', "$backup_medium/backup/");
copy($home, "$backup_medium/backup/");
system("tar --remove-files -C $backup_medium -cvf $backup_medium/backup_$date.tar backup");

if (-e "$backup_medium/backup_$date.tar"){
	print "Backup erfolgreich erstellt\n";}
else{
	print "ERROR: Es konnte kein Backup erstellt werden\n";}}
else{
	print "Backupmedium konnte nicht gefunden werden\n";}


mfg

localhope

uıɹoʇɐɹǝpoɯ-ex

Beiträge: 1 343

Wohnort: Hamburg | Hildesheim

Distribution: Ubuntu

Version: 8.04

Architektur: 32-Bit PC

Desktop: GNOME

Andere Distribution: Gentoo 2008

11

Freitag, 2. November 2007, 23:23

Sehr gut, könnte ich ja fast für unsere Server anwenden. Das jetzige Prog ist Müll :rolleyes Allerdings müsste es dann deutlich erweitert werden.

Ich finds klasse! Good Job!
Admin-Ausrede # 4465: secretary plugged hairdryer into UPS

12

Sonntag, 4. November 2007, 19:15

Mal ne ganz dumme Frage, wieso macht man das als Perl-Script? Das lässt sich doch auch ganz simpel für #!/bin/bash schreiben...

Apensiv

Profi

Beiträge: 947

Distribution: Andere

Version: 5.0

Architektur: 32-Bit PC

Desktop: GNOME

Andere Distribution: Debian

13

Sonntag, 4. November 2007, 19:32

Moin cfchris6,

Ich habe es in Perl geschrieben, weil ich gerade Perl lerne
und dies eine gute Übung für mich ist.

Ob es nun in Perl oder in Bash besser zu realisieren ist,
ist eine ganz andere Philosophie, bei der du auf
verschiedene Meinungen treffen wirst.

Ich jedenfalls setze auf die Stärken von Perl bei diesen
Operationen, die eine sehr schnelle durchführung und eine
beinahe umfassende Portierbarkeit erlauben.

mfg

14

Sonntag, 4. November 2007, 22:34

Achso, ok. Weil eigentlich machst du ja in dem Script nicht viel, außer Dateien zu kopieren und normale Shell Befehle auszuführen, das ginge sicherlich mit bash auch, ich kanns ja bei Gelegenheit mal dafür um schreiben, da übe ich auch gleich mal meine Bash-Scripting Fähigkeiten ;)

15

Mittwoch, 7. November 2007, 06:57

hallo zusammen,

ich bin hier aus Zufall auf den Thread gestoßen und hab mich direkt inspirieren lassen auch mal ein bisschen Perl/Bash auszuprobieren, würd mich über konstruktive Kritik freuen:

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#!/usr/bin/perl -w
# backup.pl -- inspired by Apensiv
#           -- by zero77

use strict;

# eingebundene module
use POSIX qw/strftime/; # uhrzeit
#use File::Copy; # betriebssystemunabhaengige file-copy-funktion

my $home $ENV{'HOME'};
my $backup_medium='/mnt/files/backup';
my $date=strftime "%d_%m_%Y"localtime;
my $progress=0; 

if (-"/dev/disk/by-uuid/41f9f791-bae0-4ae9-9531-922714a9ec8e") { # platte angeschlossen?
    
    if (!-"$backup_medium") { # platte gemountet?
        my $mount=system("mount /mnt/files");
    
        if ($mount==0) { # wenn nicht, mounten
            print "Externe USB - Platte gemountet\n";
        }    
    }
    
    print "1) Backup updaten - erstellt komplettes Backup oder bringt Backup up2date\n";
    print "2) Tagesstand sichern - erstellt komplettes Backup mit Zeitstempel\n";
    print "Bitte wählen: ";
    my $method=<STDIN>;
    chomp $method;
    
    while ($method ne "1" and $method ne "2") {
        print "Bitte wählen (1 oder 2): ";
        $method=<STDIN>;
        chomp $method;
    }
    
    if ($method eq "1") {
        $progress=1;
    }
    else {    
        
        $backup_medium=$backup_medium "/" $date;
        print "ttt: $backup_medium\n";
        if (!-"$backup_medium") { # existiert aktuelles verzeichnis
            system("mkdir $backup_medium");
            $progress=1;
        }
        else {
            print ("\nVerzeichnis mit aktuellem Datum $date vorhanden\n");
            print ("Backup fortsetzen? (ja/nein): ");
            my $eingabe=<STDIN>;
            chomp $eingabe;
            
            while ($eingabe ne "ja" and $eingabe ne "nein") {
                print "ja oder nein: ";
                $eingabe=<STDIN>;
                chomp $eingabe;
            }
            
            if ($eingabe eq "ja") { # update oder ueberschreiben
                print ("Update des Backups oder Verzeichnis neu? (upd/neu): ");
                my $update=<STDIN>;
                chomp $update;
                    
                while ($update ne "upd" and $update ne "neu") {
                    print "upd oder neu: ";
                    $update=<STDIN>;
                    chomp $update;
                }
                
                if ($update eq "neu") { 
                    print "Entferne altes Backup...\n";
                    system ("rm -rfv $backup_medium");    
                    system("mkdir $backup_medium");
                }
                $progress=1;    
            }
        }
    }
    
    if ($progress==1) {
        if (!-"$backup_medium/configfiles") {
            system("mkdir $backup_medium/configfiles");
        }
        print "Sichere Daten:\n";
        print "sichere Liste der installierten Programme... \n";
            system("dpkg --get-selections | grep -v deinstall > $backup_medium/configfiles/ubuntu_files");
        print "sichere /etc/apt/sources.list... \n";
            system("cp -aru /etc/apt/sources.list  $backup_medium/configfiles/");
        print "sichere /etc/fstab... \n";
            system("cp -aru /etc/fstab $backup_medium/configfiles/");
        print "sichere /etc/X11/xorg.conf... \n";
            system("cp -aru /etc/X11/xorg.conf $backup_medium/configfiles/");
        print "sichere /etc/samba/smb.conf... \n";
            system("cp -aru /etc/samba/smb.conf $backup_medium/configfiles/");
        print "sichere /home...";
            system("cp -aru $home $backup_medium/");
        # ...
        print "\n Backup beendet\n"
    }
    else {
        print "Beende Backup-Vorgang\n";
    }
}
else { # platte nicht angeschlossen
    print "Backup-Medium nicht angeschlossen\n";
    print "Beende Backup-Vorgang, bitte externe USB-Platte anschließen\n";
    print "(UUID des Mediums: 41f9f791-bae0-4ae9-9531-922714a9ec8e)";
}

Das Script soll prüfen, ob die externe Platte angeschlossen und gemountet ist. Dann bietet es die Möglichkeit, einmal ein Backup zu machen, das dann immer geupdatet wird, oder eines mit nem Datumsstempel.

Vielleicht kann mir ja auch jemand sagen, wie man es besten bewerkstelligen kann, dass er das Backup-Verzeichnis mit den Quellverzeichnissen abgleicht und da die Dateien entfernt, die es in den Quellen nicht mehr gibt.

Gruß

Ach ja, special thx an Apensiv, der hatte in nem anderen Thread nen Tipp zu Geany gegeben. Ist ein Spitzenprogramm für das kleine Script zwischendurch.
~ Two hours of trial and error can save ten minutes of RTFM ~
...und NEIN - Windows ist keine andere Distribution!

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »zero77« (7. November 2007, 07:01)


Beiträge: 99

Wohnort: Hannover

Distribution: Ubuntu

Version: 10.04

Architektur: 32-Bit PC

Desktop: GNOME

Andere Distribution: Debian Etch (Server), yaVDR 0.2.0

16

Mittwoch, 7. November 2007, 08:01

Zitat

Original von zero77
hallo zusammen,

PHP-Quelltext

1
if (-"/dev/disk/by-uuid/41f9f791-bae0-4ae9-9531-922714a9ec8e") { # platte angeschlossen?

Das Script soll prüfen, ob die externe Platte angeschlossen und gemountet ist.

Wäre es nicht ratsamer das Medium direkt anzusprechen? Also /dev/hda[1-9]?

Denn bei mir lauten die UUIDs anders.

Bye Michael
Registered VDR User #1525
Registered Linux User #228306
________________________________
Die drei Todfeinde des Programmierers:
Sonnenlicht, frische Luft und das unerträgliche Gebrüll der Vögel.

17

Mittwoch, 7. November 2007, 10:25

Ist ja klar, dass bei dir die uuids anders lautenm sonst wären es ja keine ;-). Da es sich bei mir um eine externe Festplatte handelt, kann ich die Partition per uuid direkt ansprechen und muss mir vorher keine Gedanken machen, in welcher Reichenfolge ich meine USB-Peripherie anstöpseln muss. Da ja sonst mal eben aus /dev/sda /dev/sdb werden kann...
So weiß ich, dass die Daten auch genau dahin geschrieben werden, wo ich sie hin haben will. Bei internen Laufwerken ists freilich egal.
So war zumindest mein Gedankengang.

Gruß
~ Two hours of trial and error can save ten minutes of RTFM ~
...und NEIN - Windows ist keine andere Distribution!

Beiträge: 99

Wohnort: Hannover

Distribution: Ubuntu

Version: 10.04

Architektur: 32-Bit PC

Desktop: GNOME

Andere Distribution: Debian Etch (Server), yaVDR 0.2.0

18

Mittwoch, 7. November 2007, 11:41

Das macht natürlich Sinn. ;)

Bye Michael
Registered VDR User #1525
Registered Linux User #228306
________________________________
Die drei Todfeinde des Programmierers:
Sonnenlicht, frische Luft und das unerträgliche Gebrüll der Vögel.

Apensiv

Profi

Beiträge: 947

Distribution: Andere

Version: 5.0

Architektur: 32-Bit PC

Desktop: GNOME

Andere Distribution: Debian

19

Mittwoch, 7. November 2007, 16:01

Moin moin,

Perfekt, genau in diese Richtung wollte ich den Thread lenken,
vielen dank an dich zero und natürlich auch an alle anderen beteiligten ;)
Ich werde vllt. noch eine Erweiterung hinzufügen,
sodass man z.B. mittels:

Quellcode

1
./backup.pl -add /etc/httpd/httpd.conf -comment blablabla


eigene Backup-Dateien einbinden kann.

mfg

Edit1:

Also das mit den UUIDs muss noch verallgemeinert
oder geändert werden sehen ich gerade.

Zitat

Vielleicht kann mir ja auch jemand sagen, wie man es besten bewerkstelligen kann, dass er das Backup-Verzeichnis mit den Quellverzeichnissen abgleicht und da die Dateien entfernt, die es in den Quellen nicht mehr gibt.


Was meinst du genau damit?

Beiträge: 1 393

Wohnort: Schweiz

Distribution: Ubuntu

Version: 10.04

Architektur: 32-Bit PC

Desktop: GNOME

20

Mittwoch, 7. November 2007, 18:24

Zitat

Vielleicht kann mir ja auch jemand sagen, wie man es besten bewerkstelligen kann, dass er das Backup-Verzeichnis mit den Quellverzeichnissen abgleicht und da die Dateien entfernt, die es in den Quellen nicht mehr gibt.


Denke er meint da so etwas wie zwei Ordner miteinander zu synchronisieren, probierst du vielleicht mit rsync oder so.
http://de.wikipedia.org/wiki/Rsync