如何在sftp中获得整个目录?


189

我只是在学习使用sftp,我想将目录从远程计算机复制到我的本地计算机。如果我尝试

get [directory]

它给了我这个错误:

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

get -R 也不起作用。


2
递归放置/获取功能已于2010年发布的5.4中添加到OpenSSH中。您可以考虑升级服务器,因为它还添加了许多错误修复和更好的安全功能。
冒犯君主

Answers:


265

使用-r(递归)标志:

get -r *

16
感谢您提出一个实际上可以回答问题的答案。
jonnyflash

30
给我:get: Invalid flag -r
ghbarratt 2012年

2
这也给了我无效的标志。我不确定所有系统都支持此功能。
2012年

@本:当我在2009年问这个问题时,这个-r旗帜不存在。您的系统是最新的吗?
马修

15
@silvinci并非当前所有系统。CentOS 6.4的非法选项openssh-clients-5.3p1-84.1.el6.x86_64
CrackerJack9

52

采用:

scp -r mpirocch@my-server:/home/mpirocch/Documents Documents

3
这可以工作,但是能够通过SFTP执行此操作将非常好(这样我可以在复制之前看到复制的内容)。这可能吗?
马修(

@马修:我不这么认为。一段时间以来,我一直在问自己同样的问题,而目前最好的答案是scp -r。或者,您可以使用Filezilla之类的高级SFTP客户端。
Cristian Ciupitu 09年

1
scp -r将遵循符号链接...
jsleuth

5
某些系统可能允许sftp,但不允许scp访问。
Turion

40

用途lftp

lftp sftp://user@host

然后,在lftp中,cd进入要复制的目录,并使用mirror命令以递归方式下载所选目录,如下所示:

mirror

此命令接受选项和参数:

镜像[ 选项 ] [  [ 目标 ]]

例如,-R(或--reverse)选项将使它将本地目录树上载到远程目录:

mirror -R

有关其他命令和选项,请参见项目站点Debian.org上lftp(1)手册页。


4
+1 lftp就像是一堆魔术和欢乐!
WCWedin 2011年

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

希望这可以帮助需要将远程文件夹镜像到本地文件夹的任何人


谢谢,这对我有用,在其他方法失败之后(特别是sftp上没有“ -r”选项)。在我的情况下所需要的命令的第一部分被引用,由于密码字符美元lftp 'sftp://user:pa$$word@server.org:22' -e 'mirror --verbose --use-pget-n=8 -c /remote/path /local/path'
杰森

15

如果可以找到更好的方法,请不要直接使用sftp程序。对于Linux,许多文件管理器(至少是Nautilus和Dolphin,GNOME和KDE的文件管理器)本身都支持sftp,并且总是有sshfs。对于Windows,有WinSCP,可能还有其他。所有这些的目的是让您像使用常规文件系统一样通过sftp访问文件,因此您不必担心要通过sftp访问它们。


哇,鹦鹉螺与SFTP搭配使用效果很好。我在Nautilus中添加了一个书签,现在这一切都非常容易。谢谢!
马修(

我在Nautilus SFTP上遇到性能问题。是的,这确实很方便,但是我无法通过Nautilus饱和1 Gbit / s的网络,而使用普通的sftp/ssh命令行界面却是(cca 100 MB / s的文件传输)。因此,问题出在GNU / Linux Mint上的Nautilus。
斯塔姆斯特,

13

尝试mget代替get

澄清:mget ,如果你是要复制的目录里面工作; 如果您执行以下操作:

sftp> cd dir_to_get
sftp> mget *

它将获取该目录中的所有文件。但是,它不会递归获取任何子目录的内容。


1
mget的工作比为我服务更好。
马修(

1
无法与此下载非常规文件
Dchris 2015年

1
这在“ get -r”不起作用的系统上对我有用。
Tchotchke

10
get -r [directory]

获取[directory]所有内容,其中r表示递归。我只是通过输入help来发现的sftp


1
海事组织,这是对这个问题的最佳答案。:)
ramrunner

3
这与10年11月29日(将近一年半)的答案重复。
Cristian Ciupitu 2014年

5

cp

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

以上内容将保留原始文件和子目录的时间和方式。这对于检索备份特别有用。


这基本上是一个重复的答案,从11月29日'10(两年前)。
Cristian Ciupitu 2014年

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.液晶/ tmp / dist

步骤4. mget *

步骤5. LCD / tmp / dist / lib

步骤6. mget *

第7步。终于我有了目标

$ ls
Audio.jar  lib  README.TXT
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.