我在通过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?

#1 楼

正确的:我最初错误地宣称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命令行工具。它位于Debian(很可能是Ubuntu)下的putty-tools软件包中。

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

评论


仅供参考:sftp允许来自OpenSSH 5.4的put -r

– Tino
16年5月3日在12:04



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

–詹德
16年5月3日在23:34

#2 楼

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

sftp> mkdir bin
sftp> put -r bin


评论


-r需要OpenSSH 5.4或更高版本

– Tino
16年5月3日,12:06

#3 楼

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

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


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

评论


太棒了!很简单!

–阿斯肯
13年7月16日在9:47

请注意,sftp是命令和协议。 rsync不支持sftp协议。

– Tino
16年5月3日在12:07

#4 楼

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

cd:您的远程文件夹

put -r .

评论


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

–nonopolarity
16 Jan 27 '14:21



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

– karimkorun
16年7月7日在10:15

#5 楼

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

这里,我们去:

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(提取文件)-没有,没有名字,只有标准输入。

就像您在家打包一个包裹,将其带到邮局,然后开车上班,您会在期望的地方打开包裹。

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

评论


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

– Tino
16年3月3日,12:22

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

–Felipe Alcacibar
17年5月3日,14:40

#6 楼

您可以使用yacc(还有另一个FTP / SFTP客户端)。 -r选项在该处效果很好。

#7 楼

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

例如:

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


-r选项用于递归复制文件,-z在传输期间启用压缩,-p在复制时保留文件许可权(文件创建,编辑等),而scp则不这样做据我所知。可能有更多选择。照常阅读手册页。Karolos的原始答案

评论


这是肖恩·高夫(Shawn J. Goff)从2011年2月7日19:24开始的答复的虚假之处。像这样使用rsync需要SSH访问。它不适用于仅具有SFTP访问权限的帐户。

–GuyPaddock
20-04-29在17:34

#8 楼

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

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


#9 楼

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/


#10 楼

我刚刚从Arch Linux Wiki获悉,可以使用sshfs挂载sftp-share。我正在使用chroot和jail运行sftp服务器,并且sshfs运行良好。


安装:sshfs <sftpuser>@<server>:<read/writable/directory> <your/local/mount/directory>

卸载:fusermount -u <your/local/mount/directory>