用sftp上传目录?


97

我在通过sftp上传目录(其中包含深度较深的其他目录)时遇到了一些麻烦。我意识到我可以通过gzip压缩解决此问题,但是我不明白为什么这样做是必要的。

无论如何,我尝试

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"

我认为最后一条错误消息完全是愚蠢的。这样目录不存在吗?为什么不创建目录?

sftp是否可以解决此问题,还是应该只使用scp?

Answers:


68

正确的:我最初错误地声称OpenSSH不支持put -r。它确实可以,但是它以一种非常奇怪的方式来实现。似乎期望目标目录已经存在,并且名称与源目录相同。

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

尤其奇怪的是,即使您为目的地指定了不同的名称,这也同样适用:

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

为了更好地实现递归put,可以改用PuTTY psftp命令行工具。它putty-tools在Debian(很可能是Ubuntu)下的软件包中。

或者,如果您要使用GUI,Filezilla将执行您想要的操作。


仅供参考:sftp允许put -r使用OpenSSH 5.4
Tino,

3
谢谢-我已经纠正了我的答案。时间到了,是吗?;-P
Jander

128

我不知道为什么sftp这样做,但是如果目标目录已经存在,则只能递归复制。这样吧...

sftp> mkdir bin
sftp> put -r bin

1
-r需要OpenSSH 5.4或更高版本
Tino

22

您可能对使用感兴趣rsync。该命令将是

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

这将复制所有内容bin/并将其放在中的远程服务器上/home/earlz/blah/bin/。另外一个好处是,它将首先检查远程文件是否没有更改,如果没有更改,则不会重新发送。另外,您可以添加-z选项,它将为您压缩它。


好厉害!很简单!
阿斯肯

3
请注意,这sftp是一个命令和一个协议rsync不支持sftp-protocol。
蒂诺

9

lcd:您的本地文件夹(带有子文件夹)

cd:您的远程文件夹

put -r .


实际上,我认为这是最正确的答案...为了将我的整个文件夹放在这里
nopole

cd到本地父文件夹并尝试按名称放置目录时,sftp抱怨。但是cd进入我想上传的目录就可以了。谢谢!
karimkorun '16

8

我可以建议一个稍微复杂的答案,不带拉链,但包括焦油吗?

开始了:

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

这会将目录./bin与tar(-cf:= create file),文件名-(none,stdout)打包在一起,并通过ssh命令将其通过管道传递到target.org(也可能是IP),其中用引号引起来,它是:cd到blah,和tar -xf(提取文件)-没有,没有名称,只有stdin。

就像您在家打包一个包裹,将其带到邮局,然后开车上班,您希望在其中打开包裹。

也许有一个更优雅的解决方案,仅使用sftp。


管道传输tar是一个非常好的解决方案,但是这需要ssh登录支持(sftp是之上的另一种协议ssh)。 tar与其他程序不同,默认情况下,它递归运行,传输所有特殊文件(FIFO,块/字符设备等),尝试将UID / GID映射从源转换为目标系统,并具有传统的简短命令行。(尽管有一个例外:“ Unix域套接字”没有被传送。但是谁需要这些?)
蒂诺

当我需要节点之间的压缩时,我可以使用这种方法,也可以使用该pv工具观察长距离传输的速度
Felipe Alcacibar


1

您可以使用rsync,它是scp和sftp的非常强大的替代品,尤其是在将副本从机器A更新到机器B时,因为它不会复制未更改的文件。它还能够从机器B中删除已经从机器A中删除的文件(当然只有在被告知时)。

例如 :

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

-r选项用于递归复制文件,-z在传输期间启用压缩,-p在复制时保留文件许可权(文件创建,编辑等),这是scp不会执行AFAIK的操作。可能还有更多选择。照常阅读手册页。
Karolos的原始答案


0

使用ssh登录到远程服务器,使用sftp连接回您的设备,然后使用get -r命令将目录传输到远程服务器。get命令允许您递归传输目录,而无需创建目录。

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

0

SFTP案例:

我需要在ftp上复制该结构:

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

那解决了我的问题:

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

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.