it-swarm.cn

用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"

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

Sftp是否可以解决此问题,还是应该只使用scp?

97
Earlz

[〜#〜] corrected [〜#〜]:我最初错误地宣称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,可以改用PuTTY psftp命令行工具。在PuTTY-tools软件包放在Debian(很可能是Ubuntu)下。

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

68
Jander

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

sftp> mkdir bin
sftp> put -r bin
130
Useful Dude

您可能对使用rsync感兴趣。该命令将是

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

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

22
Shawn J. Goff

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

cd:您的远程文件夹

put -r .

9
eliseu

我可以建议一个稍微复杂的答案,不带拉链,但包括焦油吗?

开始了:

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

这会将目录./bin与tar(-cf:= create file),文件名-(none,stdout)打包在一起,并通过ssh命令将其通过管道传递到target.org(也可能是IP),其中用引号引起来,即:cd到blah,和tar -xf(提取文件)-没有,没有名称,只有stdin。

就像您在家打包一个包裹,将其带到邮局,然后开车上班,您希望在其中打开包裹。

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

8
user unknown

您可以使用 yafc (但请注意FTP/SFTP客户端)。 -r选项在这里效果很好。

2
Dmitry Shpakov

您可以使用rsync,这对于scp和sftp是非常强大的替代方法,尤其是在将副本从机器A更新到机器B时,因为它没有t复制未更改的文件;它还能够从机器B中删除已经从机器A中删除的文件(当然只有在被告知时)。

例如 :

rsync -zrp /home/a/ [email protected]:/home/b/  

-r选项用于递归复制文件,-z在传输期间启用压缩,-p在复制时保留文件许可权(文件创建,编辑等),这是scp不会执行AFAIK的操作。可能还有更多选择。照常阅读手册页。
Karolos的原始答案

1
Sherlock

使用ssh登录到远程服务器,使用sftp连接回您的设备,然后使用get -r命令将目录传输到远程服务器。 get命令允许您递归传输目录,而无需创建目录。

ssh remote ip
sftp local ip 
get -r whichever-dir
0
Cyb3rT00th

SFTP案例:

我需要在ftp上复制该结构:

mainfolder --- folder --- subfolder
                  |           |
              file1.txt   file2.txt

那解决了我的问题:

cd ./mainfolder
mkdir folder
put -r /from/source/folder/* /mainfolder/folder/
cd ./folder
mkdir subfolder
put -r /from/source/folder/subfolder/* /mainfolder/folder/subfolder/
0
Nikita Malovichko

我刚刚从 Arch Linux Wiki 获悉,可以使用sshfs挂载sftp-share。我正在运行 带有chroot和jail的sftp服务器 ,并且sshfs效果很好。

  1. 坐骑:sshfs <sftpuser>@<server>:<read/writable/directory> <your/local/mount/directory>
  2. 卸载:fusermount -u <your/local/mount/directory>
0
saltani