我在通过 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-tools
Debian(很可能是 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。