
Alles, was unten beschrieben wird, wird über ein Bash-Skript erledigt.
Ich möchte den Status einer definierten Gruppe von Dateien auf einer definierten Gruppe von Remote-Hosts erfassen. Der „Status“ einer Datei hängt vom Dateityp ab:
- Normale Datei: vollständiger Pfad, Inhalt der Datei, Modus, Eigentümer, Gruppe
- Symbolischer Link: vollständiger Pfad des Links selbst, der gezeigte Pfad, Modus (immer 777), Besitzer, Gruppe
- Verzeichnis: vollständiger Pfad, Modus, Besitzer, Gruppe
Wenn ich eine lokale Datei erstelle, um den Zustand einer Remote-Datei darzustellen, unterscheide ich zwischen Dateien mit demselben vollständigen Pfad, die sich jedoch auf verschiedenen Hosts unterscheiden, indem ich an den lokalen Dateinamen einen Hash der oben aufgeführten Merkmale anhänge. Dann tarne ich die Remote-Datei (nicht rekursiv, so dass ich im Fall eines VerzeichnissesNurdas Verzeichnis), leite es über SSH weiter, entpacke es auf meinen lokalen Rechner und mv es in den Dateinamen mit angehängtem Hash. Ich verwende tar, weil es die Eigenschaften bewahrt, die mir wichtig sind.
HASH=$(ssh -n "$ONE_HOST" "{ cat $ONE_FILE_PATH; stat -c \"%a %u %g %F\" $ONE_FILE_PATH; } | sha512sum")
ONE_HASH=${ONE_HASH:0:20}
TARGET_FILENAME_FOR_COPY="$FILENAME"."$ONE_HASH"
TARGET_PATH_FOR_COPY="$TARGET_DIRECTORY_FOR_COPY"/"$TARGET_FILENAME_FOR_COPY"
ssh -n "$ONE_HOST" \
"tar -C $DIRECTORY --no-recursion -cf - $FILENAME" | \
tar -xf - -C "$TARGET_DIRECTORY_FOR_COPY"
mv "$TARGET_PATH_UNHASHED" "$TARGET_PATH_FOR_COPY"
Dies ist alles vorhanden und funktioniert.
Nun zum Fall vonreguläre Dateien, ich muss zusätzlich sensible Dateien verarbeiten, deren Inhalt ich nicht kopieren möchte (obwohl der Inhalt weiterhin im Hash dargestellt wird). Mein Ziel ist es, genau dieselbe lokale Datei zu erstellen, die ich im oben beschriebenen Prozess erstellen würde, aber die Datei sollte leer sein und nicht den Inhalt der Remote-Datei enthalten.
Hinweis: Ich kann die Datei nicht kopieren und dann den Inhalt der Kopie leeren. Da es sich um eine vertrauliche Datei handelt, darf ihr Inhalt nicht über das Netzwerk übertragen werden.
Ich kenne keine Möglichkeit, Tar dazu zu bringen, eine „Shell“ einer regulären Datei zu übertragen, die den Modus, den Besitzer und die Gruppe der Datei enthält, aber den Inhalt im Tarball auslässt. Sofern niemand einen Trick kennt, um Tar dazu zu bringen, dies zu tun, muss ich mir wohl einen anderen Mechanismus als Tar ansehen.
Wie kann ich dies am einfachsten erreichen?
UPDATE #1
Ein Ansatz, den ich versuche, besteht darin, zunächst eine temporäre Kopie der Datei zu erstellen (mitcp -pum die Dateiattribute beizubehalten, die mir wichtig sind) auf dem Remote-System, leeren Sie diese temporäre Datei (mitabschneiden -s 0), und kopiere das dann mit tar / ssh auf meinen lokalen Rechner, wie oben beschrieben. Das ist umständlich und unelegant. Ich hoffe, einen Weg zu finden, dies zu tun, ohne auf die Verwendung einer temporären Datei zurückgreifen zu müssen.
Antwort1
Sie könnten vor dem Ausführen von Tar eine leere Datei über den vertraulichen Dateien mounten.
touch /tmp/emptyfile
mount --bind /tmp/emptyfile /home/user/.ssh/id_rsa
Oder etwas ähnliches.