Beachten Sie, dass ich die Datei nicht zuerst lokal speichern kann - sie ist zu groß.
Diese (widerwärtige) Seite (ganz nach unten scrollen) scheint eine Antwort zu geben, aber ich habe Probleme, den Teil zu entwirren, der spezifisch für Bandlaufwerke ist:
Um dies konkreter zu machen, gehen Sie wie folgt vor:
Auf lokaler Maschine:
% echo "pretend this string is a huge amt of data" | scp - remote.com:big.txt
(Dabei wird die Konvention verwendet, die von scp nicht unterstützt wird: Ersetzen Sie die Quelldatei durch einen Bindestrich, um sie von stdin abzurufen.)
Antworten:
Sie können eine Pipe in ssh ausführen und einen Remote-Befehl ausführen. In diesem Fall ist der Remote-Befehl,
cat > big.txt
der stdin in diebig.txt
Datei kopiert .Es ist einfach und unkompliziert, solange Sie mit ssh eine Verbindung zum Remote-Ende herstellen können.
Sie können
nc
die Daten auch mit (NetCat) übertragen. Auf dem empfangenden Computer (z. B. host.example.com):Dies wird eingerichtet
nc
, um Port 1234 abzuhören und alles, was an diesen Port gesendet wird, in diebig.txt
Datei zu kopieren . Dann auf dem sendenden Rechner:Dieser Befehl weist
nc
die sendende Seite an, eine Verbindung zu Port 1234 des Empfängers herzustellen und die Daten von stdin über das Netzwerk zu kopieren.Die
nc
Lösung hat jedoch einige Nachteile:ssh
.ssh
Lösung können Sie die Übertragung von nur einem der Endpunkte aus starten.quelle
tar -cvzf >(ssh destination 'cat > file') huge_directory_tree
nc
bietet auch die Verschlüsselung und Komprimierung Ihrer Daten standardmäßig und vor allem: Fehlererkennung. Ich hatte Situationen, in denen ichnc
mit einem fehlerhaften Netzwerktreiber gearbeitet habe und beschädigte Daten unentdeckt übertragen wurden. SSH schlägt in dieser Situation fehl, da fehlerhafte Daten nicht entschlüsselt / dekomprimiert werden können.Ssh benutzen:
quelle
Verwenden Sie nc (Net Cat), wodurch die Datei nicht lokal gespeichert werden muss.
quelle
nc
. Ich habe einmal ein Raw-Image von einem Computer auf einen anderen kopiert, um erst viel später festzustellen, dass mein Netzwerktreiber fehlerhaft war und fehlerhafte Bits übertragen hat. Verwendungscp
,ssh
oder irgendetwas anderes , das Ihnen sagen , wenn ein Übertragungsfehler ist.Verwenden Sie eine FIFO-Pipe:
quelle
scp
beschwerte sich, dass mypipe keine reguläre datei war.mkfifo
, um die Pipe zu erstellen.)scp <(ls) destination
Danke Denis Scherbakov!
Als ich dein Skript in der Hetzner Cloud ausprobiert habe, habe ich bekommen
Es wurde jedoch nur eine Datei ohne Inhalt erstellt. Da der eigentliche Inhalt bereits mit openssl verschlüsselt ist, brauchen wir scp eigentlich nicht. Das in Linux eingebaute Programm
ftp
verfügt auch über hervorragende Piping-Funktionen. Also hier ist meine (noch recht manuelle) Lösung:quelle
Hier ist eine alternative Lösung:
In allen obigen Beispielen für ssh + cat wird davon ausgegangen, dass "cat" auf dem Zielsystem verfügbar ist.
In meinem Fall verfügte das System (Hetzner-Backup) über ein sehr restriktives Tool-Set, das SFTP anbot, jedoch keine vollständige Shell. Die Verwendung von ssh + cat war also nicht möglich. Ich habe eine Lösung gefunden, die das undokumentierte "scp -t" -Flag verwendet. Das vollständige Skript finden Sie weiter unten.
Update 2019.05.08:
Nachstehend finden Sie eine viel einfachere und kürzere Version.
quelle
scp -t
? Im Moment haben Sie ein vollständiges Skript, das in hohem Maße an Ihre Umgebung angepasst / lokalisiert ist. Eine gute Sache für das Hetzner-Wiki, aber nicht für Superuser, bei denen die meisten Leute nur nach einer Möglichkeit suchen, Eingaben über scp weiterzuleiten.