我在通过 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)
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 将执行您想要的操作。
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 选项,它将为您压缩它。
我可以建议一个有点复杂的答案,没有压缩,但包括焦油?
开始了:
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。