Czy scp może utworzyć katalog, jeśli nie istnieje?


88

Chcę używać scpdo przesyłania plików, ale czasami katalog docelowy może nie istnieć.

Czy możliwe jest automatyczne utworzenie folderu? Jeśli tak to jak? Jeśli nie, jaki alternatywny sposób mogę spróbować?

Odpowiedzi:


71

To jedna z wielu rzeczy, które rsyncmożna zrobić.

Jeśli używasz wersji rsyncwydanej w ciągu ostatnich kilku lat, ¹ jego podstawowa składnia poleceń jest podobna do scp: ²

$ rsync -r local-dir remote-machine:path

Spowoduje to skopiowanie local-sourcejego zawartości $HOME/path/local-dirna komputer zdalny, tworząc wymagane katalogi .³

rsyncma tutaj pewne ograniczenia, które mogą wpłynąć na to, czy zadziała w twojej konkretnej sytuacji. Nie stworzy na przykład wielu poziomów brakujących katalogów zdalnych; utworzy tylko jeden brakujący poziom na pilocie. Możesz to łatwo obejść, poprzedzając rsyncpolecenie następującą komendą:

$ ssh remote-host 'mkdir -p foo/bar/qux'

Spowoduje to utworzenie $HOME/foo/bar/quxdrzewa, jeśli ono nie istnieje. To nie będzie narzekać, czy czegokolwiek innego zła, jeśli nie istnieje.

rsyncczasami ma inne zaskakujące zachowania. Zasadniczo pytasz go, aby dowiedzieć się, co chciałeś skopiować, a jego domysły mogą nie pasować do twoich założeń. Wypróbuj i przekonaj się. Jeśli nie zachowuje się tak, jak się spodziewasz i nie możesz zrozumieć, dlaczego, opublikuj więcej szczegółów na temat ustawień lokalnego i zdalnego katalogu i podaj wypróbowane polecenie.


Przypisy :

  1. Przed rsyncwersją 2.6.0 (1 stycznia 2004 r.) -e sshFlaga wymagała, aby zachowywała się tak, scpponieważ domyślnie był to przestarzały protokół RSH .

  2. scpi rsyncudostępniamy niektóre flagi, ale nakładają się one tylko na siebie.

  3. Gdy używasz SSHjako protokołu przesyłania, rsyncużywa tych samych ustawień domyślnych. Tak więc, scpzakładamy, że na komputerze zdalnym jest domyślnie użytkownik o tej samej nazwie co użytkownik lokalny.


Używam Mac OSX, czy muszę instalować rsync zarówno po stronie lokalnej, jak i zdalnej?
AGamePlayer

przeszukaliśmy rsyncstronę dokumentacji, nie znalazłem sposobu na użycie ssh-key do logowania. Nie chcę używać nazwy użytkownika / hasła do logowania
AGamePlayer

@AwQiruiGuo: Mac OS X jest dostarczany z rsync. I tak, potrzebujesz również rsyncpo drugiej stronie, tak jak z scp. Jeśli chodzi o klucze SSH, rsyncto w rzeczywistości używa SSH pod spodem z ustawieniami domyślnymi -e ssh, więc jeśli masz skonfigurowane klucze do użycia scp, one również będą działać rsync.
Warren Young,

1
@WarrenYoung -rnie robi różnicy. Opisany scenariusz działa tylko wtedy, gdy kopiujesz katalog i jeśli istnieje docelowy katalog nadrzędny. Tak więc rsync foo/ u@h:~/utworzy katalog docelowy, fooale rsync foo/ u@h:~/bar/nie utworzy katalogu docelowego bar. Ten stworzy bar/footylko, jeśli bar/istnieje. W każdym razie PO przesyła pliki, a nawet w przypadkach, w których działa, działa tylko dla całych katalogów.
terdon

1
Tak, ja też się tym bawiłem. Wygląda na to, że podanie nazwy pliku również powoduje jego awarię. Tak się rsync file host:/foo/filenie powiedzie, jeśli foo/nie istnieje, ale rsync file host:/foo/tworzy katalog i miejsca filew nim. Dziwne. W każdym razie masz całkowitą rację, a podstawowy scenariusz działa, wycofam moją opinię.
terdon

35

Jeśli kopiujesz grupę plików, to nie do końca. Jeśli kopiujesz katalog i całą zawartość poniżej, tak. Biorąc pod uwagę to polecenie:

$ scp -pr /source/directory user@host:the/target/directory

Jeśli directorynie istnieje w ~/the/targetdniu host, zostanie on utworzony. Jeśli jednak ~the/targetnie istnieje, prawdopodobnie będziesz mieć problemy - nie pamiętam dokładnych wyników tego przypadku, ale przygotuj się na zamierzony scpbłąd.


1
scp: /home/madmike/test_bin: No such file or directoryGdy tylko brakuje katalogu docelowego, powoduje to przerwy w mojej instalacji. Używanie cygwin na kliencie i RHEL 6.9 na serwerze. Jaka jest twoja konfiguracja?
MadMike,

16

O ile mi wiadomo, scpsama nie może tego zrobić, nie. Możesz jednak po prostu sshprzejść do komputera docelowego, utworzyć katalog, a następnie skopiować. Coś jak:

ssh user@host "mkdir -p /target/path/" &&
    scp /path/to/source user@host:/target/path/

Pamiętaj, że jeśli kopiujesz całe katalogi, powyższe nie jest potrzebne. Na przykład, aby skopiować katalog ~/foona zdalny host, możesz użyć -rflagi (rekurencyjnej):

scp ~/foo/ user@host:~/

Spowoduje to utworzenie katalogu docelowego ~/foona zdalnym hoście. Nie można jednak utworzyć katalogu nadrzędnego. scp ~/foo user@host:~/bar/foozakończy się niepowodzeniem, chyba że baristnieje katalog docelowy . W każdym razie -rflaga nie pomoże utworzyć katalogu docelowego, jeśli kopiujesz pojedyncze pliki.


3

Tak, możesz. Według strony podręcznika scp:

man scp

.....

-r Rekurencyjnie kopiuj całe katalogi. Zauważ, że scp podąża za symbolicznymi łączami napotkanymi podczas przechodzenia przez drzewo.


7
To nie utworzy docelowego katalogu nadrzędnego. Może skopiować katalog do istniejącej lokalizacji. Tak więc, scp -r foo/ u@h:~/barstworzy bar/foojeśli zdalny bar/istnieje, ale nie powiedzie się, jeśli tak nie jest.
terdon

1
To nie zawiedzie. Skopiuje foozawartość do nowego katalogu /bar. Oczywiście nazwa została zmieniona, co może nie być tym, czego chce OP. Jeśli chcesz nowej struktury drzewa utworzonej na maszynie docelowej, to scpnie wykonasz zadania, jeśli chcesz replikować strukturę drzewa z pewnej gałęzi drzewa, wówczas ta struktura zostanie utworzona.
YoMismo

6
Tak, ale działa to tylko wtedy, gdy kopiujesz katalogi , a nie pliki. scp -r file host:~/bar/nie stworzy bar/.
terdon

3

Przed przesłaniem btrfsmigawek używam następującej funkcji 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
}

Wystarczy wywołać funkcję w skrypcie za pomocą:

check_remote_dir /my/remote/path


Robię prawie to samo, ale muszę wpisać hasło ręcznie (ze względów bezpieczeństwa), więc co najmniej dwa razy muszę je wpisać ...
Stefan Reich,

0

Możesz połączyć to polecenie z poleceniem mkdir, a następnie odwołać się do utworzonego folderu:

mkdir ~/new-folder/ && scp -P 22 <remote/url>:~/new-folder/

3
(1) Pytanie brzmi „automatycznie”. Nie wydaje się to być automatyczne. (2) To wydaje się być tylko trywialną odmianą odpowiedzi Terdona .
G-Man,

0

W przypadku ograniczenia tylko do scp lub sftp bez dostępnego ssh (przez rssh) możliwe jest tworzenie katalogów poprzez kopiowanie pustego drzewa katalogów za pomocą rsync, a następnie kopiowanie plików.

W ten sposób umieszczam publiczny klucz ssh na zdalnym hoście, gdy ssh-copy-id nie działa, a katalog .ssh nie istnieje:

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

Możliwe jest połączenie tych poleceń w jedną rsync, dodając jeszcze jeden filtr dołączania w środku, jeśli nazwa pliku docelowego jest taka sama.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.