是否可以让 SCP 在复制过程中忽略符号链接?

Posted

技术标签:

【中文标题】是否可以让 SCP 在复制过程中忽略符号链接?【英文标题】:Is it possible to make SCP ignore symbolic links during copy? 【发布时间】:2012-06-17 07:50:17 【问题描述】:

我需要重新安装我们的一台服务器,作为预防措施,我想将/home/etc/opt/Services 移动到备份服务器。

但是,我有一个问题:由于大量的符号链接,很多文件被复制了多次。

是否可以让scp 忽略符号链接(或者实际上将链接复制为链接而不是目录或文件)?如果没有,还有其他方法吗?

【问题讨论】:

【参考方案1】:

我知道这是可能的,我只是拿错了工具。我用 rsync

做到了
rsync --progress -avhe ssh /usr/local/  XXX.XXX.XXX.XXX:/BackUp/usr/local/

【讨论】:

那么这个命令是做什么的?它会忽略符号链接还是创建新的符号链接? -avhe? a 是存档(保留内容),v 详细,h 人类可读输出,e 指定您要使用的服务(在本例中为 ssh)。阅读更多over here 谢谢。旧服务器被封存。新服务器需要的内容。丢失了所有的软链接,但很多都被破坏了,所以这只是新服务器上的一项缓慢的维护任务。再次感谢。 --safe-links 允许保留目录内的链接,并且不复制指向目录外的链接。【参考方案2】:

我发现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 -

【讨论】:

如果远程端没有安装 rsync,或者(稍作修改)如果您碰巧已经有源目录的 tarball,这是一个很好的建议。 它需要一个“p”(tar xpf)来保留目的地的权限。 请注意,此命令必须从计算机运行,将文件推送目标计算机。对于我的情况(许多小的未压缩文件),scprsync 运行得更好更快。 一个后续问题:在源端,tar命令是先将tarball数据存储在本地,然后再传输到远程? [当源磁盘几乎已满时,这将是一个问题 - 比如 98% 已满]【参考方案3】:

使用tar 而不是ssh 作为发送者和接收者也可以做到这一点:

cd $DEST_DIR
ssh user@remote-host 'cd $REMOTE_SRC_DIR; tar cf - ./' | tar xvf -

【讨论】:

我在源端添加了--one-file-system,在目标端添加了p以保留权限。 tar 的手册页说; --one-file-system = 不要跨挂载点【参考方案4】:

一种解决方案是使用壳管。我有一种情况,我得到了一些 *.gz 文件和由某些软件生成的符号链接,以链接到名称稍短的相同 *.gz 文件。如果我只是使用 scp,那么符号链接将被复制为常规文件并导致重复。我知道 rsync 可以忽略符号链接,但是我的 gz 文件没有使用可同步选项进行压缩,并且同步在复制这些 gz 文件时非常慢。所以我只是使用以下脚本来复制文件:

find . -type f -exec scp  target_host:/directory/name/data \;

-f 选项将只查找常规文件并忽略符号链接。您需要在源主机上发出此命令。希望这可以帮助一些用户在我的情况。如果我遗漏了什么,请告诉我。

【讨论】:

【参考方案5】:

一种可以在客户端执行以使用 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 是必须的,如果远程目标目录不存在,那么该命令将简单地压缩远程服务器的整个主目录并将其解压缩到客户端。

【讨论】:

以上是关于是否可以让 SCP 在复制过程中忽略符号链接?的主要内容,如果未能解决你的问题,请参考以下文章

gcc 在链接时忽略符号名称的大小写

SSH之免密登陆

Linux上创建和更改硬链接和符号链接

检查单词是否为英语单词时忽略标点符号

如何让 Git 遵循符号链接?

VSCode 导入忽略符号链接以支持更深的 node_modules