Leerzeichen maskieren

Autokiller677

Semiprofi
Thread Starter
Mitglied seit
09.06.2009
Beiträge
1.161
Hallo Allerseits,

folgendes Szenario: Netzwerk aus Windows Rechnern, Daten werden auf Server gesichert (Ubuntu 10.04). So Windows hat ja immer so schöne Verzeichnis und Dateinamen mit Leerzeichen drin. Vom Server aus sollen dann alle Daten zentral in Backups verpackt werden.

Wenn ich jetzt in meinem Backup Skript für inkrementele Backups folgendes eingebe:
Code:
tar -czf $backupdir/$1.tar.gz $(find /home/$username -mtime -2)
klappt das nicht. Grund: find gibt tar über die Kommandosubstiution die Pfade schön mit allen Leerzeichen etc. weiter und tar kann mit /User/Eigene oder Dateien/Ordner1 natürlich nicht viel anfangen, da es ja /User/Eigene Datein/Odrner1 heißen soll und es die anderen ja nicht gibt.

Frage: Gibt es eine Möglichkeit, diese Leerzeichen maskieren zu lassen? Oder muss ich jetzt auf den Windoof Rechnern mühsam alle Leerzeichen tilgen?

Vielen Dank im Vorraus
Autokiller677
 
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
In der man Page gibt es doch extra das Kapitel: UNUSUAL FILENAMES
bspw. -ls maskiert Leerzeichen gibt aber zu viel aus. Eventuell kann find das mithilfe -printf selbst formatieren oder eben man verwendet sed oder awk zum formatieren der Ausgabe.

Der konkrete Befehl würde glaube ich lauten:
Code:
tar -czf $backupdir/$1.tar.gz $(find /home/$username -mtime -2 | sed 's/ /\\ /g')
So sollte es eigentlich klappen. Bei mir funktioniert es.
Ob tar das so frisst, weiß ich allerdings nicht.
Ansonsten lies dir eins der zahlreichen sed Tutorials durch, z. B.:
Sed Tutorium

Es gibt einige ziemlich Gute, die du sicher über Google finden wirst.
 
Zuletzt bearbeitet:
hab zwar nix konkret dazu, würde dir aber das schöne Programm BackupPC empfehlen. Damit kann man wunderbar viele Windows/Linux Rechner per SMB, rsync etc. sichern.
 
Danke für die schnellen Antworten.
BackupPC ist nichts für mich, da die Backups nachts laufen (sind vieeeele Daten) und die PCs da nicht an sind. Zudem siehts so aus als ob es eine GUI braucht, und die hab ich auf meinem Server nicht. Hab mir aber trotzdem mal ein Lesezeichen gemacht, das Programm scheint super zu sein, in Zukunft find ich da sicher noch mal Verwendung für.

Zum Problem: Der sed Befehl scheint zu stimmen, wenn ich
Code:
find /home/$username -mtime -2 | sed 's/ /\\ /g'
alleine eingebe, bekomme ich eine Liste, in der alle Leerzeichen mit einem \ maskiert sind (also Eigene\ Dateien).

Damit hat aber tar offenbar ein Problem: Ich bekomme immer
Code:
tar: /home/$username/Eigene\\: Ungültige Blockgröße
als Ausgabe.
Nach ein bisschen rumprobieren hab ich raus, dass tar nur Leerzeichen akzeptiert die mit Hochkommas maskiert sind (in dem Stil: Eigene' 'Dateien).

Kann man sed auch irgendwie dazu bringen, die Leerzeichen so zu maskieren?
Die Tutorials hab ich mir angeguckt, aber ich bin im Moment noch etwas verwirrt, sed hat so extrem viele Optionen, ich muss erstmal einen Überblick bekommen.
 
Danke für die schnellen Antworten.
BackupPC ist nichts für mich, da die Backups nachts laufen (sind vieeeele Daten) und die PCs da nicht an sind. Zudem siehts so aus als ob es eine GUI braucht, und die hab ich auf meinem Server nicht. Hab mir aber trotzdem mal ein Lesezeichen gemacht, das Programm scheint super zu sein, in Zukunft find ich da sicher noch mal Verwendung für.

Wann die Backups gezogen werden kann man in BackupPC recht gut steuern, er pingt dann auch die Rechner in regelmässigen Abständen an um zu schaun ob sie da sind, und wenn ja beginnt er mit dem Backup. Einen X-Server braucht es nicht, die GUI ist eine Weboberfläche auf die du von jedem Rechner aus zugreifen kannst. Das wichtigste Feature ist aber das Pooling, mit dem sich viel Platz sparen lässt. Wenn auf 10 Rechnern die gleiche Datei ist wird diese nur 1x im Backup gespeichert.
 
Kann man sed auch irgendwie dazu bringen, die Leerzeichen so zu maskieren?
wahrscheinlich schon. Ich bild mir ein, dass in meinem reguläre Ausdrücke Buch auch stand wie. Nur wo ist die Frage. Mit doppelten Anführungszeichen geht es nicht?:
Code:
sed 's/ /" "/g')
Wie gesagt ich bin mir ziemlich sicher, dass es geht. Ich editier den Beitrag wenn ich es gefunden hab.
wie foxxx geschrieben hat eigentlich so:
Code:
find /home/$username -mtime -2 | sed 's/ /\' \'/g'
ein wenig verbessert das zweite ' muss man auch schützen. Problem in der Konsole kann man das nicht testen da dort ' ' interpretiert wird, Das muss man also wahrscheinlich auch wieder schützen, die Frage ist wie. Vielleicht kommt tar ja einfach damit zurecht.
Wie foxxx unter mir schon geschrieben hat dafür gibt es dann das doppelte Anführungszeichen. Sieht schon lustig aus.
 
Zuletzt bearbeitet:
so geht's:

Code:
fox@fileserver:~$ echo $blub
/home/test blub/bla
fox@fileserver:~$ echo $blub | sed 's/ /\'"' '"'/g'
/home/test' 'blub/bla

mfg
foxxx :wink:
 
Langsam geh ich die Wände hoch.

Fox sed Befehl funktioniert gut, alles schön maskiert.
Allerdings sind das zu viele Dateien für tar, Fehlermeldung argument list too long.
Also kurz gegoogelt, Lösung wie folgt: Man lässt die Dateiliste in eine Datei schreiben (liste.txt) und benutzt bei tar den Parameter --files-from liste.txt.
Dann holte er sich die Dateien aus der Liste. Klappt auch.

Nun zum Problem: Wenn ich einen Dateipfad mit maskierten Leerzeichen manuell eingebe, meckert er nicht. Wenn ich genau denselben Pfad aus der liste.txt auslesen lassen, bekomm ich wieder "Kann stat nicht ausführen, No file oder directory.

Was soll das denn jetzt? Hat jemand eine Idee, weshalb tar es über die manuelle Eingabe frisst aber nicht aus der Datei?

Was mir noch aufgefallen ist, ist, dass er immer meckert, man solle den / am Anfang des Pfades weglassen, also nur einen relativen Pfad angeben. Aber wenn ich tar im Verzeichnissroot / ausführe und bei den absoluten Pfaden den / entferne, klappt alles wenn ichs manuell eingebe. Wenns dann aus der Datei kommt will er nicht mehr.

Wechselt tar vllt. irgendwie das Verzeichnis, wenn er sich die Dateien aus der liste.txt holt?
 
Du willst nicht wirklich nächtlich Backups mit tar anfertigen?

Schau dir bacula an, bietet alles was du dir nur wünschen kannst. Scheduler, flexible Rückhaltezeiten, Komprimierung, granulare Wiederherstellung, incrementelle, differentielle und fullbackups nach selbst definierten Zeitabständen, plattformübergreifend, exlude-listen und und und.

Für mich liest sich das nicht nach dem Backup für zu Hause, und mit betrieblichen Daten so leichtfertig mit tar was rumzuknauppen geht gar nicht.
 
Ne, es ist keine Backup Strategie für zu Hause. Ist ein Gemisch aus Privat und Geschäftsdaten.
Natürlich ist so eine "zusammengebastelte" Variante nich die Beste, aber es ist ein 1 Mann Betrieb (wortwörtlich) und bisher lagern die Daten nur auf dem Arbeits PC, daher jetzt der Ansatz ohne großartigen Aufwand etwas mehr Sicherheit da rein zu bekommen.

Bacula sieht mir noch ein bisschen komplex aus, ein Linux Profi bin ich nicht, deshalb hatte ich an tar gedacht, damit kenn ich mich aus und weiß auch im Notfall was zu tun ist.

Aber da sich das Problem mit tar offenbar nicht lösen lässt, werde ich micht jetzt erst mal mit Backup Lösungen beschäftigen.

@ara1
Kann BackupPC auch von einer internen Platte die Backups ziehen?
Bisher war das so angedacht: Die Daten der PCs werden immer wieder mittels Synchredible mit dem Server syncronisiert und der Backup Job zieht dann die Daten von der internen Platte. Das hätte auch den Vorteil, das nicht bei jedem Vollbackup 600GB Daten über ein 100Mbit LAN geschaufelt werden müssen, sondern immer nur die neuen oder geänderten Dateien von Synchredible aktuell gehalten werden.
 
Wie wär's mit rsync ?

Gibt's für Linux und Windows und du kannst entscheiden, ob alle Dateien, oder nur geänderte/aktualisierte gesynct werden sollen.

mfg
foxxx :wink:
 
Zuletzt bearbeitet:
Nun zum Problem: Wenn ich einen Dateipfad mit maskierten Leerzeichen manuell eingebe, meckert er nicht. Wenn ich genau denselben Pfad aus der liste.txt auslesen lassen, bekomm ich wieder "Kann stat nicht ausführen, No file oder directory.

Hast du schon probiert, die Filenamen ins File (liste.txt) mit normalen Leerzeichen, also ganz ohne Escapes, Anführungszeichen etc., zu schreiben?
 
Ich fall vom Glauben ab.
Wenn man den die Files aus der Datei ziehen lässt, funktioniert es echt ohne jegliche maskierung.
Wieso geht es da aber nicht bei normaler Eingabe?°°
Naja, mir ist es egal, jetzt weiß ich wie es geht.

Jetzt kann ich erst mal so notdürftig ein Backup aufsetzen (nach dem es letztens ohne Backup beinahe ein Waterloo gegeben hätte) und kann mich ganz in Ruhe mit bacula, backupPC, rsync und co. beschäftigen und entscheiden welches ich benutze.

Danke an alle, die mitgeholfen haben, und an die die mir die anderen Backup Programme empfohlen haben!:cool::asthanos::coolblue::bigok::bigok::bigok::banana::wink::wink::wink::hail::hail:
 
Das ist bei den meisten Commandline Programmen so, die ihre Parameter oder Eingabedaten aus einer Datei beziehen können. Die Escape-Zeichen verarbeitet nämlich nicht das Programm selbst, sondern die Shell, und die braucht sie auch, u.a. um erkennen zu können wo ein Parameter aufhört und der nächste anfängt (normalerweise am Leerzeichen). Das Programm hat damit allerdings kein Problem, es erwartet einfach genau einen Filenamen pro Zeile. Das wird erst kompliziert, wenn du Linefeeds (Zeilenumbrüche) in Dateinamen hast.
 
Und schon wieder was gelernt, danke für die Erklärung
Ich dacht immer dieses "Problem" wäre bei Linux systemweit.
 
@ara1
Kann BackupPC auch von einer internen Platte die Backups ziehen?
Bisher war das so angedacht: Die Daten der PCs werden immer wieder mittels Synchredible mit dem Server syncronisiert und der Backup Job zieht dann die Daten von der internen Platte. Das hätte auch den Vorteil, das nicht bei jedem Vollbackup 600GB Daten über ein 100Mbit LAN geschaufelt werden müssen, sondern immer nur die neuen oder geänderten Dateien von Synchredible aktuell gehalten werden.

Natürlich kann er das auch. Aber ist eigentlich garnicht nötig, ich würde die Daten direkt von den anderen Rechnern ziehn. Auch bei einem Vollbackup zieht BackupPC per rsync oder SMB nur die Dateien die er noch nicht hat. Ich sichere damit auch übers LAN insgesamt ein paar Terabyte. Durch das Pooling hintendran sinkt auch der Platzbedarf dramatisch. Ich habe zB auf einem 1.5TB Raid effektiv > 10TB an Backups.
 
Schön zu hören.
Die Scripte mit tar sind geschrieben und laufen erst mal (endlich).

Die VM läuft auch schon und Backup PC macht so im ersten Moment einen guten Eindruck.
Ich werd mich jetzt mal ein bisschen einarbeiten und dann sehen ob ich das Backup System noch mal umstelle.
 
Wie wär's mit rsync ?

Das geht vllt noch bei einem System, aber du stößt da irgendwann an ganz andere Grenzen, inoden-table, zB, wir hatten eine solche lösung mal, funktionierte irgendwann nur noch schlecht.

Das hätte auch den Vorteil, das nicht bei jedem Vollbackup 600GB Daten über ein 100Mbit LAN geschaufelt werden müssen

Bacula packt dir die Daten auf dem sendenden System und legt Sie dann auf dem Storage ab :wink: Aktuell sichern wir damit was um die 140 Hosts.

Wart am besten nicht zu lange bis du dir was gescheites zulegst, Übergangslösungen werden zu häufig zu Dauerlösungen :wink:
 
Jo, wie gesagt, Backup PC läuft schon in einer VM zum testen.

Obwohl ich mit den Scripten eigentlich ganz zufrieden bin, doppelte Dateien gibt es eigentlich nicht, da es nur ein Arbeits PC ist und da regelmäßig mit Dupehunter aufgeräumt wird:d

Hier mal die Scripte die ich jetzt verwende:
Fürs monatliche Vollbackup:
Code:
!/bin/bash

dir=/home/backups/$2/voll/monatlich

if [ -z "$1" ]; then
   echo 'Script beendet. Zu wenig Argumente. Verwendung: monthly.sh <Monat> <Benutzername>.'
   exit
fi

if [ -z "$2" ]; then
   echo 'Script beendet. Zu wenig Argumente. Verwendung: monthly.sh <Monat> <Benutzername>.'
   exit
fi

if [ ! -d /home/backups ]; then
    mkdir /home/backups
fi

if [ ! -d /home/backups/$2 ]; then
   mkdir /home/backups/$2
fi

if [ ! -d /home/backups/$2/voll ]; then
   mkdir /home/backups/$2/voll
fi

if [ ! -d $dir ]; then
   mkdir $dir
fi

if [ ! -d /home/backups/log ]; then
   mkdir /home/backups/log
fi

if [ -f $dir/$2_$1.tar.gz ]; then
   rm -f $dir/$2_$1.tar.gz
fi

tar -czf $dir/$2_$1.tar.gz /home/$2
exit

Fürs wöchentliche Vollbackup (5-Wochen-Zyklus):
Code:
!/bin/bash

dir=/home/backups/$1/voll/wöchentlich

if [ -z "$1" ]; then
   echo 'Script beendet. Zu wenig Argumente. Verwendung: weekly.sh <Benutzername>.'
   exit
fi

if [ ! -d /home/backups ]; then
    mkdir /home/backups
fi

if [ ! -d /home/backups/$1 ]; then
   mkdir /home/backups/$1
fi

if [ ! -d /home/backups/$1/voll ]; then
   mkdir /home/backups/$1/voll
fi

if [ ! -d $dir ]; then
   mkdir $dir
fi

if [ ! -d /home/backups/log ]; then
   mkdir /home/backups/log
fi

if [ ! -z $(find $dir/ -type f -mtime 32) ]; then
   rm -f $(find $dir/ -type f -mtime 32)
fi

if [ -z $(ls $dir | grep $1_woche1.tar.gz) ]; then
   tar -czf $dir/$1_woche1.tar.gz /home/$1
   exit
fi

if [ -z $(ls $dir | grep $1_woche2.tar.gz) ]; then
   tar -czf $dir/$1_woche2.tar.gz /home/$1
   exit
fi

if [ -z $(ls $dir | grep $1_woche3.tar.gz) ]; then
   tar -czf $dir/$1_woche3.tar.gz /home/$1
   exit
fi

if [ -z $(ls $dir | grep $1_woche4.tar.gz) ]; then
   tar -czf $dir/$1_woche4.tar.gz /home/$1
   exit
fi

if [ -z $(ls $dir | grep $1_woche5.tar.gz) ]; then
   tar -czf $dir/$1_woche5.tar.gz /home/$1
   exit
fi

exit

Und fürs tägliche, inkrementelle Backup (7-Tage-Zyklus):
Code:
!/bin/bash

dir=/home/backups/$2/inkrementel
td=/home/backups/temp

if [ -z "$1" ]; then
   echo 'Script beendet. Zu wenig Argumente. Verwendung: daily.sh <Wochentag> <Benutzername>.'
   exit
fi

if [ -z "$2" ]; then
   echo 'Script beendet. Zu wenig Argumente. Verwendung: daily.sh <Wochentag> <Benutzername>.'
   exit
fi

if [ ! -d /home/backups ]; then
    mkdir /home/backups
fi

if [ ! -d /home/backups/$2 ]; then
   mkdir /home/backups/$2
fi

if [ ! -d $dir ]; then
   mkdir $dir
fi

if [ ! -d $td ]; then
   mkdir $td
fi

if [ -f $dir/$2_$1.tar.gz ]; then
   rm -f $dir/$2_$1.tar.gz
fi

if [ ! -d /home/backups/log ]; then
   mkdir /home/backups/log
fi

if [ "$1" = montag ]; then
   find /home/$2 -type f -mtime -1 > $td/liste.txt
fi

if [ "$1" = dienstag ]; then
   find /home/$2 -type f -mtime -2 > $td/liste.txt
fi

if [ "$1" = mittwoch ]; then
   find /home/$2 -type f -mtime -3 > $td/liste.txt
fi

if [ "$1" = donnerstag ]; then
   find /home/$2 -type f -mtime -4 > $td/liste.txt
fi

if [ "$1" = freitag ]; then
   find /home/$2 -type f -mtime -5 > $td/liste.txt
fi

if [ "$1" = samstag ]; then
   find /home/$2 -type f -mtime -6 > $td/liste.txt
fi

tar -czf $dir/$2_$1.tar.gz --files-from $td/liste.txt

rm -f $td/liste.txt

exit

Ich weiß, dass man da mit case noch ein paar Sachen vereinfachen könnte (und sicher auch noch einiges anderes, aber Shellscripte sind nicht gerade mein Fachgebiet) aber mit case das wollte irgendwie nicht so wie ich, also hab ich einfach mit if gemacht, ist ja eh nur eine Übergangslösung.

EDIT: Ich seh grad, ohne Syntaxhighlighting lässt sich das besch**** lesen, aber ich nehme nicht an das bbcode das unterstützt oder?
 
Das geht vllt noch bei einem System, aber du stößt da irgendwann an ganz andere Grenzen, inoden-table, zB, wir hatten eine solche lösung mal, funktionierte irgendwann nur noch schlecht.

Das ist mir klar, dass man mit rsync schnell an logische und praktische Probleme stößt. Aber hier ging es nur um einen PC, von daher wäre das mit rsync recht einfach und gut lösbar gewesen.

Grundsätzlich ist es aber von Vorteil, sich in eine komplexere Software einzuarbeiten, da irgendwann doch der Tag kommt, an dieses Wissen und die Erfahrung von Nutzen sein kann ;)

mfg
foxxx :wink:

PS: Bei solch kleinen Scripten ist Syntax-Highlighting kein Muss, man kann es sich kurz in seinen Editor-Favoriten ziehen und dort anschauen ;)
 
Zuletzt bearbeitet:
Ich meld mich hier nochmal.
Eine Sache ist mir noch aufgefallen.
Wenn ich die Scripte unter /etc/scripts ablege, kann ich sie trotz chmod 777 als normaler User nicht ausführen, als root gehts.
Über den crontab vom normalen User gehts natürlich auch nicht, aber über den vom root tut sich da komischerweise auch nichts?!

Jetzt hab ich die Scripte in /home/scripts, da funktionierts dann auch mit chmod 700 und normalen Usern?!, auch über deren Crontabs.

Gibt es da in /etc spezielle Rechte, die die von den einzelnen Dateien überlagern?
 
Ein normaler User darf schon in /etc/ nichts ausführen, dementsprechend auch nicht in Unterordnern davon, auch wenn die Rechte für diesen Ordner dann stimmen.

Wenn du mehrere Scripte hast, die verschiedene normale User ausführen können sollen, würde ich dir folgendes empfehlen:

addgroup runner oder groupadd runner
mkdir /scripts
chown :runner -R /scripts
chmod -R 774 /scripts


Dann musst du nur noch jeden user, der scripte ausführen können soll, in die "runner" Gruppe verschieben, und alles funktioniert ;)

mfg
foxxx :wink:
 
Nein, die Scripte sollen alle nur von einem User ausgeführt werden. Es hat mich nur gewundert, wieso das nicht geht obwohl die Rechte stimmten.
Aber danke für die Erklärung, wieder mal was gelernt:d.
 
Ein normaler User darf schon in /etc/ nichts ausführen, dementsprechend auch nicht in Unterordnern davon, auch wenn die Rechte für diesen Ordner dann stimmen.

Code:
#!/bin/bash
echo "Ich bin ein normaler User und führe ein Skript in $PWD aus"

nach /etc und so tief, wie man will, kopieren (als root), chmod +x (als root), ./skript.sh (als normaler User).
 
:hmm: Das funktioniert :hmm:

:wayne: :shot:

Dann muss in deinem Script oder mit den Berechtigungen noch irgendwas nicht stimmen.

Aber wenn es nur ein einziger User ist, dann kannste die Scripts direkt in seinem /home/user Ordner lassen, das erspart dir mögliche Komplikationen.
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh