Chcę używać scp
do 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ć?
To jedna z wielu rzeczy, które rsync
można zrobić.
Jeśli używasz wersji rsync
wydanej 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-source
jego zawartości $HOME/path/local-dir
na komputer zdalny, tworząc wymagane katalogi .³
rsync
ma 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 rsync
polecenie następującą komendą:
$ ssh remote-host 'mkdir -p foo/bar/qux'
Spowoduje to utworzenie $HOME/foo/bar/qux
drzewa, jeśli ono nie istnieje. To nie będzie narzekać, czy czegokolwiek innego zła, jeśli nie istnieje.
rsync
czasami 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 :
Przed rsync
wersją 2.6.0 (1 stycznia 2004 r.) -e ssh
Flaga wymagała, aby zachowywała się tak, scp
ponieważ domyślnie był to przestarzały protokół RSH .
scp
i rsync
udostępniamy niektóre flagi, ale nakładają się one tylko na siebie.
Gdy używasz SSH
jako protokołu przesyłania, rsync
używa tych samych ustawień domyślnych. Tak więc, scp
zakładamy, że na komputerze zdalnym jest domyślnie użytkownik o tej samej nazwie co użytkownik lokalny.
rsync
stronę dokumentacji, nie znalazłem sposobu na użycie ssh-key do logowania. Nie chcę używać nazwy użytkownika / hasła do logowaniarsync
. I tak, potrzebujesz równieżrsync
po drugiej stronie, tak jak zscp
. Jeśli chodzi o klucze SSH,rsync
to w rzeczywistości używa SSH pod spodem z ustawieniami domyślnymi-e ssh
, więc jeśli masz skonfigurowane klucze do użyciascp
, one również będą działaćrsync
.-r
nie robi różnicy. Opisany scenariusz działa tylko wtedy, gdy kopiujesz katalog i jeśli istnieje docelowy katalog nadrzędny. Tak więcrsync foo/ u@h:~/
utworzy katalog docelowy,foo
alersync foo/ u@h:~/bar/
nie utworzy katalogu docelowegobar
. Ten stworzybar/foo
tylko, jeślibar/
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.rsync file host:/foo/file
nie powiedzie, jeślifoo/
nie istnieje, alersync file host:/foo/
tworzy katalog i miejscafile
w nim. Dziwne. W każdym razie masz całkowitą rację, a podstawowy scenariusz działa, wycofam moją opinię.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:
Jeśli
directory
nie istnieje w~/the/target
dniuhost
, zostanie on utworzony. Jeśli jednak~the/target
nie istnieje, prawdopodobnie będziesz mieć problemy - nie pamiętam dokładnych wyników tego przypadku, ale przygotuj się na zamierzonyscp
błąd.źródło
scp: /home/madmike/test_bin: No such file or directory
Gdy 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?O ile mi wiadomo,
scp
sama nie może tego zrobić, nie. Możesz jednak po prostussh
przejść do komputera docelowego, utworzyć katalog, a następnie skopiować. Coś jak:Pamiętaj, że jeśli kopiujesz całe katalogi, powyższe nie jest potrzebne. Na przykład, aby skopiować katalog
~/foo
na zdalny host, możesz użyć-r
flagi (rekurencyjnej):Spowoduje to utworzenie katalogu docelowego
~/foo
na zdalnym hoście. Nie można jednak utworzyć katalogu nadrzędnego.scp ~/foo user@host:~/bar/foo
zakończy się niepowodzeniem, chyba żebar
istnieje katalog docelowy . W każdym razie-r
flaga nie pomoże utworzyć katalogu docelowego, jeśli kopiujesz pojedyncze pliki.źródło
Tak, możesz. Według strony podręcznika scp:
źródło
scp -r foo/ u@h:~/bar
stworzybar/foo
jeśli zdalnybar/
istnieje, ale nie powiedzie się, jeśli tak nie jest.foo
zawartość 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, toscp
nie wykonasz zadania, jeśli chcesz replikować strukturę drzewa z pewnej gałęzi drzewa, wówczas ta struktura zostanie utworzona.scp -r file host:~/bar/
nie stworzybar/
.Przed przesłaniem
btrfs
migawek używam następującej funkcjissh
:Wystarczy wywołać funkcję w skrypcie za pomocą:
check_remote_dir /my/remote/path
źródło
Możesz połączyć to polecenie z poleceniem mkdir, a następnie odwołać się do utworzonego folderu:
źródło
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:
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.
źródło