48

What is the best way to copy a directory (with sub-dirs and files) from one remote Linux server to another remote Linux server? I have connected to both using SSH client (like Putty). I have root access to both.

4

16 回答 16

68

我通常有两种方法,都使用 ssh:

scp -r sourcedir/ user@dest.com:/dest/dir/

或者,更健壮和更快(在传输速度方面)的方法:

rsync -auv -e ssh --progress sourcedir/ user@dest.com:/dest/dir/

如果您想了解有关它们如何工作的更多详细信息,请阅读每个命令的手册页。

于 2008-09-16T04:40:46.680 回答
37

我会修改之前建议的回复:

rsync -avlzp /path/to/sfolder name@remote.server:/path/to/remote/dfolder

如下:

-a (用于存档)意味着 -rlptgoD 所以上面的 l 和 p 是多余的。我还喜欢包含 -H,它复制硬链接。默认情况下,它不是 -a 的一部分,因为它很昂贵。所以现在我们有了这个:

rsync -aHvz /path/to/sfolder name@remote.server:/path/to/remote/dfolder

您还必须小心尾随斜杠。你可能想要

rsync -aHvz /path/to/sfolder/ name@remote.server:/path/to/remote/dfolder

如果希望源“sfolder”的内容出现在目标“dfolder”中。如果没有尾部斜杠,则会在目标“dfolder”中创建“sfolder”子目录。

于 2008-09-19T19:41:21.487 回答
9

rsync -avlzp /path/to/folder name@remote.server:/path/to/remote/folder

于 2008-09-16T04:37:10.743 回答
6
scp -r <directory> <username>@<targethost>:<targetdir>
于 2008-09-16T04:37:33.210 回答
5

登录一台机器

$ scp -r /path/to/top/目录 user@server:/path/to/copy

于 2008-09-16T04:37:34.473 回答
3

Try unison if the task is recurring. http://www.cis.upenn.edu/~bcpierce/unison/

于 2008-09-16T05:18:54.623 回答
3

Use rsync so that you can continue if the connection gets broken. And if something changes you can copy them much faster too!

Rsync works with SSH so your copy operation is secure.

于 2008-09-16T04:37:18.093 回答
2

Check out scp or rsync, man scp man rsync

scp file1 file2 dir3 user@remotehost:path
于 2008-09-16T04:37:11.073 回答
2

我使用了 rdiffbackup http://www.nongnu.org/rdiff-backup/index.html因为它可以满足您的所有需求,而无需任何花哨的选项。它基于 rsync 算法。如果您只需要复制一次,您可以稍后删除目标主机上的 rdiff-backup-data 目录。

rdiff-backup user1@host1::/source-dir user2@host2::/dest-dir

来自文档:

rdiff-backup 还保留子目录、硬链接、开发文件、权限、uid/gid 所有权、修改时间、扩展属性、acls 和资源分支。

这是 scp -p 提案的一个好处,因为 -p 选项不能保留所有内容(例如,对目录的权限设置不当)

在 ubuntu 上安装:

sudo apt-get install rdiff-backup
于 2008-09-17T11:53:05.400 回答
1

scp 将完成这项工作,但有一个问题:与第二个远程目标的连接将使用第一个远程目标上的配置,因此如果您在本地环境中使用 .ssh/config,并且您希望 rsa 和 dsa 密钥工作,您必须将您的代理转发到第一个远程主机。

于 2008-09-19T19:18:53.070 回答
1

我认为您可以尝试:

rsync -azvu -e ssh user@host1:/directory/ user@host2:/directory2/

(我假设你在 host0 上,你想直接从 host1 复制到 host2)

如果上述方法不起作用,您可以尝试:

ssh user@host1 "/usr/bin/rsync -azvu -e ssh /directory/ user@host2:/directory2/"

如果您已经设置了从 host1 到 host2 的无密码 SSH 登录,那么它会起作用

于 2008-09-16T16:39:12.163 回答
1

好吧,快速回答是看一下“scp”联机帮助页,或者可能是 rsync——这完全取决于您需要复制的内容。如果必须,您甚至可以使用 tar-over-ssh:

tar cvf - | ssh server tar xf -
于 2008-09-16T04:37:33.410 回答
0

上面提到的 scp 通常是最好的方法,但不要忘记远程目录规范中的冒号,否则您将在本地计算机上获得源目录的副本。

于 2008-09-17T14:00:05.377 回答
0

我喜欢通过 ssh 传输 tar。

tar cf - [目录] | ssh [用户名]@[主机名] tar xf - -C [远程机器上的目标]

这种方法为您提供了很多选择。由于您应该以普通用户身份登录远程服务器,因此您应该禁用 root ssh 为多个用户帐户复制文件是困难的。为了解决这个问题,您可以在仍然保留所有权的远程盒子上创建一个 tar 文件。

tar cf - [目录] | ssh [用户名]@[主机名] "cat > output.tar"

对于慢速连接,您可以添加压缩,z 用于 gzip 或 j 用于 bzip2。

tar cjf - [目录] | ssh [用户名]@[主机名] "cat > output.tar.bz2"

tar czf - [目录] | ssh [用户名]@[主机名] "cat > output.tar.gz"

tar czf - [目录] | ssh [用户名]@[主机名] tar xzf - -C [远程机器上的目标]

于 2008-09-19T14:53:54.330 回答
0

理想情况下,作为非 root 用户:

scp -r src $host:$path

如果您已经有 $host 上的一些内容,请考虑使用 rsync 和 ssh 作为隧道。

/艾伦

于 2008-09-16T04:37:50.260 回答
0

如果你真的想要一个精确的副本,你可能还想使用 -p 开关到 scp,如果你正在使用它。我发现 scp从 devices 读取,并且我遇到了 cpio 问题,所以我个人总是使用tar,如下所示:

cd /origin; find . -xdev -depth -not -path ./lost+found -print0 \
| tar --create --atime-preserve=system --null --files-from=- --format=posix \
--no-recursion --sparse | ssh targethost 'cd /target; tar --extract \
--overwrite --preserve-permissions --sparse'

我将这个咒语保存在一个文件中,并使用各种其他方式复制文件。这个用于通过 SSH 复制;其他的用于复制到压缩存档,在同一台计算机内复制,以及在 SSH 太慢时通过未加密的 TCP 套接字进行复制。

于 2008-09-17T12:19:50.797 回答