Discussion:
rsync + ssh: nur das letzte Verzeichnis kopieren
(zu alt für eine Antwort)
Wolfgang Klein
2019-12-01 18:56:23 UTC
Permalink
Moin!


Auf einem entfernten Rechner liegen mehrere VZ wie diese:

/home/backup/VZ_1/
/home/backup/VZ_2/
/home/backup/VZ_3/
...
/home/backup/VZ_n/


Nur das "höchste" VZ, also das zuletzt erstellte, soll auf den lokalen
Rechner kopiert werden. Der Befehl

rsync -e "ssh -i .ssh/backup" -a ***@server: ./lokal

kopiert stumpf alle VZ auf dem Server. Was ich aber bräuchte, wäre etwas
in dieser Art:

rsync -e "ssh -i .ssh/backup" -a ***@server:$(ls -d1 | tail -1) lokal/


Aber so einfach geht das dann doch nicht. Ist das überhaupt machbar?




Wolfgang
Helmut Waitzmann
2019-12-01 20:40:12 UTC
Permalink
Post by Wolfgang Klein
/home/backup/VZ_1/
/home/backup/VZ_2/
/home/backup/VZ_3/
...
/home/backup/VZ_n/
Nur das "höchste" VZ, also das zuletzt erstellte, soll auf den lokalen
Rechner kopiert werden. Der Befehl
entfvz="$(
ssh -i .ssh/backup \
'set "" */ && shift "$(( $# - 1 ))" && printf %s "$1"'
)"

steckt den Namen des letzten der auf dem entfernten Rechner liegenden
Verzeichnisse in die Shell‐Variable „entfvz“.
Post by Wolfgang Klein
kopiert stumpf alle VZ auf dem Server. Was ich aber bräuchte, wäre etwas
Aber so einfach geht das dann doch nicht. Ist das überhaupt machbar?
Zusammengenommen könnte vielleicht (denn ich kenne „rsync“ nicht
näher) folgendes funktionieren:

(
entfvz="$(
ssh -i .ssh/backup \
'set "" */ && shift "$(( $# - 1 ))" && printf %s "$1"'
)" &&
rsync -e 'ssh -i .ssh/backup' -a ***@server:"$entfvz" \
lokal/
)
Helmut Waitzmann
2019-12-02 10:13:19 UTC
Permalink
Post by Helmut Waitzmann
Post by Wolfgang Klein
/home/backup/VZ_1/
/home/backup/VZ_2/
/home/backup/VZ_3/
...
/home/backup/VZ_n/
Nur das "höchste" VZ, also das zuletzt erstellte, soll auf den
lokalen Rechner kopiert werden. Der Befehl
entfvz="$(
ssh -i .ssh/backup \
'set "" */ && shift "$(( $# - 1 ))" && printf %s "$1"'
)"
steckt den Namen des letzten der auf dem entfernten Rechner liegenden
Verzeichnisse in die Shell‐Variable „entfvz“.
Strenggenommen gehen dabei (also wegen "$(…)") Newline‐Zeichen am
Ende des Verzeichnisnamens verloren (in diesem Fall wohl nicht
relevant, weil die angegebenen Verzeichnisnamen keine am Ende
enthalten).
Christian Weisgerber
2019-12-01 21:04:40 UTC
Permalink
rsync ohne Ziel listet die verfügbaren Quelldateien auf.
Zum Ausprobieren:

rsync -e "ssh -i .ssh/backup" ***@server:

rsync -e "ssh -i .ssh/backup" ***@server:/home/backup/VZ_\*

Den Rest kannst du dir dann selbst basteln.
--
Christian "naddy" Weisgerber ***@mips.inka.de
Wolfgang Klein
2019-12-01 22:25:57 UTC
Permalink
Post by Christian Weisgerber
rsync ohne Ziel listet die verfügbaren Quelldateien auf.
Klasse! Danke! :)




Wolfgang
Wolfgang Klein
2019-12-06 09:45:30 UTC
Permalink
Post by Christian Weisgerber
rsync ohne Ziel listet die verfügbaren Quelldateien auf.
Funktioniert soweit. :)

Ist dieses Auflisten der möglichen Dateien abhängig von der auf der
Gegenseite verwendeten Standard-Shell, oder muss ich mir darum keine
Gedanken machen?


Wolfgang
Stefan Wiens
2019-12-06 10:18:01 UTC
Permalink
Post by Wolfgang Klein
Post by Christian Weisgerber
rsync ohne Ziel listet die verfügbaren Quelldateien auf.
Funktioniert soweit. :)
Ist dieses Auflisten der möglichen Dateien abhängig von der auf der
Gegenseite verwendeten Standard-Shell, oder muss ich mir darum keine
Gedanken machen?
Näheres siehe die Manpage zur Option --list-only. Das Format bestimmt
ssh selbst.
--
Stefan
Helmut Waitzmann
2019-12-07 01:22:11 UTC
Permalink
Post by Wolfgang Klein
Post by Christian Weisgerber
rsync ohne Ziel listet die verfügbaren Quelldateien auf.
Funktioniert soweit. :)
Ist dieses Auflisten der möglichen Dateien abhängig von der auf der
Gegenseite verwendeten Standard-Shell, oder muss ich mir darum keine
Gedanken machen?
Meines Wissens startet ssh auf der Gegenseite das Programm, das
als Shell in der Benutzerdatenbank für denjenigen Benutzer
eingetragen ist, wenn derjenige Benutzer für den ssh‐Zugang nichts
anderes („forced command“) konfiguriert hat.

Der ssh‐Aufrufer hat meines Wissens keine Möglichkeit, ssh zu
befehlen, was an der Gegenseite als Shell gestartet wird, noch
kann ssh erfragen, was an der Gegenseite als Shell gestartet wird.

=> rsync als ssh‐Aufrufer hat diese Möglichkeit ebenfalls nicht.


=> rsync kann nicht wissen, was derjenige Benutzer als Shell
konfiguriert hat.

=> rsync muss Annahmen über das richtige Zusammensetzen der an den
Shell der Gegenseite zu übermittelnden Kommandozeile machen, die
richtig oder falsch sein können.

=> Du als Eigentümer des Benutzeraccounts der Gegenseite musst den
ssh‐Zugang passend konfigurieren, damit rsync mit seinen Annahmen
nicht falsch liegt.
Post by Wolfgang Klein
Ist dieses Auflisten der möglichen Dateien abhängig von der auf der
Gegenseite verwendeten Standard-Shell, oder muss ich mir darum keine
Gedanken machen?
Du musst dir entsprechende Gedanken machen.


Ich habe rsync schon lange nicht mehr angesehen.


Vor Jahren hat rsync weder das notwendige Quoting für den Shell
der Gegenseite nicht durchgeführt (was es auch nicht kann, s. o.),
noch in der Dokumentation den Benutzer darauf hingewiesen, dass
der als Aufrufer dafür verantwortlich ist, die Dateinamen für die
Gegenseite passend shell‐quoted anzugeben.

Damit hat rsync also die Annahme gemacht, der Shell auf der
Gegenseite bekäme keine Kommandozeile sondern eine
execve‐Parameterliste.

Diese Annahme ist definitiv falsch:  ssh übermittelt eine
Kommandozeile, keine Parameterliste.

Das stand im Widerspruch zur Dokumentation, die nichts davon
beschrieb, dass rsync notwendiges Quoting für den Shell der
Gegenseite unterlässt und es deshalb vom Aufrufer vorzunehmen ist.

Daraufhin habe ich von rsync die Finger gelassen, und ich habe
nicht weiter verfolgt, ob der Fehler (in der Dokumentation)
inzwischen behoben ist.

Beispiel:  Angenommen, man wollte auf der Gegenseite im
HOME‐Verzeichnis das Unterverzeichnis „ein Verzeichnis“ (mit
Leerraum im Namen) anfassen.  Dann scheiterte der rsync‐Aufruf

„rsync -e "ssh -i .ssh/backup" \
'***@server:/home/backup/ein Verzeichnis'“,

weil der Shell der Gegenseite als Teil der Kommandozeile den Text


„/home/backup/ein Verzeichnis“

anstelle von


„'/home/backup/ein Verzeichnis'“

übermittelt bekam.
Helmut Waitzmann
2019-12-07 16:06:02 UTC
Permalink
Vor Jahren hat rsync weder das notwendige Quoting für den Shell der
Gegenseite nicht durchgeführt (was es auch nicht kann, s. o.), noch in
Da erste „nicht“ ist zuviel.  Richtig ist:

Vor Jahren hat rsync weder das notwendige Quoting für den Shell der
Gegenseite durchgeführt (was es auch nicht kann, s. o.), noch in…
der Dokumentation den Benutzer darauf hingewiesen, dass der als
Aufrufer dafür verantwortlich ist, die Dateinamen für die Gegenseite
passend shell‐quoted anzugeben.
Loading...