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ć?
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ć?
Odpowiedzi:
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 logowania
rsync
. I tak, potrzebujesz również rsync
po drugiej stronie, tak jak z scp
. 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życia scp
, 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ęc rsync foo/ u@h:~/
utworzy katalog docelowy, foo
ale rsync foo/ u@h:~/bar/
nie utworzy katalogu docelowego bar
. Ten stworzy bar/foo
tylko, 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/file
nie powiedzie, jeśli foo/
nie istnieje, ale rsync file host:/foo/
tworzy katalog i miejsca file
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:
$ scp -pr /source/directory user@host:the/target/directory
Jeśli directory
nie istnieje w ~/the/target
dniu host
, 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 zamierzony scp
błąd.
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 prostu ssh
przejść 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 ~/foo
na zdalny host, możesz użyć -r
flagi (rekurencyjnej):
scp ~/foo/ user@host:~/
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 że bar
istnieje katalog docelowy . W każdym razie -r
flaga 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:~/bar
stworzy bar/foo
jeśli zdalny bar/
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, to scp
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 stworzy bar/
.
Przed przesłaniem btrfs
migawek 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.