Bash-Skript mit rsync (Anfänger bittet um Hilfe)
Hallo,
unter Windows fühle ich mich zuhause, doch was Linux angeht bin ich recht unerfahren.
Jetzt möchte ich eine Aufgabe mit einem bash-Skript lösen.
Da ich, wie gesagt, von Linux kaum eine Ahnung habe, habe ich zwar ein Skript schreiben können, kann aber nicht beurteilen, ob das zweckmäßig ist.
Mir erscheint das Skript zielführend zu sein, aber ich habe keine Ahnung wo die Falltüren sind und welche himmelschreienden Anfängerfehler ich da reingetippt habe.
Meine Bitte wäre jetzt, dass sich jemand erbarmt, sich das Skript anzusehen und/oder auf meine Fragen einzugehen.
Im Moment habe ich weder Zeit noch Neigung, mich ins Neuland "Linux" soweit einzuarbeiten, dass ich ohne Hilfe auskäme, daher hoffe ich Euer KnowHow nutzen zu dürfen, ohne dass mir das als zu bequemer Weg vorgeworfen wird.
1. Die Aufgabe
Ich möchte Dateien eines Windows-Fileserver auf einem NAS sichern.
Auf dem NAS läuft ein Linux (DSM 6.1.4-15217 Update 5 auf Synology RS3617xs+).
Der aktive Part soll dabei das NAS sein und auf den Windowsserver möchte ich keine zusätzlichen Tools installieren.
SSH und sonstige Sicherheitsmaßnahmen benötige ich nicht.
Die Boardmittel und Zusatzpakete des NAS, die Backups ohne Skript ermöglichen, habe ich weitgehend ausprobiert und war damit nicht zufrieden.
Google zeigte mir ein paar fertige rsync-Skripte, die mir aber alle unnötig komplex erschienen und deren Funktionen für mich nicht verständlich waren.
Ich würde ein möglichst schlankes Skript bevorzugen, das ich gänzlich nachvollziehen kann.
2. Der Lösungsansatz
Ich mounte am NAS die Netzwerkfreigabe des Windows-Fileservers, auf der die zu sichernden Dateien liegen.
Dann kopiere ich mit dem NAS, die Dateien in einen lokalen Ordner des NAS.
Danach unmounte ich die Quelle wieder.
Zum Kopieren nutze ich
Die Ausgaben von
Im Skript erzeuge ich weitere Ausgaben, die in eine weitere Logdatei (2017-01-05_scriptlog.txt) geschrieben werden.
Die Trennung der Logs soll dazu dienen, dass das Kontroll-Log schlank bleibt und leicht ausgewertet werden kann.
Im Falle eines Fehlers oder Neugier, kann ich im rsync-Log nachsehen was tatsächlich passiert ist.
3. Der Status
Mein Skript habe ich noch nicht getestet, ich habe es heute geschrieben, um hier nicht mit leeren Händen dazustehen.
Die Kern-Befehle
4. Das Script
5. Die Automatisierung
Wie ich das Skript zeitgesteuert starten kann, weiß ich.
Wie ich das erzeugte Log auswerten kann, weiß ich auch.
Also Alles außerhalb des Skriptes bekomme ich alleine hin.
6. Meine Fragen
6.1 Linux mount
Unter Windows kann ich direkt auf eine Freigabe zugreifen.
Beispiel:
Wird dabei - warum auch immer - die Verbindung unterbrochen, so wird auch der Kopiervorgang abbrechen.
Bei Linux scheint das so nicht zu gehen (oder doch?)
Jetzt mache ich mir folgende Sorge:
Wenn ich einen tatsächlich vorhandenen, lokalen Ordner nutzen muss, um darin die Freigabe zu mounten, ist dieser Ordner auch dann noch vorhanden, wenn die Verbindung zum Windowsserver abbricht.
Der lokale Ordner, der zum Mounten verwendet wird, enthält aber nicht die Dateien, die ich kopieren möchte.
Wird
6.2 Mountstatus prüfen
Im lokalen Ordner, den ich zum Mounten nutze, habe ich eine lokale Datei
Wenn der Ordner nicht zum Mounten genutzt ist, dann habe ich lokal Zugriff auf diese Datei.
Ist der Ordner aber zum Mounten genutzt, so wird der tatsächliche, lokale Inhalt verborgen und nur der entfernte (gemountete) Inhalt zur Verfügung gestellt.
Finde ich die Datei
Ob das eine elegante Fallunterscheidung ist, ich weiß es nicht.
6.3 sudo im Script
Wie kann ich einen Befehl ausführen lassen, der sudo benötigt, ohne manuell das dafür notwendige Kennwort von Hand eingeben zu müssen?
6.4 Die rsync-Optionen
Der Parameter
Ich frage mich, ob die enthaltenen Parameter
Alle Dateien und Ordner in der zu sichernen Windows-Quelle, sind einfach nur Daten, für die keine speziellen Berechtigungen gesetzt sind.
Jeder, der Zugriff auf die Freigabe des Windows-Fileserver hat, kann dort machen was er will.
Im Falle eines Restores, möchte ich unter Windows die Dateien vom Backupordner des NAS über's Netzwerk wieder auf den Windows-Fileserver kopieren.
Dabei und anschließend möchte ich nicht auf Schwierigkeiten treffen ala "Sie benötigen die Berechtigung von XY..." um dies oder das zu tun.
Sind die Parameter
Vielen Dank in Voraus
Gruß Frank
EDIT: Punkt 4. "Das Script" mit Änderungen aktualisiert
unter Windows fühle ich mich zuhause, doch was Linux angeht bin ich recht unerfahren.
Jetzt möchte ich eine Aufgabe mit einem bash-Skript lösen.
Da ich, wie gesagt, von Linux kaum eine Ahnung habe, habe ich zwar ein Skript schreiben können, kann aber nicht beurteilen, ob das zweckmäßig ist.
Mir erscheint das Skript zielführend zu sein, aber ich habe keine Ahnung wo die Falltüren sind und welche himmelschreienden Anfängerfehler ich da reingetippt habe.
Meine Bitte wäre jetzt, dass sich jemand erbarmt, sich das Skript anzusehen und/oder auf meine Fragen einzugehen.
Im Moment habe ich weder Zeit noch Neigung, mich ins Neuland "Linux" soweit einzuarbeiten, dass ich ohne Hilfe auskäme, daher hoffe ich Euer KnowHow nutzen zu dürfen, ohne dass mir das als zu bequemer Weg vorgeworfen wird.
1. Die Aufgabe
Ich möchte Dateien eines Windows-Fileserver auf einem NAS sichern.
Auf dem NAS läuft ein Linux (DSM 6.1.4-15217 Update 5 auf Synology RS3617xs+).
Der aktive Part soll dabei das NAS sein und auf den Windowsserver möchte ich keine zusätzlichen Tools installieren.
SSH und sonstige Sicherheitsmaßnahmen benötige ich nicht.
Die Boardmittel und Zusatzpakete des NAS, die Backups ohne Skript ermöglichen, habe ich weitgehend ausprobiert und war damit nicht zufrieden.
Google zeigte mir ein paar fertige rsync-Skripte, die mir aber alle unnötig komplex erschienen und deren Funktionen für mich nicht verständlich waren.
Ich würde ein möglichst schlankes Skript bevorzugen, das ich gänzlich nachvollziehen kann.
2. Der Lösungsansatz
Ich mounte am NAS die Netzwerkfreigabe des Windows-Fileservers, auf der die zu sichernden Dateien liegen.
Dann kopiere ich mit dem NAS, die Dateien in einen lokalen Ordner des NAS.
Danach unmounte ich die Quelle wieder.
Zum Kopieren nutze ich
rsync
.Die Ausgaben von
rsync
schreibe ich in eine Logdatei (2017-01-05_rsynclog.txt).Im Skript erzeuge ich weitere Ausgaben, die in eine weitere Logdatei (2017-01-05_scriptlog.txt) geschrieben werden.
Die Trennung der Logs soll dazu dienen, dass das Kontroll-Log schlank bleibt und leicht ausgewertet werden kann.
Im Falle eines Fehlers oder Neugier, kann ich im rsync-Log nachsehen was tatsächlich passiert ist.
3. Der Status
Mein Skript habe ich noch nicht getestet, ich habe es heute geschrieben, um hier nicht mit leeren Händen dazustehen.
Die Kern-Befehle
sudo mount.cifs...
und sudo rsync...
habe ich aber gestern in einer Telnet-Sitzung ausprobiert und sie funktionieren.4. Das Script
#!/bin/bash
# Konfiguration
## Windows
benutzername=Administrator
kennwort=geheim
windowsquelle=//WinServer/Freigabe/Ordner/
## Linux
sudokennwort=auchgeheim
lokalequelle=/volume1/admin/mount
lokalesziel=/volume1/Backup/Winserver
testdatei==${lokalequelle}/lokal.txt # Die Testdatei muss in diesem Ordner existieren
# Logdatei erzeugen
datum=$(date +%Y-%m-%d)
scriptlogdatei=/volume1/admin/log/${datum}_scriptlog.txt
rsynclogdatei=/volume1/admin/log/${datum}_rsynclog.txt
echo "$(date +%H:%M:%S) - INFO: Starte Backup von $windowsquelle"
echo "$(date +%H:%M:%S) - INFO: Starte Backup von $windowsquelle" > $scriptlogdatei
# Quelle mounten
echo "$(date +%H:%M:%S) - INFO: Windowsquelle verbinden..."
echo "$(date +%H:%M:%S) - INFO: Windowsquelle verbinden..." >> $scriptlogdatei
if [ ! -f $testdatei ]
then
echo "$(date +%H:%M:%S) - ERROR: Die Testdatei existiert nicht im lokalen Ordner."
echo "$(date +%H:%M:%S) - ERROR: Die Testdatei existiert nicht im lokalen Ordner." >> $scriptlogdatei
exit
fi
echo $sudokennwort | sudo -S mount.cifs -o ro,username=${benutzername},password=${kennwort} $windowsquelle $lokalequelle
if [ -f $testdatei ]
then
echo "$(date +%H:%M:%S) - ERROR: Das Mounten hat nicht funktioniert."
echo "$(date +%H:%M:%S) - ERROR: Das Mounten hat nicht funktioniert." >> $scriptlogdatei
exit
fi
# Dateien kopieren
echo "$(date +%H:%M:%S) - INFO: Dateien kopieren: $windowsquelle -> $lokalesziel ..."
echo "$(date +%H:%M:%S) - INFO: Dateien kopieren: $windowsquelle -> $lokalesziel ..." >> $scriptlogdatei
echo $sudokennwort | sudo -S rsync --delete -a --no-perms --no-owner --no-group -W --verbose ${lokalequelle}/ $lokalesziel > $rsynclogdatei
fehlercode=$?
if [ $fehlercode -eq 0 -o $fehlercode -eq 24 ]
then
echo "$(date +%H:%M:%S) - INFO: Das Kopieren wurde erfolgreich beendet."
echo "$(date +%H:%M:%S) - INFO: Das Kopieren wurde erfolgreich beendet." >> $scriptlogdatei
else
echo "$(date +%H:%M:%S) - ERROR: Beim Kopieren trat der Fehler $fehlercode auf."
echo "$(date +%H:%M:%S) - ERROR: Beim Kopieren trat der Fehler $fehlercode auf." >> $scriptlogdatei
fi
# Quelle unmounten
echo "$(date +%H:%M:%S) - INFO: Windowsquelle trennen..."
echo "$(date +%H:%M:%S) - INFO: Windowsquelle trennen..." >> $scriptlogdatei
echo $sudokennwort | sudo -S umount $lokalequelle
fehlercode=$?
if [ ! $fehlercode -eq 0 ]
then
echo "$(date +%H:%M:%S) - ERROR: Das Unmounten hat nicht funktioniert. Fehler: $fehlercode"
echo "$(date +%H:%M:%S) - ERROR: Das Unmounten hat nicht funktioniert. Fehler: $fehlercode" >> $scriptlogdatei
exit
fi
echo "$(date +%H:%M:%S) - INFO: Backup erfolgreich abgeschlossen."
echo "$(date +%H:%M:%S) - INFO: Backup erfolgreich abgeschlossen." >> $scriptlogdatei
5. Die Automatisierung
Wie ich das Skript zeitgesteuert starten kann, weiß ich.
Wie ich das erzeugte Log auswerten kann, weiß ich auch.
Also Alles außerhalb des Skriptes bekomme ich alleine hin.
6. Meine Fragen
6.1 Linux mount
Unter Windows kann ich direkt auf eine Freigabe zugreifen.
Beispiel:
xcopy \\WinServer\Freigabe\Ordner\*.* D:\Backup\
Wird dabei - warum auch immer - die Verbindung unterbrochen, so wird auch der Kopiervorgang abbrechen.
Bei Linux scheint das so nicht zu gehen (oder doch?)
Jetzt mache ich mir folgende Sorge:
Wenn ich einen tatsächlich vorhandenen, lokalen Ordner nutzen muss, um darin die Freigabe zu mounten, ist dieser Ordner auch dann noch vorhanden, wenn die Verbindung zum Windowsserver abbricht.
Der lokale Ordner, der zum Mounten verwendet wird, enthält aber nicht die Dateien, die ich kopieren möchte.
Wird
rsync
in Kombination mit --delete
dann feststellen, dass die vortags gesicherten Dateien im Ziel, nicht in der Quelle sind und daher - wie angewiesen - mein Backup (das Ziel) leeren, obwohl genau jetzt der Fall eingetreten sein könnte, in dem ich das Backup benötigen würde?6.2 Mountstatus prüfen
Im lokalen Ordner, den ich zum Mounten nutze, habe ich eine lokale Datei
lokal.txt
abgelegt.Wenn der Ordner nicht zum Mounten genutzt ist, dann habe ich lokal Zugriff auf diese Datei.
Ist der Ordner aber zum Mounten genutzt, so wird der tatsächliche, lokale Inhalt verborgen und nur der entfernte (gemountete) Inhalt zur Verfügung gestellt.
Finde ich die Datei
lokal.txt
im Mount-Ordner, dann ist dort nicht gemountet.Ob das eine elegante Fallunterscheidung ist, ich weiß es nicht.
6.3 sudo im Script
Wie kann ich einen Befehl ausführen lassen, der sudo benötigt, ohne manuell das dafür notwendige Kennwort von Hand eingeben zu müssen?
6.4 Die rsync-Optionen
Der Parameter
-a
kombiniert diverse Parameter: -a = --archive = -rlptgoD
Ich frage mich, ob die enthaltenen Parameter
-g = -group
und -o = -owner
für mich sinnvoll sind.Alle Dateien und Ordner in der zu sichernen Windows-Quelle, sind einfach nur Daten, für die keine speziellen Berechtigungen gesetzt sind.
Jeder, der Zugriff auf die Freigabe des Windows-Fileserver hat, kann dort machen was er will.
Im Falle eines Restores, möchte ich unter Windows die Dateien vom Backupordner des NAS über's Netzwerk wieder auf den Windows-Fileserver kopieren.
Dabei und anschließend möchte ich nicht auf Schwierigkeiten treffen ala "Sie benötigen die Berechtigung von XY..." um dies oder das zu tun.
Sind die Parameter
-g = -group
und -o = -owner
in diesem Sinne hilfreich oder kortraproduktiv?Vielen Dank in Voraus
Gruß Frank
EDIT: Punkt 4. "Das Script" mit Änderungen aktualisiert
Please also mark the comments that contributed to the solution of the article
Content-ID: 360023
Url: https://administrator.de/contentid/360023
Printed on: November 5, 2024 at 06:11 o'clock
10 Comments
Latest comment
Hi,
ich fang einfach mal an ein paar Fragen des Romans zu beantworten .
https://stackoverflow.com/questions/25215604/use-sudo-without-password-i ...
https://wiki.ubuntuusers.de/sudo/Konfiguration/
z.B. mit
Alles ohne Passwort erlauben, kannst du ja auf die Befehle einschränken die du brauchst.
Alternativ startest du das ganze Skript elevated dann ist ein sudo im Skript nicht nötig.
Gruß @135111
ich fang einfach mal an ein paar Fragen des Romans zu beantworten .
$datum=$(date +%y-%m-%d)
Datum wolltest du 4-stellig dann musst du das y groß schreiben %Y.testdatei==${lokalequelle}/lokal.txt
Fehler, doppeltes Gleichheitszeichen.Zeile 31
if [ -f $testdatei ]
Vergessen zu negieren? Du wolltest doch abbrechen wenn Datei nicht existiert.if [ -f $testdatei ]
6.3 sudo im Script
Kennwort des Linux Users bitte nicht hinterlegen, dazu nutzt man die sudoers Datei in der man eintragen kann welcher User welche Befehle oder Skripte ausführen mit sudo (auch ohne Passwort)ausführen kann.https://stackoverflow.com/questions/25215604/use-sudo-without-password-i ...
https://wiki.ubuntuusers.de/sudo/Konfiguration/
z.B. mit
userxyz ALL=(ALL:ALL) NOPASSWD:ALL
Alternativ startest du das ganze Skript elevated dann ist ein sudo im Skript nicht nötig.
6.2 Mountstatus prüfen
Prüfe den exit code des mount Befehls, das sollte hier reichen.Beispiel: xcopy \\WinServer\Freigabe\Ordner\*.* D:\Backup\
Wird dabei - warum auch immer - die Verbindung unterbrochen, so wird auch der Kopiervorgang abbrechen.
Bei Linux scheint das so nicht zu gehen (oder doch?)
Doch rsync wird dir entsprechende Fehlermeldungen werfen.Wird dabei - warum auch immer - die Verbindung unterbrochen, so wird auch der Kopiervorgang abbrechen.
Bei Linux scheint das so nicht zu gehen (oder doch?)
Sind die Parameter -g = -group und -o = -owner in diesem Sinne hilfreich oder kortraproduktiv?
Brauchst du hier nicht, lässt sich auch trotz bei Verwendung von -a ausnehmen ohne jetzt -rlptD zu schreibenrsync -av --no-perms --no-owner --no-group ............
Gruß @135111
Dem Hinweis konnte ich nicht nachkommen, da auf meinem System kein visudo existiert
Das brauchst du auch nicht unbedingt, das manuelle Eintragen der obigen Zeile in die sudoers tuts natürlich auch.Wie würde rsync sich verhalten, wenn beim Erstellen seiner "incremental file list" die Verbindung abbricht
Es wirft einen Fehler weil ein SMB Timeout getriggert wird, der Ordner ist also dann nicht automatisch leer nur weil die Verbindung abbricht, der Zugriff auf das Verzeichnis hängt quasi in der Luft.Zusätzlich kannst du natürlich einen Bit-Vergleich hinterherschieben, ich persönlich würde hier aber statt nur mit rsync zu arbeiten das ganze gleich versioniert mit rsnapshot aufbauen. Somit hast du immer eine gewisse Anzahl an Snapshots in der Hinterhand. Rsnapshot basiert auf rsync und läuft auch dort wo rsync läuft.
http://rsnapshot.org
Du kannst meine Frage aber gerne verschieben,
Sorry für den Dreckfuhler, denn mit Bashing hat das natürlich nichts zu tun.Deinen Beitrag können andere Forenteilnehmer natürlich NICHT so mirnixdirnix verschieben, wäre ja auch fataler Unsinn wenn das gehen würde.
Hier bist also nur DU selber als TO (=Thread Owner) gefragt das in die richtige Rubrik zu schieben. Batch und Shell gibt es übrigens bei Unix schon Jahrzehnte länger als bei Winblows. Soviel zur Voreingenommenheit