Lukas.: SSH Befel gesucht

Hallo,

ich habe 2 (entfernte) Server, auf die ich SSH-Zugriff (per User/Pass-Anmeldung) habe.

Welchen Befehl soll ich nutzen, um ein Verzeichnis rekursiv von Server A zu Server B zu kopieren?

Lukas

  1. Tach!

    Welchen Befehl soll ich nutzen, um ein Verzeichnis rekursiv von Server A zu Server B zu kopieren?

    Einpacken mit tar und dann mit scp verschicken. Am Ziel wieder auspacken. Alternativ geht auch rsync, das kann auch ssh.

    dedlfix.

    1. Schönen Sonntag dedlfix,

      ich dachte auch an scp oder rsync.

      Bei scp ist mein Problem, dass ich nicht weiß, wo ich das Passwort für den Backupserver eingeben muß.

      Zu rsync lese ich mir gerade eine Anleitung durch.

      Lukas

      1. Hallo nochmal Lukas,

        ich dachte auch an scp oder rsync.

        Bei scp ist mein Problem, dass ich nicht weiß, wo ich das Passwort für den Backupserver eingeben muß.

        Du meldest dich mit einer ssh-Konsole auf einem der beiden Hosts an und rufst dann den Befehl scp mit den Daten des Ziel-Hosts (also des anderen) auf. Der fragt dich dann nach dem Passwort.

        Wenn Du das öfter machen musst, ist es günstiger, ssh-Keys zu tauschen, sodass der eine Server beim anderen bekannt ist und automatisch authorisiert wird.

        Grüße
        TS

        --
        es wachse der Freifunk
        http://freifunk-oberharz.de
        1. Hallo TS,

          Wenn Du das öfter machen musst, ist es günstiger, ssh-Keys zu tauschen, sodass der eine Server beim anderen bekannt ist und automatisch authorisiert wird.

          Das ist zu kurz gegriffen.

          Es ist prinzipiell sinnvoll, Passwort-Authentifizierung für SSH auszuschalten. Passwörter sind chronisch unsicher (zu kurz, zu wenig Entropie, zu wenig Komplexität), keys sind da bedeutend sicherer.

          LG,
          CK

      2. Bei scp ist mein Problem, dass ich nicht weiß, wo ich das Passwort für den Backupserver eingeben muß.

        Danach fragt scp dich.

        Falls es um Backups geht, solltest du unbedingt rsync verwenden (so vorhanden), um nicht jedesmal eine komplette Kopie übertragen zu müssen; rsync überträgt nur geänderte Dateien bzw. Dateiteile.

        Der Aufruf ist einfach: Per ssh auf dem Quellserver einloggen und

        rsync -azv --delete quellverzeichnis/ deinname@backup.example.com:backupverzeichnis/

        Wichtig ist der Schrägstrich am Ende des Quellverzeichnisses. Mit Schrägstrich werden die Dateien im Quellverzeichnis kopiert, ohne Schrägstrich wird hingegen das Quellverzeichnis selbst kopiert.
        Obiger Aufruf kopiert also quellverzeichnis/a und quellverzeichnis/b nach backupverzeichnis/a und backupverzeichnis/b. Ohne Schrägstrich hinter quellverzeichnis wirst du stattdessen backupverzeichnis/quellverzeichnis/a und backupverzeichnis/quellverzeichnis/b auf dem Backupserver finden; es wurde also quellverzeichnis selbst auch kopiert.

        Mit der Option --dry-run kannst du rsync erstmal ausprobieren, ohne gleich den Backupserver plattzumachen.

        Für Backups interessant ist auch die Option --link-dest. Damit kannst du ein Verzeichnis auf dem Backupserver angeben, in dem sich eine vorherige Kopie befindet. Für nicht geänderte Dateien werden dann im (neu anzulegenden) Backupverzeichnis Hardlinks zu link-dest angelegt.
        Auf die Weise kannst du mehrere chronologische Backups anlegen, behältst also immer noch eine oder mehrere eigenständige Vorgängerversionen des Quellverzeichnisses, jedoch dank der Hardlinks ohne großen zusätzlichen Platzbedarf bei nicht geänderten Dateien.

        1. Hallo Tümpelfix Fahnenkrug :-))

          rsync -azv --delete quellverzeichnis/ deinname@backup.example.com:backupverzeichnis/

          Klapp ganz vorzüglich. Kannst Du mir die Parameter nochmal genau erklären, die ich da nutze? (--delete ist mir klar, v auch, aber a und z nicht)

          Auf die Weise kannst du mehrere chronologische Backups anlegen, behältst also immer noch eine oder mehrere eigenständige Vorgängerversionen des Quellverzeichnisses, jedoch dank der Hardlinks ohne großen zusätzlichen Platzbedarf bei nicht geänderten Dateien.

          Nette Sache, bei mir aber nicht nötig, da ich ein Repesetory hierfür nutze.

          Lukas

          1. rsync -azv --delete quellverzeichnis/ deinname@backup.example.com:backupverzeichnis/

            Kannst Du mir die Parameter nochmal genau erklären, die ich da nutze? (--delete ist mir klar, v auch, aber a und z nicht)

            -a ist ein Kürzel für ein halbes Dutzend Optionen, rsync durchläuft damit das gesamte Quellverzeichnis und behält bei den Kopien, so möglich, die Dateiattribute bei. -a steht schlicht für "archive", das möchte man eigentlich immer dabeihaben.

            -z schaltet die rsync-seitige Komprimierung ein, das soll effektiver sein als auf Übertragungsebene (lies: scp).

    2. Einpacken mit tar und dann mit scp verschicken. Am Ziel wieder auspacken. Alternativ geht auch rsync, das kann auch ssh.

      Hi dedlfix,

      kann man das in 1 Befehl machen? So, dass ich das quasi nachts als cron anwerfe?

      Lukas

      1. Hallo Lukas,

        Einpacken mit tar und dann mit scp verschicken. Am Ziel wieder auspacken. Alternativ geht auch rsync, das kann auch ssh.

        kann man das in 1 Befehl machen? So, dass ich das quasi nachts als cron anwerfe?

        Du kannst dir doch ein Shellscript schreiben dafür. Da kannst Du die Befehle dann beliebig kombinieren, fast so, wie Du es von Hochsprachen, wie C, PHP oder ähnlichen kennst.

        Dann solltest Du aber trotzdem vorher spezielle Backupuser anlegen und einen Schlüsseltausch zwischen den Hosts für diese Backupuser vornehmen.

        Grüße
        TS

        --
        es wachse der Freifunk
        http://freifunk-oberharz.de
        1. Hi TS,

          Du kannst dir doch ein Shellscript schreiben dafür. Da kannst Du die Befehle dann beliebig kombinieren, fast so, wie Du es von Hochsprachen, wie C, PHP oder ähnlichen kennst.

          Gute Idee.

          Dann solltest Du aber trotzdem vorher spezielle Backupuser anlegen und einen Schlüsseltausch zwischen den Hosts für diese Backupuser vornehmen.

          Den Schlüsseltausch habe ich inzwischen gemacht.

          Lukas

      2. Tach!

        Einpacken mit tar und dann mit scp verschicken. Am Ziel wieder auspacken. Alternativ geht auch rsync, das kann auch ssh.

        kann man das in 1 Befehl machen? So, dass ich das quasi nachts als cron anwerfe?

        Das kommt darauf an, was am Ende entstehen soll. Wenn eine Arbeitskopie auf dem anderen Rechner aktuell gehalten werden soll, dann rsync mit ssh. Und am besten mit Key-Authentifizierung. Man kann seine SSH-Daten übrigens auch in der ~/.ssh/config ablegen.

        Wenn es lediglich ein platzsparendes Backup sein soll, dann erstmal einpacken und die .tgz übertragen. In den Dateinamen kann man ein mit date '+%F' erzeuges Datum einbetten, um mehrere Versionen auf dem Ziel zu haben. Das hat nur den Nachteil, dass das wächst und man irgendwann löschend eingreifen muss.


        Apropos, da fällt mir doch ein, dass ich ebendieses Problem auch schon lange vor mir herschiebe und stattdessen ebenfalls händisch lösche. Und dafür suche ich eine automatisierte Lösung, gern als einsetzbares Code-Schnippselchen. Es geht um die Selfhtml-Server, die alle paar Stunden nach ebendiesem Prinzip jeweils eine einzelne Backup-Datei erstellen. Die werden extern nach Servern getrennt in eigenen Verzeichnissen abgelegt. Die Dateinamen sind servername-date '+%F_%H-%M'.tgz. Im "Klartext" ist der Datumsteil YYYY-MM-DD_hh-mm, also eine sortierfähige Darstellung.

        Das (bash-)Script sollte nun folgendes tun:

        • Die Dateien des aktuellen Tages bleiben unberührt.
        • Von den vergangenen x Tagen soll jeweils eine Datei aufgehoben werden, die mit der kleinsten Uhrzeit. x ist als Variable am Anfang des Scripts definiert.
        • Alle anderen Dateien sollen gelöscht werden.

        Wer wäre so nett und erstellt dafür die passenden Zeilen?

        dedlfix.

        1. Hi dedlfix,

          Das kommt darauf an, was am Ende entstehen soll. Wenn eine Arbeitskopie auf dem anderen Rechner aktuell gehalten werden soll, dann rsync mit ssh. Und am besten mit Key-Authentifizierung. Man kann seine SSH-Daten übrigens auch in der ~/.ssh/config ablegen.

          Ja, das solls sein und ich habs soeben nach erfolgreichem Test in den Cron gelegt.

          Wenn es lediglich ein platzsparendes Backup sein soll, dann erstmal einpacken und die .tgz übertragen. In den Dateinamen kann man ein mit date '+%F' erzeuges Datum einbetten, um mehrere Versionen auf dem Ziel zu haben. Das hat nur den Nachteil, dass das wächst und man irgendwann löschend eingreifen muss.

          Ja, sowas habe ich auch. Und ich lösche automatisch.

          Das (bash-)Script sollte nun folgendes tun:

          • Die Dateien des aktuellen Tages bleiben unberührt.
          • Von den vergangenen x Tagen soll jeweils eine Datei aufgehoben werden, die mit der kleinsten Uhrzeit. x ist als Variable am Anfang des Scripts definiert.
          • Alle anderen Dateien sollen gelöscht werden.

          Wer wäre so nett und erstellt dafür die passenden Zeilen?

          Ich lösche ein bischen anders... Ich lege eine Gesamtgröße fest, die meine Backups haben dürfen (z.b. 15GB). Mein Script löscht dann solange die älteste Datei, bis der Wert unterschritten wird. Das Script läuft seit ein paar Jahren bisher fehlerfrei durch und tut seinen Dienst.

          Wenn Du hiermit etwas anfangen kannst, schicke ich Dir die Datei gerne zu.

          Lukas

          1. Wenn Du hiermit etwas anfangen kannst, schicke ich Dir die Datei gerne zu.

            Ansonsten bräucht ich nochmal die genaue Struktur der Daten (bspw. Beispieldateinamen), dann kann ich mir das gerne mal ansehen. Wenns nur um eine Fleissaufgabe geht, bemühe ich mich gerne darum, um einen Teil der durch Dich bereits eingesparten Zeit wieder "auszugeben" ;-)

            Lukas

            1. Tach!

              Wenn Du hiermit etwas anfangen kannst, schicke ich Dir die Datei gerne zu.

              Ist die länger, als man hier posten kann? Ansonsten: dedlfix@selfhtml.org.

              Ansonsten bräucht ich nochmal die genaue Struktur der Daten (bspw. Beispieldateinamen), dann kann ich mir das gerne mal ansehen. Wenns nur um eine Fleissaufgabe geht, bemühe ich mich gerne darum, um einen Teil der durch Dich bereits eingesparten Zeit wieder "auszugeben" ;-)

              Vermutlich wird man da irgendwas mit sortierten Arrays oder ähnlich machen, von dem man einen Teil überspringt und den Rest abarbeitet. Die Dateinamen sind jedenfalls wie in
              servername-2016-09-18_00-15.tgz
              und zum Beispiel alle 3 Stunden eine weitere Datei.

              dedlfix.

              1. Hi dedlfix,

                Wenn Du hiermit etwas anfangen kannst, schicke ich Dir die Datei gerne zu.

                Ist die länger, als man hier posten kann? Ansonsten: dedlfix@selfhtml.org.

                Nein, könnt' ich auch hier posten, ist aber eine php Datei, also nicht das, was Du suchst.

                Vermutlich wird man da irgendwas mit sortierten Arrays oder ähnlich machen, von dem man einen Teil überspringt und den Rest abarbeitet. Die Dateinamen sind jedenfalls wie in
                servername-2016-09-18_00-15.tgz
                und zum Beispiel alle 3 Stunden eine weitere Datei.

                Darf ich mal rückfragen, warum Du nicht z.b. einfach die letzten 7 Tage unberührt läßt und alles andere zu löschst? (find /Pfad -name 'dateiname*' -cmin +10080 -delete)

                Oder werden die Backups der Server nicht zeit-, sondern volumengesteuert angelegt? Dann wärs natürlich unsinnig, nach Zeit zu löschen.

                Lukas

                1. Tach!

                  Darf ich mal rückfragen, warum Du nicht z.b. einfach die letzten 7 Tage unberührt läßt und alles andere zu löschst? (find /Pfad -name 'dateiname*' -cmin +10080 -delete)

                  Es steht auf dem externen Platz nicht so viel Speicher zur Verfügung, dass man da mehrere volle Tage ablegen kann. Ich möchte aber auch nicht nur einen Tag oder zwei aufheben sondern auch etwas mehr in die Vergangenheit. Der Kompromiss ist dabei, nur jeweils eine Version des Tages aufzuheben.

                  dedlfix.

                  1. Hi dedlfix,

                    Es steht auf dem externen Platz nicht so viel Speicher zur Verfügung, dass man da mehrere volle Tage ablegen kann. Ich möchte aber auch nicht nur einen Tag oder zwei aufheben sondern auch etwas mehr in die Vergangenheit. Der Kompromiss ist dabei, nur jeweils eine Version des Tages aufzuheben.

                    Heißt, Du sicherst mehrfach am Tag und möchtest dann von zb. einer Woche je Server das jeweils letzte Tagesbackup aufbewahren. Wie oft soll denn das "delete-Script" laufen? Weil, wenn das täglich läuft, macht das Mehrfachsichern des Tages gar nicht soviel Sinn. Du gewinnst dadurch ziemlich wenig und auch das nur für max. 24 Std. Wenn außerdem das Backup zeitgesteuert für alle Server abläuft, kannst Du z.b. täglich ab Mitternacht alle Dateien löschen, die z.b. älter als 120min. sind (vorausgesetzt natürlich, dass Deine letzten Backups, die Du behalten willst, jünger als diese 120min. sind) und anschließend noch alle Dateien löschen, die älter als z.b. 7 Tage sind.

                    find /Pfad -name 'dateiname*' -cmin +120 -delete;
                    find /Pfad -name 'dateiname*' -cmin +10080 -delete
                    

                    Oder habe ich Dich falsch verstanden?

                    Lukas

                    1. find /Pfad -name 'dateiname*' -cmin +120 -delete;
                      find /Pfad -name 'dateiname*' -cmin +10080 -delete
                      

                      Hier müsste natürlich noch bei der ersten Zeile angegeben werden, dass zusätzlich die Dateien nicht älter als 1440min sein darf.

                      Unterm Strich hättest Du aber den ganzen Tag lang alle Backups (Zitat:"der aktuelle Tag soll unberührt bleiben") und zudem die letzten 7 Tage immer nur das jüngste Tagesbackuop des jeweiligen Tages.

                      Lukas

                    2. Tach!

                      Heißt, Du sicherst mehrfach am Tag und möchtest dann von zb. einer Woche je Server das jeweils letzte Tagesbackup aufbewahren.

                      Ja. Die damit abgedeckten Szenarien sind, dass a) gerade eben etwas kaputtgegangen ist (zum Beispiel Hardware) und man das System wiederherstellen möchte und b) dass man später merkt, dass irgendwo was schief läuft und einen noch älteren Stand braucht, in dem das hoffentlich noch nicht kaputt war. In dem Fall kommt es nicht auf Stundenfeinheit an. Wenn ein paar Daten verlustig gegangen sind, dann ist das eben so - wir sind keine Bank.

                      Wie oft soll denn das "delete-Script" laufen?

                      Das kann eigentlich mit jeder neu übertragenen Backupdatei laufen, der aktuelle Tag soll ja unberührt bleiben und wenn von vergangenen Tagen nur noch eine Datei übrig blieb, dann bleibt die ja auch.

                      Weil, wenn das täglich läuft, macht das Mehrfachsichern des Tages gar nicht soviel Sinn. Du gewinnst dadurch ziemlich wenig und auch das nur für max. 24 Std.

                      Ja, das ist der Nachteil am ständigen Laufen, dass nach dem Tageswechsel recht schnell die Daten flöten gehen, die für a) wichtig wären. Also wird es wohl eher nur einmal und gegen Ende des Tages aufgerufen werden.

                      Wenn außerdem das Backup zeitgesteuert für alle Server abläuft, kannst Du z.b. täglich ab Mitternacht alle Dateien löschen, die z.b. älter als 120min. sind (vorausgesetzt natürlich, dass Deine letzten Backups, die Du behalten willst, jünger als diese 120min. sind) und anschließend noch alle Dateien löschen, die älter als z.b. 7 Tage sind.

                      Da müsste ich zu genau ein Zeitfenster festlegen, in dem die erste Datei des Tages erstellt werden muss, um aufgehoben zu werden. Damit wäre das Script nicht mehr so flexibel einsetzbar, dass man damit gleichzeitig stündliche und nur dreistündliche Sicherungen verwalten kann, ohne dass bei den stündlichen "zu viele" Dateien übrig bleiben. Oder dass zu wenige übrig bleiben, wenn ein Fehler in den ersten Stunden des Tages die Backup-Erzeugung oder Übertragung verhinderte.

                      dedlfix.

                      1. Tach!

                        Eigentlich ist das nicht allzu schwierig und große Teile des mir vorschwebenden Algorithmus kann ich auch selbst fabrizieren. Der Punkt, an dem ich eine (überwindbare) Hürde für mich sehe, ist dass in meinem Ansatz Arrays vorkommen und mir dazu das Handhabungsgrundlagenwissen für die bash fehlt. Es würde im Grunde genommen schon reichen, wenn jemand ein paar Schnippsel vorstellt, mit denen man Dateinamen in ein Array einliest, ein solches sortieren kann, wie man einen Eintrag entfernt und wie man über den Rest iteriert. Vielleicht wäre es kürzer gewesen, zu recherchieren als darüber zu reden, aber ... passiert halt.

                        dedlfix.

                        1. Tach!

                          Eigentlich ist das nicht allzu schwierig und große Teile des mir vorschwebenden Algorithmus kann ich auch selbst fabrizieren. Der Punkt, an dem ich eine (überwindbare) Hürde für mich sehe, ist dass in meinem Ansatz Arrays vorkommen und mir dazu das Handhabungsgrundlagenwissen für die bash fehlt. Es würde im Grunde genommen schon reichen, wenn jemand ein paar Schnippsel vorstellt, mit denen man Dateinamen in ein Array einliest, ein solches sortieren kann, wie man einen Eintrag entfernt und wie man über den Rest iteriert. Vielleicht wäre es kürzer gewesen, zu recherchieren als darüber zu reden, aber ... passiert halt.

                          Hi dedlfix,

                          ich glaube, Du kommst an Deinem Arrayansatz auch vorbei. Aber egal, ich habe selber nicht genügend Wissen um die Shellprogrammierung, als das ich eine Lösung hierfür hätte. Ich selber hätte es vermutlich so gemacht, dass ich ein Perl oder php Script hierfür hergenommen hätte.

                          Trotzdem, wenn Du eine Lösung hast, poste sie doch mal hier rein. Falls nicht und Du hast ne Woche Zeit, suche ich weiter nach einer Lösung...

                          Gruß, Lukas

          2. Hallo Lukas,

            Ja, das solls sein und ich habs soeben nach erfolgreichem Test in den Cron gelegt.

            Denk dran, dass der Cron-Daemon qualifizierte Pfade benötigt, also absolut zur File-Root (/)

            Grüße
            TS

            --
            es wachse der Freifunk
            http://freifunk-oberharz.de
            1. Hi TS,

              Denk dran, dass der Cron-Daemon qualifizierte Pfade benötigt, also absolut zur File-Root (/)

              Ja, na klar. Zudem lief bereits der Test über den Cron ;-)

              Lukas

  2. Hallo und guten Tag Lukas,

    ich habe 2 (entfernte) Server, auf die ich SSH-Zugriff (per User/Pass-Anmeldung) habe.

    Welchen Befehl soll ich nutzen, um ein Verzeichnis rekursiv von Server A zu Server B zu kopieren?

    Schau dir auch mal sshfs an -> Mangage dazu aufrufen oder einfach "sshfs --help" eingeben. Wenn es nicht installiert ist, kurz mit der zuständigen Paketverwaltung aus dem Repository installieren.

    Damit kannst Du dann den entfernten Server-1 (Teile davon) auf dem (entfernten) Server-2 mounten und damit umgehen, als lägen alle Daten auf Server-2.

    Grüße
    TS

    --
    es wachse der Freifunk
    http://freifunk-oberharz.de
    1. Hallo TS,

      Schau dir auch mal sshfs an -> Mangage dazu aufrufen oder einfach "sshfs --help" eingeben. Wenn es nicht installiert ist, kurz mit der zuständigen Paketverwaltung aus dem Repository installieren.

      Damit kannst Du dann den entfernten Server-1 (Teile davon) auf dem (entfernten) Server-2 mounten und damit umgehen, als lägen alle Daten auf Server-2.

      Danke für den Tip. Aber das hört sich momentan verlockender an, als es für mich sein wird, insb. weil mein "Server2" ein Billig-Web-Paket ist, bei dem ich wahrscheinlich froh sein kann, dass ich überhaupt SSH-Zugang habe. Das die für mich ein Paket extra installieren, halte ich für sehr unwahrscheinlich. Der dient mir aber auch nur als Backup-Server.

      Lukas

      1. Hallo Lukas,

        Danke für den Tip.

        Aber das hört sich momentan verlockender an, als es für mich sein wird, insb. weil mein "Server2" ein Billig-Web-Paket ist, bei dem ich wahrscheinlich froh sein kann, dass ich überhaupt SSH-Zugang habe. Das die für mich ein Paket extra installieren, halte ich für sehr unwahrscheinlich. Der dient mir aber auch nur als Backup-Server.

        Dann machst Du es eben umgekehrt und mountest einen Teil des Filesystems vom Backuphost in einen Mountpoint auf dem Haupthost.

        Grüße
        TS

        --
        es wachse der Freifunk
        http://freifunk-oberharz.de
        1. Hi TS,

          Dann machst Du es eben umgekehrt und mountest einen Teil des Filesystems vom Backuphost in einen Mountpoint auf dem Haupthost.

          Hast Du auch wieder recht. Aber jetzt erstmal 1 nach dem anderen. scp hat vorhin erstmals funktioniert. Es war, wie Du sagtest, es kam eine Passwortabfrage. Leider hat bisher das Übertragen des Schlüssels noch nicht geklappt, kann aber daran liegen, dass der Server komplett voll war. Ich versuch mal weiter...

          Lukas