Как мне получить весь каталог в sftp?

190

Я только учусь использовать sftp и хочу скопировать каталог с удаленного компьютера на мой локальный компьютер. Если я попробую

get [directory]

это дает мне эту ошибку:

Cannot download non-regular file: /home/mpirocch/Documents

get -R тоже не работает.

Мэтью
источник
2
Рекурсивный метод put / get был добавлен в OpenSSH в версии 5.4, которая была выпущена в 2010 году. Вы можете рассмотреть вопрос об обновлении серверов, поскольку в него также добавлено множество исправлений ошибок и улучшены функции безопасности.
Lèse Majesté

Ответы:

267

Используйте -r(рекурсивный) флаг:

get -r *
мани свежие
источник
16
Спасибо за ответ, который действительно отвечает на вопрос.
jonnyflash
30
Дает мне:get: Invalid flag -r
ghbarratt
2
Это также дает мне неправильный флаг. Я не уверен, что это поддерживается во всех системах.
Бен
@Ben: Когда я задал этот вопрос в 2009 году, -rфлаг не существовал. Ваша система обновлена?
Матфея
15
@silvinci не все современные системы. Нелегальный вариант с CentOS 6.4 OpenSSH-клиентов-5.3p1-84.1.el6.x86_64
CrackerJack9
52

Использование:

scp -r mpirocch@my-server:/home/mpirocch/Documents Documents
Кристиан Чиупиту
источник
3
Это работает, но было бы неплохо сделать это из SFTP (чтобы я мог посмотреть, что я копирую, прежде чем копировать). Это возможно?
Мэтью
@ Мэтью: я так не думаю. Я задавал себе тот же вопрос в течение некоторого времени, и лучший ответ, который у меня есть на данный момент, таков scp -r. Или вы можете использовать продвинутый SFTP-клиент, такой как Filezilla.
Кристиан Чупиту
1
scp -r будет следовать символическим
ссылкам
5
Некоторые системы могут разрешать sftp, но не разрешать scpдоступ.
Turion
40

Используйте lftp:

lftp sftp://user@host

Затем, внутри lftp, cdв каталог, который вы хотите скопировать, и используйте mirrorкоманду для рекурсивной загрузки выбранного каталога, например:

mirror

Эта команда принимает параметры и аргументы:

зеркало [ ОПЦИИ ] [ источник [ цель ]]

Например, опция -R(или --reverse) приведет к загрузке дерева локальных каталогов в удаленный каталог:

mirror -R

Смотрите lftp(1)страницу руководства на сайте проекта или на Debian.org для других команд и опций.

bshanks
источник
4
+1 лфтп - как маленький пучок магии и радости!
WCWedin
16

ну это маленькое руководство должно помочь, зеркалировать удаленный сервер в локальную папку с помощью lftp

lftp sftp://user:password@server.org:22 -e 'mirror --verbose --use-pget-n=8 -c /remote/path /local/path'

  • sftp:// = использует протокол SFTP
  • mirror = режим зеркала
  • verbose = показывает загружаемые файлы
  • use-pget-n = количество сегментов, действительно полезно для ускорения больших файлов
  • parallel = загружает файлы множителей одновременно

если вы хотите , чтобы загрузить файлы в параллельном переключателе из use-pget-n=8с--parallel=8

надеюсь, это поможет всем, кому нужно зеркалировать удаленную папку в локальную папку

nwgat
источник
Спасибо, это сработало для меня, после того, как другие методы потерпели неудачу (в частности, нет опции "-r" на sftp). Первую часть команды в моем случае нужно было заключить в кавычки из-за долларовых символов в паролеlftp 'sftp://user:pa$$word@server.org:22' -e 'mirror --verbose --use-pget-n=8 -c /remote/path /local/path'
Jason
15

Не используйте программу sftp напрямую, если вы можете найти что-то лучшее. Для Linux многие файловые менеджеры (по крайней мере, Nautilus и Dolphin, GNOME и KDE) изначально поддерживают sftp, и всегда есть sshfs. Для Windows есть WinSCP и, возможно, другие . Смысл всего этого в том, чтобы позволить вам получать доступ к файлам через sftp, как если бы они находились на обычном файловом элементе, поэтому вам не нужно заботиться о том, чтобы вы обращались к ним через sftp.

Райан Томпсон
источник
Вау, наутилус работает очень хорошо с SFTP. Я добавил закладку в «Наутилус», и теперь все это до смешного просто. Спасибо!
Мэтью
У меня была проблема с производительностью Nautilus SFTP. Да, это действительно удобно, но я не смог насытить сеть 1 Гбит / с через Nautilus, в то время как с простым sftp/sshинтерфейсом командной строки я был (около 100 МБ / с передачи файлов). Так что проблема была в Nautilus на GNU / Linux Mint.
Stamster
13

Попробуй mgetвместо get.

Уточнение: mget будет работать, если вы находитесь в каталоге, который хотите скопировать; если вы делаете что-то вроде этого:

sftp> cd dir_to_get
sftp> mget *

он получит все файлы в этом каталоге. Однако он не будет рекурсивно получать содержимое каких-либо подкаталогов.

Кен Кинан
источник
1
Mget не работает лучше, чем получить для меня.
Мэтью
1
не может загрузить нестандартный файл с этим
Dchris
1
Это работало для меня в системе, где 'get -r' не работал.
Чотке
10
get -r [directory]

получает [directory]и все под ним, где rрасшифровывается как рекурсивный. Я нашел это, просто набрав helpс sftp.

drkvogel
источник
1
ИМО это лучший ответ на этот вопрос. :)
ramrunner
3
Это дубликат ответа от 29 ноября 2010 года (почти полтора года назад).
Кристиан Чиупиту
5

Как с cp:

scp -rp user@host:/path/to/dir dir

Вышесказанное сохранит время и режимы исходных файлов и подкаталогов. Это особенно полезно для поиска резервных копий.

Aziraphale
источник
Это в основном дубликат ответа от 29 ноября 2010 года (почти два года назад).
Кристиан Чупиту
0

У меня есть папка Java dist на удаленном сервере, где у меня есть следующее дерево:

- dist
--- Audio.jar
--- README
--- lib
----- lib.jar

Цель: я хочу использовать SFTP? И поместите их в / tmp / <>

Шаг 1. sftp remoteuser @ ip

Шаг 2. cd / var / tmp

Шаг 2. lmkdir / tmp / dist; lmkdir / tmp / dist / lib

Шаг 3. Жк / тм / дист

Шаг 4. mget *

Шаг 5. lcd / tmp / dist / lib

Шаг 6. Mget *

Шаг 7. наконец у меня есть цель

$ ls
Audio.jar  lib  README.TXT
YumYumYum
источник