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ć?
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:
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 :
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 .
scpi rsyncudostępniamy niektóre flagi, ale nakładają się one tylko na siebie.
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.
rsyncstronę dokumentacji, nie znalazłem sposobu na użycie ssh-key do logowania. Nie chcę używać nazwy użytkownika / hasła do logowania
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.
-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.
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ę.
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.
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?
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.
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.
…
scp -r foo/ u@h:~/barstworzy bar/foojeśli zdalny bar/istnieje, ale nie powiedzie się, jeśli tak nie jest.
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.
scp -r file host:~/bar/nie stworzy bar/.
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
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/
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.