Przesyłanie katalogów za pomocą sftp?


97

Mam problemy z przesyłaniem przez sftp katalogów (które zawierają inne katalogi kilka poziomów głębokości). Zdaję sobie sprawę, że mogłem obejść to przez gzipowanie, ale nie rozumiem, dlaczego jest to konieczne.

W każdym razie próbuję

sftp> put bin/
Uploading bin/ to /home/earlz/blah/bin
bin/ is not a regular file
sftp> put -r bin/
Uploading bin/ to /home/earlz/blah/bin
Couldn't canonicalise: No such file or directory
Unable to canonicalise path "/home/earlz/blah/bin"

Myślę, że ostatni komunikat o błędzie jest całkowicie głupi. Więc katalog nie istnieje? Dlaczego nie stworzyć katalogu?

Czy jest jakiś problem związany z sftp, czy powinienem po prostu użyć scp?

Odpowiedzi:


68

POPRAWIONO : Początkowo błędnie twierdziłem, że OpenSSH nie obsługuje put -r. Tak, ale robi to w bardzo dziwny sposób. Wygląda na to, że katalog docelowy już istnieje, o takiej samej nazwie jak katalog źródłowy.

sftp> put -r source
 Uploading source/ to /home/myself/source
 Couldn't canonicalize: No such file or directory
 etc.
sftp> mkdir source
sftp> put -r source
 Uploading source/ to /home/myself/source
 Entering source/
 source/file1
 source/file2

Co szczególnie dziwne, dotyczy to nawet sytuacji, gdy podasz inną nazwę miejsca docelowego:

sftp> put -r source dest
 Uploading source/ to /home/myself/dest
 Couldn't canonicalize: ...
sftp> mkdir dest
sftp> put -r source dest
 Uploading source/ to /home/myself/dest/source
 Couldn't canonicalize: ...
sftp> mkdir dest/source
sftp> put -r source dest
 Uploading source/ to /home/myself/dest/source
 Entering source/
 source/file1
 source/file2

Aby lepiej zaimplementować rekurencję put, można psftpzamiast tego użyć narzędzia wiersza polecenia PuTTY . Jest w putty-toolspakiecie pod Debianem (i najprawdopodobniej Ubuntu).

Alternatywnie Filezilla zrobi to, co chcesz, jeśli chcesz użyć GUI.


FYI: sftpzezwala put -rna OpenSSH 5.4
Tino

3
Dzięki - poprawiłem swoją odpowiedź. Najwyższy czas, co? ;-P
Jander

128

Nie wiem, dlaczego sftp to robi, ale możesz kopiować rekurencyjnie tylko wtedy, gdy katalog docelowy już istnieje. Więc zrób to ...

sftp> mkdir bin
sftp> put -r bin

1
-rwymaga OpenSSH 5.4 lub nowszego
Tino

22

Zamiast tego możesz być zainteresowany rsync. Polecenie to byłoby

 rsync --delete --rsh=ssh -av bin/ remote-ip-or-fqdn:/home/earlz/blah/bin/

Spowoduje to skopiowanie wszystkiego bin/i umieszczenie go na zdalnym serwerze w /home/earlz/blah/bin/. Jako dodatkową korzyść, najpierw sprawdzi, czy plik po stronie zdalnej nie zmienił się, a jeśli nie, nie wyśle ​​go ponownie. Dodatkowo możesz dodać opcję -z, która skompresuje ją za Ciebie.


Awsome! Tak prosty!
Asken,

3
Pamiętaj, że sftpjest to polecenie i protokół . rsyncnie obsługuje sftp-protocol.
Tino

9

lcd: twój folder lokalny (z podfolderami)

cd: twój zdalny folder

put -r .


tak naprawdę myślę, że jest to najbardziej poprawna odpowiedź ... w celu umieszczenia tam całego mojego folderu
nopole

sftp narzekał, kiedy zapisałem CD w lokalnym folderze nadrzędnym i próbowałem umieścić katalog według nazwy. Ale cdwkroczyłem do katalogu, który chciałem załadować. Dziękuję Ci!
karimkorun

8

Czy mogę zasugerować nieco skomplikowaną odpowiedź, bez zipowania, ale zawierającą smołę?

No to ruszamy:

tar -cf - ./bin | ssh target.org " ( cd /home/earlz/blah ; tar -xf - ) "

Spowoduje to spakowanie katalogu ./bin z tar (-cf: = utwórz plik), nazwa pliku - (brak, standardowe wyjście) i potokuj go przez polecenie ssh do target.org (który może być również adresem IP), gdzie polecenie w cudzysłowach wykonywane są: cd do bla i tar -xf (wypakuj plik) - brak, bez nazwy, po prostu stdin.

To tak, jakbyś spakował paczkę w domu, przyniósł ją na pocztę, a następnie pojechał do pracy, gdzie oczekujesz paczki i ją otworzył.

Być może istnieje o wiele bardziej eleganckie rozwiązanie, które korzysta tylko z sftp.


Pipowanie tarto bardzo dobre rozwiązanie, jednak wymaga ono sshwsparcia przy logowaniu ( sftpna dodatek inny protokół ssh). tar, w przeciwieństwie do innych, domyślnie działa rekurencyjnie, przesyła wszystkie pliki specjalne (FIFO, urządzenia blokowe / znakowe itp.), próbuje przetłumaczyć odwzorowanie UID / GID ze źródła na system docelowy i ma tradycyjną krótką linię poleceń. (Jeden wyjątek: „Gniazda domenowe Unix” nie są przesyłane. Ale kto ich potrzebuje?)
Tino

Używam tej metody, gdy potrzebuję kompresji między węzłami, a także możesz użyć pvnarzędzia do oglądania prędkości w długich transferach
Felipe Alcacibar


1

Możesz użyć rsync , który jest bardzo potężną alternatywą dla scp i sftp, szczególnie podczas aktualizacji kopii z komputera A na komputer B, ponieważ nie kopiuje on plików, które nie zostały zmienione; jest również w stanie usunąć pliki z komputera B, które zostały usunięte z komputera A (tylko wtedy, gdy zostanie o to poproszony).

na przykład :

rsync -zrp /home/a/ user@remote.host.com:/home/b/  

Opcja -r służy do rekurencyjnego kopiowania plików, -z włącza kompresję podczas przesyłania, a -p zachowuje uprawnienia do plików (tworzenie, edycja itp.) Podczas kopiowania, co jest czymś, czego scp nie robi AFAIK. Możliwych jest wiele innych opcji; jak zwykle czytaj strony podręcznika.
Oryginalna odpowiedź Karolosa


0

Zaloguj się do zdalnego serwera za pomocą ssh, użyj sftp, aby połączyć się ponownie z urządzeniem, a następnie użyj get -rpolecenia, aby przenieść katalogi na zdalny serwer. Polecenie get umożliwia rekurencyjne przesyłanie katalogów bez konieczności tworzenia katalogu.

ssh remote ip
sftp local ip 
get -r whichever-dir

0

Sprawa SFTP:

Musiałem skopiować tę strukturę na ftp:

mainfolder --- folder --- subfolder
                  |           |
              file1.txt   file2.txt

To rozwiązało mój problem:

cd ./mainfolder
mkdir folder
put -r /from/source/folder/* /mainfolder/folder/
cd ./folder
mkdir subfolder
put -r /from/source/folder/subfolder/* /mainfolder/folder/subfolder/

0

Właśnie dowiedziałem się z Arch Linux Wiki , że możliwe jest zamontowanie sftp-share za pomocą sshfs. Biegnę jak sftp-server z chroot i więzienia i sshfs działa bardzo dobrze.

  1. Uchwyt: sshfs <sftpuser>@<server>:<read/writable/directory> <your/local/mount/directory>
  2. Odmontuj: fusermount -u <your/local/mount/directory>
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.