我需要重新安装服务器我们之一,作为预防措施,我想移动/home
,/etc
,/opt
,和/Services
备份服务器。
但是,我有一个问题:由于大量的符号链接,很多文件被多次复制。
是否可以scp
忽略符号链接(或实际上将链接复制为链接而不是目录或文件)?如果没有,还有另一种方法吗?
Answers:
我知道有可能,我只是选择了错误的工具。我用rsync做到了
rsync --progress -avhe ssh /usr/local/ XXX.XXX.XXX.XXX:/BackUp/usr/local/
我发现该rsync
方法对我不起作用,但是我在此网站(www.docstore.mik.ua/orelly)上找到了可行的替代方法。
特别是“ O'Reilly:SSH:安全Shell。权威指南”的第7.5.3节。
7.5.3。目录的递归副本
...
尽管scp可以复制目录,但这不一定是最好的方法。如果您的目录包含硬链接或软链接,则不会重复。链接被复制为纯文件(链接目标),更糟糕的是,循环目录链接导致scp1无限循环。(scp2检测符号链接并复制其目标。)其他类型的特殊文件(例如命名管道)也无法正确复制。更好的解决方案是使用tar,它可以正确处理特殊文件并将其发送到远程通过SSH解密计算机:
$ tar cf - /usr/local/bin | ssh server.example.com tar xf -
scp
或更快或更有效rsync
。
同时使用tar
overssh
作为发送者和接收者也可以做到这一点:
cd $DEST_DIR
ssh user@remote-host 'cd $REMOTE_SRC_DIR; tar cf - ./' | tar xvf -
--one-file-system
和目标端添加了p
以保留权限。
一种解决方案是使用壳管。我遇到一种情况,我得到了一些* .gz文件和某些软件生成的符号链接,这些符号链接链接到名称稍短的相同* .gz文件。如果仅使用scp,则符号链接将被复制为常规文件,并导致重复。我知道rsync可以忽略符号链接,但是我的gz文件未使用可同步选项进行压缩,并且复制这些gz文件时同步非常慢。因此,我只是使用以下脚本来复制文件:
find . -type f -exec scp {} target_host:/directory/name/data \;
-f选项将仅查找常规文件,而忽略符号链接。您需要在源主机上给出此命令。希望这对我的情况有所帮助。让我知道我是否错过任何事情。
可以在客户端执行的一种线性解决方案,以使用tar + ssh命令从服务器复制文件夹。
ssh user@<Server IP/link> 'mkdir -p <Remote destination directory;cd <Remote destination directory>; tar cf - ./' | tar xf - C <Source destination directory>
注意:mkdir是必须的,如果不存在远程目标目录,则该命令将简单地压缩远程服务器的整个主目录并将其提取到客户端。