我需要重新安装我们的一台服务器,作为预防措施,我想将/home
,/etc
,/opt
和/Services
移至备用服务器。< / p>
但是,我遇到了一个问题:由于有很多符号链接,很多文件会被多次复制。
是否可以使scp
忽略符号链接(或实际上将链接复制为链接而不是目录或文件)?如果没有,还有其他办法吗?
答案 0 :(得分:72)
我知道这是可能的,我只是采取了错误的工具。我是用 rsync
做的rsync --progress -avhe ssh /usr/local/ XXX.XXX.XXX.XXX:/BackUp/usr/local/
答案 1 :(得分:26)
我发现the rsync
method对我不起作用,但是我找到了一个在本网站上有效的替代方案(www.docstore.mik.ua/orelly)。
特别是7.5.3 of "O'Reilly: SSH: The Secure Shell. The Definitive Guide"部分。
<强> 7.5.3。目录的递归副本
...
虽然scp可以复制目录,但它不一定是最好的方法。如果您的目录包含硬链接或软链接,则不会重复这些链接。链接被复制为普通文件(链接目标),更糟糕的是,循环目录链接导致scp1无限循环。 (scp2检测符号链接并复制其目标。)其他类型的特殊文件(如命名管道)也未正确复制。更好的解决方案是使用tar,它正确处理特殊文件,并将其发送到远程机器要通过SSH解压缩:
$ tar cf - /usr/local/bin | ssh server.example.com tar xf -
答案 2 :(得分:16)
使用tar
而不是ssh
作为发送方和接收方都可以解决问题:
cd $DEST_DIR
ssh user@remote-host 'cd $REMOTE_SRC_DIR; tar cf - ./' | tar xvf -
答案 3 :(得分:1)
一种解决方案是使用贝壳管。我有一种情况,我有一些* .gz文件和一些软件生成的符号链接链接到相同的* .gz文件,名称略短。如果我只是使用scp,那么符号链接将被复制为常规文件并导致重复。我知道rsync可以忽略符号链接,但是我的gz文件没有使用可同步选项压缩,并且同步在复制这些gz文件时非常慢。所以我只需使用以下脚本来复制文件:
find . -type f -exec scp {} target_host:/directory/name/data \;
-f选项只能查找常规文件并忽略符号链接。您需要在源主机上提供此命令。希望这可以帮助我的情况下的一些用户。如果我错过了什么,请告诉我。
答案 4 :(得分:0)
一种可在客户端执行的划线解决方案,以使用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是必需的,如果远程目标目录不存在,那么该命令将简单地压缩远程服务器的整个主目录并将其提取到客户端。