Использование sftp для передачи каталога?


50

Когда я пытаюсь использовать sftp для передачи каталога, содержащего файлы, я получаю сообщение об ошибке:

skipping non-regular file directory_name

Каталог содержит пару файлов и два подкаталога.

Что я делаю неправильно?

Ответы:


49

sftpКак cpи scp, требует, чтобы при копировании папки (и ее содержимого, очевидно) вы явно указывали ей, что хотите рекурсивно перенести папку с помощью этой -rопции.

Итак, добавьте -rв команду.


2
-р после положенной команды? Я получаю сообщение об ошибке «put: Invalid flag -r», если я это делаю. Добавление его в исходную команду sftp также не работает.
Хазиз

5
Добавьте -rк sftpкоманде при подключении. sftp -r user@host
Кевин

1
@Kevin Я получаю следующую ошибку "sftp: unknown option --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 <порт> .... при использовании нестандартного порта
Pancho

4

Это работает для меня:

1) подключиться sftpк удаленному хосту

2) Перейдите в удаленный каталог, который вы хотите скопировать. (Пример: CD Music)

3) Перейдите в локальный каталог, в который вы хотите скопировать материал. (Пример: рабочий стол lcd)

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-подобной командной строке, но если вам нужен только файл (-ы), есть более простые и быстрые способы.

УПП

Для одноразовой передачи, для загрузки попробуйте:

 # 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 'foldername' - исключает соответствующую папку из передачи
  • -P - показать прогресс во время передачи

Надеюсь, это поможет!


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.