使用 sftp 上传目录?

Ear*_*rlz 107 linux ssh sftp

我在通过 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"
Run Code Online (Sandbox Code Playgroud)

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

无论如何,sftp 是否可以解决这个问题,还是我应该只使用 scp?

小智 138

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

sftp> mkdir bin
sftp> put -r bin
Run Code Online (Sandbox Code Playgroud)

  • `-r` 需要 [OpenSSH 5.4](http://www.openssh.com/txt/release-5.4) 或更高版本 (2认同)

Jan*_*der 77

更正:我最初错误地声称 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
Run Code Online (Sandbox Code Playgroud)

特别奇怪的是,如果您为目的地指定不同的名称,这甚至适用:

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
Run Code Online (Sandbox Code Playgroud)

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

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

  • 谢谢 - 我已经更正了我的答案。是时候了吧?;-P (3认同)

Sha*_*off 22

您可能有兴趣rsync改为使用。那个命令是

 rsync --delete --rsh=ssh -av bin/ remote-ip-or-fqdn:/home/earlz/blah/bin/
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,`sftp` 是一个命令**和一个协议**。`rsync` 不支持 `sftp` 协议。 (5认同)

小智 15

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

cd: 你的远程文件夹

put -r .


use*_*own 8

我可以建议一个有点复杂的答案,没有压缩,但包括焦油?

开始了:

tar -cf - ./bin | ssh target.org " ( cd /home/earlz/blah ; tar -xf - ) "
Run Code Online (Sandbox Code Playgroud)

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

这就好像你在家里打包了一个包裹,把它送到邮局,然后开车去上班,在你期望的地方打开包裹。

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

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