使用 sftp 上传目录?

使用 sftp 上传目录?

我在通过 sftp 上传目录(其中包含其他几层深度的目录)时遇到一些问题。我意识到我可以通过压缩来解决这个问题,但我不明白为什么这是必要的。

无论如何,我尝试

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

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

sftp> mkdir bin
sftp> put -r bin

答案2

已更正:我最初错误地声称 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,您可以使用 PuTTYpsftp命令行工具。它位于putty-toolsDebian(很可能是 Ubuntu)下的软件包中。

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

答案3

您可能有兴趣使用rsync它。其命令是

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

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

答案4

我可以建议一个有点复杂的答案,不压缩,但包括 tar 吗?

开始了:

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

这将使用 tar (-cf:=create file)、文件名 - (none, stdout) 打包目录 ./bin 并通过 ssh 命令将其传送到 target.org(也可能是一个 IP),其中命令执行引号中的操作,即:cd 到 blah,以及 tar -xf(提取文件)- 无,没有名称,只是标准输入。

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

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

相关内容