如何在SFTP中实现递归的文件上传

14

我的Ubuntu上的命令行sftp没有实现递归上传功能。我发现2004年有一些关于使用-R选项开关实现这种特性的辩论。所以我认为自己制作递归上传是唯一的选择。

即:

  • 遍历目录列表
  • 进入目录
  • 如果不存在,则创建它们
  • 上传文件

我计划用bash来完成这个任务,但也可以使用其他任何语言。

因为我没有服务器的shell访问权限,所以rsync或scp不是一个选择。


1
看看我的答案,使用lftp解决方案。 - Ilia K.
为什么对于scp而言,shell访问是必要的? - user102008
10个回答

16

看看lftp吧。它是一个强大的文件传输客户端,支持ftp、ftps、http、https、hftp、fish(通过ssh shell会话进行文件传输)和sftp。它有类似ftp的交互式界面,但也允许在命令行指定所有命令。看看mput(非递归但处理glob模式)和mirror(穷人版rsync)命令。

我将其与只支持sftp上传的服务器配合使用,像这样:

lftp -c "open -u $MYUSER,$MYPASSWORD sftp://$TARGET ; mirror -R $SOME_DIRECTORY"

谢谢,lftp似乎能胜任这项工作。幸运的是,我没有像09年那样的限制 :) - aarreoskari

4

虽然我认为如果有条件的话,lftp 是最好的选择,但在一个古老的 Cent OS 安装中遇到了问题,只能通过 SFTP 递归上传。下面是我的解决方法:

find dir -type d -exec echo 'mkdir {}' \; | sftp user@host
find dir -type f -exec echo 'put {} {}' \; | sftp user@host

基本上要确保所有目录存在,然后发送文件。


3

我的Ubuntu 12.04自带sftp中的put -r


2

图形用户界面FTP客户端FileZilla也支持SFTP,同时支持目录上传和下载。


1
在命令行中,您可以使用putty-tools软件包来完成此操作。它附带了一个名为psftp的sftp替代品。
它支持mput -r,可递归地将本地目录复制到远程目录。

0

那么sshfs怎么样?

当然,结合cp -r使用。

或者,如果不行,就单独使用rsync -r


“Rsync或scp不是选项,因为我没有服务器的shell访问权限。只有sftp。” Sshfs需要ssh访问权限,而我只有sftp。 - aarreoskari
哦,我从未听说过没有SSH访问的SFTP访问,所以我猜我的大脑忽略了那部分。你仍然可以尝试使用SSHFS。我实际上不知道它是通过SSH还是SFTP工作的。如果你正在使用GNOME或KDE,你可以在它们各自的文件浏览器中键入SFTP路径。 - Ryan C. Thompson

0

在经过大量谷歌搜索和获得很好的答案后,我使用了 Transmit 同步来完成这项工作。虽然不是一个非常好的解决方案,但确实能胜任该工作。


0

我猜你可以用bash来做这件事,但是需要大量的工作。相反,我建议看看Python和Chilkat库


0
在Java中,您可以使用我们的商业产品edtFTPj/PRO透过SFTP进行递归传输。或者,您可能想考虑SCP - 通常支持递归并运行于SSH之上。

0

这是如何做到的 --

sftp -r  <host>
password:  <pass>

cd <remote dir>     # moves to remote dest dir

put -r localdir/*   # creates dir and copies files over

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接