{"id":910,"date":"2023-07-22T17:40:29","date_gmt":"2023-07-22T15:40:29","guid":{"rendered":"https:\/\/pcmacb.de\/?page_id=910"},"modified":"2025-09-16T16:55:01","modified_gmt":"2025-09-16T14:55:01","slug":"inkrementelles-backup-ueber-ssh-mit-zwei-skripten","status":"publish","type":"page","link":"https:\/\/pcmacb.de\/?page_id=910","title":{"rendered":"Inkrementelles Backup \u00fcber SSH mit zwei Skripten"},"content":{"rendered":"\n<p>Um ein Backup von einem Server &#8222;abzuholen&#8220;, eignet sich <em><strong>rsync<\/strong><\/em>, das eine genaue Synchronisation erm\u00f6glicht. <em><strong>Rsync<\/strong><\/em> kann inkrementelle Backups mit Hardlinks anlegen, so dass mit wenig Speicherplatz alle \u00c4nderungen \u00fcber einen festgelegten Zeitraum festzuhalten sind, \u00e4hnlich wie bei Apples &#8222;Time Machine&#8220;<\/p>\n\n\n\n<p>Zur H\u00e4rtung des externen Servers richte ich ein VPN ein und sperre den SSH Port in der Firewall. Ist das abgeschlossen, l\u00e4sst sich der Backup Rechner \u00fcber VPN und SSH mit zwei Zertifikaten passwortfrei verbinden und &#8222;nach Hause&#8220; synchronisieren. Die Skripte k\u00f6nnen per Cron Job automatisiert ausgef\u00fchrt werden.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Das erste Skript als Basis<\/h2>\n\n\n\n<p>Zuerst muss eine Basis angelegt werden, auf das das zweite Skript mit Hardlinks aufbaut. Zur Bereinigung wird das Basis-Skript alle paar Wochen einmal ausgef\u00fchrt:<\/p>\n\n\n\n<pre class=\"wp-block-code\" style=\"font-size:2px\"><code>#!\/bin\/sh\n# SELBSTLAUFCHECK: Wenn das Skript schon l\u00e4uft, beendet es sich sofort selbst\necho start $$\ntrap 'echo exit $$' 0\nexec 9&lt;\"$0\"\nflock -n 9 || exit 1\n\n#=========================================================\n# Eine Benachrichtigungs E-Mail vorbereiten\nTIME=\"$(LC_ALL=en_EN.utf8 date +%Y_%m_%d-%H%M)\"\nHDDSPACE=$(df -h)\nTO='To: root@domain.org'\nSUB='Subject: FULL Backup am '\nCONT=\"Content-Type: text\/plain; charset=\"utf-8\"\"\nLOG=\"\/root\/scripts\/log\/$TIME-backup.log\"\n  echo $TO &gt; $LOG\n  echo $SUB$DWE &gt;&gt; $LOG\n  echo $CONT &gt;&gt; $LOG\n  echo -e \"\\n \\n FULL Server Backup am $TIME \\n der Wochentag ist $DWE\" &gt;&gt; $LOG\n  echo -e \"\\n SERVER HDDs: \\n\" &gt;&gt; $LOG\n  echo \"$HDDSPACE\" &gt;&gt; $LOG\n\n#=========================================================\n# m\u00f6gliche bestehende Tunnel abschalten\nkillall openvpn\n#=========================================================\n# pr\u00fcfen, ob der Server erreichbar ist:\n# das Skript bleibt jetzt so lange in der Schleife,\n# bis der Server erreichbar ist\n\necho \"Waiting to launch on 22...\"\nwhile ! nc -z 10.11.10.10 22; do\n  sleep 0.2 # alle 2\/10 Sekunde wird gepr\u00fcft\ndone\n\necho \"ssh verbunden - los gehts\"\nsleep 2\n#=========================================================\n\nrsync -azvP --delete --exclude-from=\/root\/scripts\/exlist --rsync-path='rsync' -e 'ssh -i \/root\/.ssh\/SSHCERT' root@10.11.10.10:\/ \/pfad\/zum\/back\/up\/FULL\/\nkillall openvpn 2&gt;\/dev\/null\n\nexit 0\n<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Zweites Skript f\u00fcr inkrementelles Backup<\/h3>\n\n\n\n<p>Das zweite Skript legt bei jedem Start ein Verzeichnis des Wochentags an, dessen Turnus willk\u00fcrlich gew\u00e4hlt wird. Mit der Option <em>&#8211;link-dest=..\/FULL\/<\/em> werden <a href=\"https:\/\/en.m.wikipedia.org\/wiki\/Hard_link\" data-type=\"link\" data-id=\"https:\/\/en.m.wikipedia.org\/wiki\/Hard_link\">Hardlinks angelegt<\/a>, also nur tats\u00e4chlich ge\u00e4nderte Daten auf die Festplatte geschrieben.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/sh\n# SELBSTLAUFCHECK: Wenn das Skript schon l\u00e4uft,\n# beendet es sich sofort selbst\necho start $$\ntrap 'echo exit $$' 0\nexec 9&lt;\"$0\"\nflock -n 9 || exit 1\n\n#====================================================\n# Datums \/ Wochentags Variablen setzen, um Verzeichnisse \n# f\u00fcr einen 2 Wochen Turnus anzulegen\nTWO=\"$(LC_ALL=en_EN.utf8 date +%a)\"\nKWO=`date --date=-1week +%V`\n# Entfernt f\u00fchrende NULL und setzt richtigen Wert falls KW=0\nKWO=\"${KWO#\"${KWO%%&#91;!0]*}\"}\" &amp;&amp; : \"${KWO:=0}\"\n# Anzahl der Wochen -1, die gesichert werden sollen, also hier zwei\nlet KWR=$KWO%3\nDWE=$KWR$TWO\n\n#====================================================\n# Mail vorbereiten\nTIME=\"$(LC_ALL=en_EN.utf8 date +%Y_%m_%d-%H%M)\"\nHDDSPACE=$(df -h)\nTO='To: user@domain'\nSUB='Subject: inkr. Backup am '\nCONT=\"Content-Type: text\/plain; charset=\"utf-8\"\"\nLOG=\"\/root\/scripts\/log\/$TIME-backup.log\"\n  echo $TO &gt; $LOG\n  echo $SUB$DWE &gt;&gt; $LOG\n  echo $CONT &gt;&gt; $LOG\n  echo -e \"\\n \\n Did inkr. Server Backup on $TIME \\n der Wochentag ist $DWE\" &gt;&gt; $LOG\n  echo -e \"\\n Server HDDs: \\n\" &gt;&gt; $LOG\n  echo \"$HDDSPACE\" &gt;&gt; $LOG\n\n#====================================================\n# m\u00f6gliche bestehende Tunnel abschalten\nkillall openvpn 2&gt;\/dev\/null\n\n#Tunnel aufbauen\nmkdir \/run\/openvpn-client 2&gt;\/dev\/null\nopenvpn --config \/etc\/openvpn\/erstesVPN.conf\n\n#====================================================\n# pr\u00fcfen, ob der Server erreichbar ist:\n# das Skript bleibt jetzt so lange in der Schleife,\n# bis der Server erreichbar ist\necho \"Waiting to launch on 22...\"\nwhile ! nc -z 10.11.10.10 22; do\n  sleep 0.2\ndone\necho \"launched ssh - los gehts\"\nsleep 2\n\n#====================================================\nrsync -azvP --delete --exclude-from=\/root\/scripts\/exlist --link-dest=..\/FULL\/ --rsync-path='rsync' -e 'ssh -i \/root\/.ssh\/SSHCERT' root@10.11.10.10:\/ \/pfad\/zum\/back\/up\/$DWE\/\n\nkillall openvpn 2&gt;\/dev\/null\n\n#====================================================\n# Mail schicken\n\/usr\/sbin\/sendmail -bm user@domain &lt; $LOG\nexit 0<\/code><\/pre>\n\n\n\n<p class=\"has-small-font-size\">um das Backup wieder zum Server zur\u00fcck zu kopieren, kann folgender Befehl genutzt werden. Hiermit wird das letzte Backup der Homepage zur\u00fcck auf den Server synchronisiert &#8211; das defekte Verzeichnis sollte vorher gesichert o. umbenannt werden.<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code>rsync -azvP \/pfad\/zum\/back\/up\/speziell\/ --rsync-path='rsync' -e 'ssh -i \/root\/.ssh\/SSHCERT' root@V.P.N.ip:\/pfad\/wo\/auch\/immer\/speziell\/<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Um ein Backup von einem Server &#8222;abzuholen&#8220;, eignet sich rsync, das eine genaue Synchronisation erm\u00f6glicht. Rsync kann inkrementelle Backups mit Hardlinks anlegen, so dass mit wenig Speicherplatz alle \u00c4nderungen \u00fcber einen festgelegten Zeitraum festzuhalten sind, \u00e4hnlich wie bei Apples &#8222;Time <a class=\"more-link\" href=\"https:\/\/pcmacb.de\/?page_id=910\">weiterlesen&#8230;<\/a><\/p>\n","protected":false},"author":3,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_lmt_disableupdate":"","_lmt_disable":"","footnotes":""},"class_list":["post-910","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/pcmacb.de\/index.php?rest_route=\/wp\/v2\/pages\/910","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pcmacb.de\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/pcmacb.de\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/pcmacb.de\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/pcmacb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=910"}],"version-history":[{"count":19,"href":"https:\/\/pcmacb.de\/index.php?rest_route=\/wp\/v2\/pages\/910\/revisions"}],"predecessor-version":[{"id":1430,"href":"https:\/\/pcmacb.de\/index.php?rest_route=\/wp\/v2\/pages\/910\/revisions\/1430"}],"wp:attachment":[{"href":"https:\/\/pcmacb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=910"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}