From 483c60f1db125e7d38268b2f1be6c609342a09ad Mon Sep 17 00:00:00 2001 From: rschaten Date: Thu, 6 Jan 2005 10:48:37 +0000 Subject: [PATCH] Tar-Bruecke eingebaut --- beispiele.tex | 21 --------------- schmutzige_tricks.tex | 62 ++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 59 insertions(+), 24 deletions(-) diff --git a/beispiele.tex b/beispiele.tex index 1807763..d3cca9e 100644 --- a/beispiele.tex +++ b/beispiele.tex @@ -51,27 +51,6 @@ echo Die Katze ist aus dem Haus, Zeit, da Die Schleife wird nämlich dann so lange ausgeführt, bis \texttt{grep}\index{grep=\texttt{grep}} einen Fehler (bzw. eine erfolglose Suche) zurückmeldet. -\section{Eine Datei zeilenweise bearbeiten} - -\texttt{cat datei.txt | while read i} - -\begin{lstlisting} -#!/bin/sh -count=0 -cat /etc/passwd | while read i; do - uid=`echo $i | cut -f 3 -d:` - if [ $uid -lt 100 ]; then - count=`expr $count + 1` - echo $count - fi -done -echo Es sind $count Benutzer mit einer ID kleiner 100 eingetragen -\end{lstlisting} - -TODO!!! Daten aus Subshell hochreichen - -Achtung! while ist eine Subshell - Daten müssen hochgereicht werden. - \section{Ein typisches Init-Skript}\label{init-skript}\index{Init-Skript} Dieses Skript dient dazu, den Apache HTTP-Server zu starten. Es wird während des Bootvorgangs gestartet, wenn der dazugehörige Runlevel initialisiert wird. diff --git a/schmutzige_tricks.tex b/schmutzige_tricks.tex index cbe934f..ee545fa 100644 --- a/schmutzige_tricks.tex +++ b/schmutzige_tricks.tex @@ -24,10 +24,66 @@ haben. \section{Die Tar-Brücke} -TODO!!! tar-Brücke +Eine sogenannte Tar-Brücke benutzt man, wenn eine oder mehrere Dateien zwischen +Rechnern übertragen werden sollen, aber kein Dienst wie SCP oder FTP zur +Verfügung steht. Außerdem hat die Methode den Vorteil, daß Benutzerrechte und +andere Dateiattribute bei der Übertragung erhalten +bleiben\footnote{Vorausgesetzt natürlich, daß der Benutzer auf der entfernten +Seite über die nötigen Rechte verfügt.}. -%ssh 192.168.2.1 tar clf - / | (cd /mnt; tar xf - ) -%tar cf - $j | rsh $i "(mkdir -p $PWD ;cd $PWD; tar xf -)" +Der Trick besteht darin, auf einer Seite der Verbindung etwas mit \texttt{tar} +einzupacken, dies durch eine Pipe auf die andere Seite der Verbindung zu +bringen und dort wieder zu entpacken. + +Wenn dem Kommando \texttt{tar} an Stelle eines Dateinamens ein Minus-Zeichen +als Archiv gegeben wird, benutzt es~---~je nach der gewählten Aktion~---~die +Standard-Ein- bzw. -Ausgabe. Diese kann an ein weiteres \texttt{tar} übergeben +werden um wieder entpackt zu werden. + +Ein Beispiel verdeutlicht diese Kopier-Fähigkeit: + +\texttt{tar cf - . | ( cd /tmp/backup; tar xf - )} + +Hier wird zunächst der Inhalt des aktuellen Verzeichnisses `verpackt'. Das +Resultat wird an die Standard-Ausgabe geschrieben. Auf der Empfängerseite der +Pipe wird eine Subshell geöffnet. Das ist notwendig, da das empfangende +\texttt{tar} in einem anderen Verzeichnis laufen soll. In der Subshell wird +zunächst das Verzeichnis gewechselt. Dann liest ein \texttt{tar} von der +Standard-Eingabe und entpackt alles was er findet. Sobald keine Eingaben mehr +kommen, beendet sich der Prozeß mitsamt der Subshell. + +Am Ziel-Ort finden sich jetzt die gleichen Dateien wie am Quell-Ort. + +Das ließe sich lokal natürlich auch anders lösen. Man könnte erst ein Archiv +erstellen, das dann an anderer Stelle wieder auspacken. Nachteil: Es muß +genügend Platz für das Archiv vorhanden sein. Denkbar wäre auch ein in den Raum +gestelltes \texttt{cp -Rp * /tmp/backup}. Allerdings fehlen einem dabei +mitunter nützliche \texttt{tar}-Optionen\footnote{Mit \texttt{-l} verläßt +\texttt{tar} beispielsweise nicht das File-System. Nützlich wenn eine Partition +gesichert werden soll.}, und die oben erwähnte Brücke wäre mit einem reinen +\texttt{cp} nicht möglich. + +Eine Seite der Pipe kann nämlich auch ohne Probleme auf einem entfernten +Rechner `stattfinden'. Kommandos wie \texttt{ssh} oder \texttt{rsh} (letzteres +nur unter Vorsicht einsetzen!) schlagen die Brücke zu einem anderen System, +dort wird entweder gepackt und versendet oder quasi die Subshell gestartet und +gelesen. Das sieht wie folgt aus: + +\texttt{ssh 192.168.2.1 tar clf - / | (cd /mnt/backup; tar xf - )} + +Hier wird auf einem entfernten Rechner die Root-Partition verpackt, per SSH in +das lokale System geholt und lokal im Backup-Verzeichnis entpackt. + +Der Weg in die andere Richtung ist ganz ähnlich: + +\texttt{tar cf - datei.txt | ssh 192.168.2.1 \dq(mkdir -p \$PWD ;cd \$PWD; tar xf -)\dq} + +Hier wird die Datei verpackt und versendet. Eine Besonderheit gegenüber dem +vorigen Beispiel bestehtdarin, daß das Zielverzeichnis bei Bedarf erstellt +wird, bevor die Datei dort entpackt wird. Zur Erklärung: Die Variable +\texttt{\$PWD} wird, da sie nicht von Ticks `gesichert' wird, schon lokal durch +die Shell expandiert. An dieser Stelle erscheint also auf dem entfernten System +der Name des aktuellen Verzeichnisses auf dem lokalen System. \section{Binaries inside}