Ich möchte scpDateien 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 scpDateien 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 rsyncman tun kann.
Wenn Sie eine Version von verwenden, rsyncdie 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-sourceund sein Inhalt $HOME/path/local-dirauf die entfernte Maschine und erstellt alle benötigten Verzeichnisse
rsyncEs 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 rsyncBefehl Folgendes voranstellen :
$ ssh remote-host 'mkdir -p foo/bar/qux'
Dadurch wird der $HOME/foo/bar/quxBaum erstellt, wenn er nicht vorhanden ist. Es wird nichts anderes schlecht beschweren oder tun , wenn es nicht bereits vorhanden ist .
rsynchat 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 rsync2.6.0 (1. Januar 2004) musste sich das -e sshFlag so verhalten, scpdass es standardmäßig das veraltete RSH-Protokoll verwendet .
scpund rsyncteilen Sie einige Flags, aber es gibt nur ein wenig Überlappung.
Bei Verwendung SSHals Übertragungsprotokoll werden rsyncdieselben Standardeinstellungen verwendet. Genauso scpwird davon ausgegangen, dass auf dem Remotecomputer standardmäßig ein Benutzer mit demselben Namen wie Ihr lokaler Benutzer vorhanden ist.
rsyncdie 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 rsyncauf der Remote-Seite genau wie bei scp. Was SSH-Schlüssel betrifft, rsyncwird SSH standardmäßig verwendet -e ssh. Wenn Sie also Schlüssel für die Verwendung mit eingerichtet haben scp, funktionieren diese rsyncauch.
-rmacht 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, fooaber rsync foo/ u@h:~/bar/nicht das Zielverzeichnis bar. Dieser wird bar/foonur 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/fileschlägt fehl , wenn foo/nicht vorhanden , sondern rsync file host:/foo/erstellt das Verzeichnis und legt filedarin. 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 directoryin ~/the/targeton nicht vorhanden ist host, wird es erstellt. Wenn dies jedoch ~the/targetnicht 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 scpfehlschlägt.
scp: /home/madmike/test_bin: No such file or directorySobald 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ß, scpkann sich das nicht leisten, nein. Sie können jedoch nur sshauf 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 ~/fooauf den Remote-Host zu kopieren , können Sie das -rFlag (rekursiv) verwenden:
scp ~/foo/ user@host:~/
Dadurch wird das Zielverzeichnis ~/fooauf dem Remote-Host erstellt. Das übergeordnete Verzeichnis kann jedoch nicht erstellt werden. scp ~/foo user@host:~/bar/fooschlägt fehl, es sei denn, das Zielverzeichnis barexistiert. In jedem Fall -rhilft 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:~/barschaffen wird , bar/foowenn der Remote bar/existiert aber fehl , wenn es nicht der Fall ist.
fooInhalt 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, scpwird 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 btrfsSchnappschü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.