Ich möchte scp
Dateien hochladen, aber manchmal existiert das Zielverzeichnis nicht.
Ist es möglich, den Ordner automatisch zu erstellen? Wenn das so ist, wie? Wenn nicht, welchen alternativen Weg kann ich versuchen?
Dies ist eines der vielen Dinge, die rsync
man tun kann.
Wenn Sie eine Version von verwenden, rsync
die in den letzten Jahren veröffentlicht wurde, ¹ ist die grundlegende Befehlssyntax ähnlich der folgenden scp
: ²
$ rsync -r local-dir remote-machine:path
Das kopiert local-source
und sein Inhalt $HOME/path/local-dir
auf die entfernte Maschine und erstellt alle benötigten Verzeichnisse
rsync
Es gibt hier einige Einschränkungen, die sich darauf auswirken können, ob dies in Ihrer speziellen Situation funktioniert. Es werden beispielsweise nicht mehrere Ebenen fehlender Remote-Verzeichnisse erstellt. es wird nur bis zu einer fehlenden Ebene auf der Fernbedienung erstellt. Sie können dies leicht umgehen, indem Sie dem rsync
Befehl Folgendes voranstellen :
$ ssh remote-host 'mkdir -p foo/bar/qux'
Dadurch wird der $HOME/foo/bar/qux
Baum erstellt, wenn er nicht vorhanden ist. Es wird nichts anderes schlecht beschweren oder tun , wenn es nicht bereits vorhanden ist .
rsync
hat manchmal andere überraschende Verhaltensweisen. Im Grunde bitten Sie es, herauszufinden, was Sie kopieren wollten, und seine Vermutungen stimmen möglicherweise nicht mit Ihren Annahmen überein. Probieren Sie es aus und sehen Sie. Wenn es sich nicht wie erwartet verhält und Sie nicht sehen können, warum, geben Sie weitere Details zu Ihren lokalen und Remote-Verzeichnis-Setups ein und geben Sie den von Ihnen ausgeführten Befehl ein.
Fußnoten :
Vor rsync
2.6.0 (1. Januar 2004) musste sich das -e ssh
Flag so verhalten, scp
dass es standardmäßig das veraltete RSH-Protokoll verwendet .
scp
und rsync
teilen Sie einige Flags, aber es gibt nur ein wenig Überlappung.
Bei Verwendung SSH
als Übertragungsprotokoll werden rsync
dieselben Standardeinstellungen verwendet. Genauso scp
wird davon ausgegangen, dass auf dem Remotecomputer standardmäßig ein Benutzer mit demselben Namen wie Ihr lokaler Benutzer vorhanden ist.
rsync
die Dokumentationsseite, konnte nicht finden, wie man sich mit ssh-key anmeldet. Ich möchte den Benutzernamen / das Passwort nicht zum Anmelden verwendenrsync
. Und ja, Sie brauchen auchrsync
auf der Remote-Seite genau wie beiscp
. Was SSH-Schlüssel betrifft,rsync
wird SSH standardmäßig verwendet-e ssh
. Wenn Sie also Schlüssel für die Verwendung mit eingerichtet habenscp
, funktionieren diesersync
auch.-r
macht keinen Unterschied. Das von Ihnen beschriebene Szenario funktioniert nur, wenn Sie ein Verzeichnis kopieren und das übergeordnete Zielverzeichnis vorhanden ist. Sorsync foo/ u@h:~/
wird das Zielverzeichnis erstellt,foo
aberrsync foo/ u@h:~/bar/
nicht das Zielverzeichnisbar
. Dieser wirdbar/foo
nur erstellt, wennbar/
vorhanden. In jedem Fall lädt das OP Dateien hoch, und selbst in den Fällen, in denen dies funktioniert, funktioniert es nur für ganze Verzeichnisse.rsync file host:/foo/file
schlägt fehl , wennfoo/
nicht vorhanden , sondernrsync file host:/foo/
erstellt das Verzeichnis und legtfile
darin. Seltsam. Wie auch immer, Sie haben vollkommen recht und das Basisszenario funktioniert. Ich werde meine Ablehnung zurückziehen.Wenn Sie eine Gruppe von Dateien kopieren, nicht wirklich. Wenn Sie ein Verzeichnis und den gesamten Inhalt darunter kopieren, ja. Mit diesem Befehl:
Wenn
directory
in~/the/target
on nicht vorhanden isthost
, wird es erstellt. Wenn dies jedoch~the/target
nicht der Fall ist, werden Sie wahrscheinlich Probleme haben. Ich kann mich nicht an die genauen Ergebnisse dieses Falls erinnern, bin jedoch darauf vorbereitet, dass der beabsichtigte Fallscp
fehlschlägt.quelle
scp: /home/madmike/test_bin: No such file or directory
Sobald das Zielverzeichnis fehlt, bricht dies in meinem Setup ab. Verwendung von cygwin auf dem Client und RHEL 6.9 auf dem Server. Was ist dein Setup?Soweit ich weiß,
scp
kann sich das nicht leisten, nein. Sie können jedoch nurssh
auf dem Zielcomputer das Verzeichnis erstellen und dann kopieren. So etwas wie:Beachten Sie, dass das oben Genannte nicht benötigt wird, wenn Sie ganze Verzeichnisse kopieren. Um beispielsweise das Verzeichnis
~/foo
auf den Remote-Host zu kopieren , können Sie das-r
Flag (rekursiv) verwenden:Dadurch wird das Zielverzeichnis
~/foo
auf dem Remote-Host erstellt. Das übergeordnete Verzeichnis kann jedoch nicht erstellt werden.scp ~/foo user@host:~/bar/foo
schlägt fehl, es sei denn, das Zielverzeichnisbar
existiert. In jedem Fall-r
hilft das Flag nicht beim Erstellen eines Zielverzeichnisses, wenn Sie einzelne Dateien kopieren.quelle
Ja, du kannst. Laut Manpage von scp:
quelle
scp -r foo/ u@h:~/bar
schaffen wird ,bar/foo
wenn der Remotebar/
existiert aber fehl , wenn es nicht der Fall ist.foo
Inhalt wird in das neue Verzeichnis kopiert/bar
. Natürlich wurde der Name geändert, was möglicherweise nicht den Wünschen des OP entspricht. Wenn eine neue Baumstruktur auf dem Zielcomputer erstellt werden soll,scp
wird der Job nicht ausgeführt. Wenn Sie eine Baumstruktur aus einem bestimmten Zweig im Baum replizieren möchten, wird diese Struktur erstellt.scp -r file host:~/bar/
wird nicht erstellenbar/
.Ich benutze die folgende Funktion, bevor ich
btrfs
Schnappschüsse übertragessh
:Rufen Sie einfach die Funktion in Ihrem Skript auf mit:
check_remote_dir /my/remote/path
quelle
Sie können den Befehl mit dem Befehl mkdir verketten und dann auf den von Ihnen erstellten Ordner verweisen:
quelle
Wenn nur scp oder sftp ohne verfügbares ssh (von rssh) zulässig ist, können Verzeichnisse erstellt werden, indem ein leerer Verzeichnisbaum mit rsync kopiert und anschließend Dateien kopiert werden.
So lege ich den öffentlichen SSH-Schlüssel auf den Remote-Host, wenn SSH-Kopie-ID nicht funktioniert und das SSH-Verzeichnis nicht vorhanden ist:
Es ist möglich, diese Befehle in einem rsync zu kombinieren und einen weiteren Include-Filter in der Mitte hinzuzufügen, wenn der Name der Zieldatei identisch ist.
quelle