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?
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?
Antworten:
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 verwenden
rsync
. Und ja, Sie brauchen auch rsync
auf der Remote-Seite genau wie bei scp
. Was SSH-Schlüssel betrifft, rsync
wird SSH standardmäßig verwendet -e ssh
. Wenn Sie also Schlüssel für die Verwendung mit eingerichtet haben scp
, funktionieren diese rsync
auch.
-r
macht keinen Unterschied. Das von Ihnen beschriebene Szenario funktioniert nur, wenn Sie ein Verzeichnis kopieren und das übergeordnete Zielverzeichnis vorhanden ist. So rsync foo/ u@h:~/
wird das Zielverzeichnis erstellt, foo
aber rsync foo/ u@h:~/bar/
nicht das Zielverzeichnis bar
. Dieser wird bar/foo
nur erstellt, wenn bar/
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 , wenn foo/
nicht vorhanden , sondern rsync file host:/foo/
erstellt das Verzeichnis und legt file
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:
$ scp -pr /source/directory user@host:the/target/directory
Wenn directory
in ~/the/target
on nicht vorhanden ist host
, 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 Fall scp
fehlschlägt.
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 nur ssh
auf dem Zielcomputer das Verzeichnis erstellen und dann kopieren. So etwas wie:
ssh user@host "mkdir -p /target/path/" &&
scp /path/to/source user@host:/target/path/
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:
scp ~/foo/ user@host:~/
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 Zielverzeichnis bar
existiert. In jedem Fall -r
hilft das Flag nicht beim Erstellen eines Zielverzeichnisses, wenn Sie einzelne Dateien kopieren.
Ja, du kannst. Laut Manpage von scp:
Mann scp
.....
-r Kopiert rekursiv ganze Verzeichnisse. Beachten Sie, dass scp symbolischen Links folgt, die im Tree Traversal auftreten.
....
scp -r foo/ u@h:~/bar
schaffen wird , bar/foo
wenn der Remote bar/
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 erstellen bar/
.
Ich benutze die folgende Funktion, bevor ich btrfs
Schnappschüsse übertrage ssh
:
check_remote_dir() {
printf "\ntesting remote directory: '$1' "
if ssh -p $PORT $ROOT@$REMOTE "[ ! -d $1 ]"; then
printf "\nCreating: $1 on $ROOT@$REMOTE\n"
ssh -p $PORT $ROOT@$REMOTE "mkdir -p $1"
else
printf "[OK]\n"
fi
}
Rufen Sie einfach die Funktion in Ihrem Skript auf mit:
check_remote_dir /my/remote/path
Sie können den Befehl mit dem Befehl mkdir verketten und dann auf den von Ihnen erstellten Ordner verweisen:
mkdir ~/new-folder/ && scp -P 22 <remote/url>:~/new-folder/
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:
rsync -e 'ssh -p22' -av -f"+ */" -f"- *" ~/.ssh backup@1.2.3.4:~/
scp -P22 ~/.ssh/id_rsa.pub backup@1.2.3.4:~/.ssh/authorized_keys
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.