Використання sftp для передачі каталогу?


50

Коли я намагаюся використовувати sftp для передачі каталогу, що містить файли, я отримую повідомлення про помилку:

skipping non-regular file directory_name

Каталог містить пару файлів і два підкаталоги.

Що я роблю неправильно?

Відповіді:


49

sftp, як cpі scp, вимагає, щоб, копіюючи папку (і її вміст, очевидно), ви повинні чітко сказати їй, що ви хочете передати папку рекурсивно за допомогою -rпараметра.

Отже, додайте -rдо команди.


2
-r після команди put? Я отримую повідомлення про помилку "put: Invalid flag -r", якщо я це роблю. Додавання його до оригінальної команди sftp також не працює.
хазіз

5
Додайте -rдо sftpкоманди під час з'єднання. sftp -r user@host
Кевін

1
@Kevin Я отримую таку помилку "sftp: невідомий варіант --r"
Amatya

2
Пам'ятайте , що існує досить довго стояти помилка в SFTP в OpenSSH: при копіюванні рекурсивно каталогу на віддалений сервер, сам каталог повинен вже існувати на цільовому сервері в іншому випадку передача буде випадати з повідомленням без явної помилки: Couldn't canonicalise: No such file or directory.
WhiteWinterWolf

5
має бути щось на кшталт:# sftp user@remote-host #> get -r remote-folder
hbinduni

21

Я можу лише запропонувати, ви використовуєте rsync. Це переміщення файлів по захищеним з'єднанням.

rsync -alPvz ./source_dir server.com:destination_dir

Це те, що я використовую вже багато років.

( -aопція стосується речей, таких як рекурсія каталогу)


3
Трохи роз'яснення згаданих параметрів: -a= рекурсія + зберігати символічні посилання, дозволи, часи модифікації, власник, група, спеціальні файли та файли пристроїв (для останнього потрібні привілеї суперкористувача); -l= зберігати символічні посилання (вже включені в -a); -P= показати прогрес під час передачі + зберігати частково передані файли; -v= багатослівний режим (проте здається, що обов'язковий при використанні, -Pщоб уникнути дивної (помилки?) protocol version mismatchпомилки); -z= включити стиснення переданих даних.
WhiteWinterWolf

@WhiteWinterWolf, здається, залежить від версії, потрібно використовувати -lкомутатор чи ні. Я пам'ятаю, старіші версії не включали -lв -a.
полемон

5

Ви також можете користуватися використанням scp. Загальний формат є

scp -rp sourceDirName username@server:destDirName

scpозначає "захищена копія". Прапори є

  • -r повторно перейти в підкаталоги
  • -p зберегти час модифікації

Я вважаю, що решта пунктів є самоосмисленими


і scp -rp -P <port> .... при використанні нестандартного порту
Панчо

4

Це працює для мене:

1) підключення через sftpвіддалений хост

2) перейти у віддалений каталог, який ви хочете скопіювати. (Приклад: CD CD)

3) зміни в локальний каталог, в який ви хочете скопіювати матеріали. (Приклад: lcd Desktop)

4) Видайте цю команду: get -r *


4

Якщо rsyncце не варіант, я б рекомендував lftp:

lftp sftp://user@host.com/path/path/

Потім використовуйте mirrorкоманду для рекурсивного завантаження, як це:

mirror -R

(Зверніть увагу, що рекурсія за замовчуванням. Це -Rдля зворотного - для завантаження дзеркальної команди замість завантаження. Спробуйте додати, --dry-runщоб зробити пробну версію, щоб переконатися, що вона робить те, що ви очікуєте.)

Або завантажити без рекурсії:

mirror --no-recursion

Ви повинні cdпотрапити в каталоги, які ви хочете дзеркально. Чудово працює!


2

Якщо можете, використовуйте sshfs . Це файлова система FUSE , доступна на більшості сучасних уніцій, і працює з будь-яким сервером SFTP. Це віддалена файлова система: вона дозволяє маніпулювати віддаленими файлами (через протокол SFTP) за допомогою звичайних утиліт.

mkdir /mount/point
sshfs server.example.com:/remote/path /mount/point
ls /mount/point
cp -Rp /mount/point/somedir /local/location
fusemount -d /mount/point

0

Це трохи хитрощі, але те, що для мене працює:

  1. Використовуйте sshдля входу на віддалену машину
  2. Використовуйте sftpвід віддаленої машини до локальної машини
  3. Потім використовуйте getкоманду з -rможливістю переміщення каталогу та всіх його файлів.

1
не працюйте з -rsftp> get -r data /opt/bin get: Invalid flag -r
Skynet

0

Якщо ви запитуєте насправді "як мені використовувати sftp для передачі каталогу", то

 sftp -r user@server

Але якщо ви переносите каталог, я можу запропонувати два кращі варіанти, залежно від ваших потреб. sftpвимагає входу на віддалений сервер у командному рядку, подібному до ssh, але якщо все, що вам потрібно, це файли (файли), є більш прості та швидкі способи.

Scp

Одноразову передачу для завантаження спробуйте:

 # upload source directory to remote server
 scp -rp source_dir user@server:dest

 #download directory from remote server:
 scp -rp user@server:source_dir dest

 #specifying ssh key:
 scp -rp -i ~/.ssh/key user@server:source_dir dest

 #remote directory has spaces
 scp -rp -i ~/.ssh/key user@server:"source\\ dir" dest

Rsync

Якщо ви плануєте регулярно синхронізувати каталоги, використання rsync має більше сенсу. Він виконує дельта між двома каталогами, економлячи час передачі та дані по дроту.

rsync -r -a -v -e ssh --delete source_dir user@server:dest

Ось перелік деяких найпоширеніших варіантів rsync: ( взято звідси )

  • --delete - видаліть файли, які не існують у відправника (система)
  • -v - багатослівний (-vv надасть більш детальну інформацію)
  • -e "ssh options" - вкажіть ssh як віддалену оболонку
  • -a - режим архіву - він зберігає дозволи (власники, групи), часи, символічні посилання та пристрої
  • -r - повторний пошук у каталогах
  • -z - стиснення даних файлів під час передачі
  • --exclude 'ім'я папки' - виключає відповідну папку з передачі
  • -P - показати прогрес під час передачі

Сподіваюся, що це допомагає!


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.