Kopieren von Dateien

  • Urspruenglicher Autor: Dirk Deimeke
  • Urspruengliches Datum: 12.08.2011

Auch das gehoert zum Adminalltag dazu, das Finden von Loesungen, die die Gegebenheiten beruecksichtigen.

Die Aufgabe ist prinzipiell ganz einfach, kopiere ein Verzeichnis inklusive aller Rechte von Rechner A auf Rechner B. „Eigentlich“ ganz einfach, wenn da nicht eine Reihe an Nebenbedingungen waeren.

  • Als root ist die Anmeldung auf dem Zielsystem nicht moeglich.
  • Alle Verzeichnisse auf die der eigene User Schreibrechte hat, bieten nicht genug Platz fuer die Daten. Auch nicht, wenn man sie komprimiert.
  • Um root werden zu koennen, wird sudo mit Passwort benutzt.
  • Konfigruationsdateien duerfen, erst recht nicht die sudoers-Datei nicht geaendert werden, da kein genehmigter Change Request vorliegt.
  • Verzeichnisrechte auf dem Zielsystem duerfen auch nicht geaendert werden (oder gar ein Verzeichnis fuer den eigenen User erstellt werden).

Klingt nahezu unmoeglich, ist es aber nicht. Wir nutzen eine Eigenschaft von sudoaus, um die Daten zu kopieren. Die Variable passwd_timeout gibt die Zeit in Minuten an, wie haeufig sudo nach einem Passwort fragen soll. Im Standard steht sie auf 5, wenn also einmal das Passwort für ein sudo-Kommando eingegeben wurde, wird fuenf Minuten lang nicht erneut nach dem Passwort gefragt. Das funktioniert sogar prozessuebergreifend, was ich persoenlich fuer ein Sicherheitsproblem halte. Meiner Meinung nach sollte der Timeout abgelaufen sein, wenn man die Shell verlaesst.

gtar steht fuer GNU tar, nicht zu verwechseln mit dem normalen tar auf Unix-Systemen. DIR ist das Verzeichnis, das uebertragen werden soll und TARGET ist das Verzeichnis in dem DIR auf dem Zielsystem B liegen wird.

ssh dirk@B "sudo ls"
gtar czf - DIR | ssh dirk@B "( cd TARGET ; sudo gtar xzvf - )"

Mit dem ersten Befehl wird eine Verbindung auf das Zielsystem aufgebaut und nach dem sudo-Passwort gefragt. Der zweite Befehl erstellt eine mit gzip komprimierte tar-Datei und schreibt sie nach STDOUT. Das wird mit dem Pipe-Symbol | an den zweiten Teil übergeben, der eine Verbindung zum Zielsystem aufbaut, in das Zielverzeichnis wechselt und dort den Datenstrom von STDIN liest, entpackt und auf die Platte schreibt.

Ja, ok, das ist „von hinten durch die Brust ins Auge“, aber es funktioniert sehr gut.

Update: Drueben bei Google+ wurde ich darauf hingewiesen, dass ssh mit -t aufgerufen werden muss, um die Moeglichkeit zur Passworteingabe zu bekommen. Das ist voellig korrekt und war bei uns bereits in den Optionen enthalten.

Zurück zur Uebersicht