Kann scp ein Verzeichnis erstellen, wenn es nicht existiert?

88

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?

AGamePlayer
quelle

Antworten:

71

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 :

  1. Vor rsync2.6.0 (1. Januar 2004) musste sich das -e sshFlag so verhalten, scpdass es standardmäßig das veraltete RSH-Protokoll verwendet .

  2. scpund rsyncteilen Sie einige Flags, aber es gibt nur ein wenig Überlappung.

  3. 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.

Warren Young
quelle
Ich verwende Mac OSX. Muss ich rsync sowohl lokal als auch remote installieren?
AGamePlayer
Durchsuchte rsyncdie Dokumentationsseite, konnte nicht finden, wie man sich mit ssh-key anmeldet. Ich möchte den Benutzernamen / das Passwort nicht zum Anmelden verwenden
AGamePlayer
@AwQiruiGuo: Mac OS X wird mit ausgeliefert 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.
Warren Young
1
@WarrenYoung -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.
Terdon
1
Ja, ich habe auch damit gespielt. Es scheint, als würde die Angabe eines Dateinamens ebenfalls zum Fehlschlagen führen. So 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.
Terdon
35

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.

John
quelle
1
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?
MadMike
16

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.

terdon
quelle
3

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.

....

YoMismo
quelle
7
Dadurch wird das übergeordnete Zielverzeichnis nicht erstellt. Es kann ein Verzeichnis an einen vorhandenen Speicherort kopieren. So scp -r foo/ u@h:~/barschaffen wird , bar/foowenn der Remote bar/existiert aber fehl , wenn es nicht der Fall ist.
Terdon
1
Es wird nicht scheitern. Der 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.
YoMismo
6
Ja, aber das funktioniert nur, wenn Sie Verzeichnisse kopieren , keine Dateien. scp -r file host:~/bar/wird nicht erstellen bar/.
Terdon
3

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

Stuart Cardall
quelle
Ich mache so ziemlich dasselbe, aber ich muss das Passwort manuell eingeben (aus Sicherheitsgründen), so dass ich es am Ende mindestens zweimal
Stefan Reich
0

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/
Ducky
quelle
3
(1) Die Frage lautet "automatisch". Dies scheint nicht automatisch zu sein. (2) Dies scheint nur eine triviale Variante von Terdons Antwort zu sein .
G-Man
0

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 [email protected]:~/
scp -P22 ~/.ssh/id_rsa.pub [email protected]:~/.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.

user3132194
quelle