![将用户主文件夹存档到远程服务器,而不遵循符号链接?](https://linux22.com/image/113961/%E5%B0%86%E7%94%A8%E6%88%B7%E4%B8%BB%E6%96%87%E4%BB%B6%E5%A4%B9%E5%AD%98%E6%A1%A3%E5%88%B0%E8%BF%9C%E7%A8%8B%E6%9C%8D%E5%8A%A1%E5%99%A8%EF%BC%8C%E8%80%8C%E4%B8%8D%E9%81%B5%E5%BE%AA%E7%AC%A6%E5%8F%B7%E9%93%BE%E6%8E%A5%EF%BC%9F.png)
当用户离开时,我们需要将用户的主文件夹一次性存档复制到存档服务器(等待最终删除),以防他们后来发现可能仍然需要某些文件(尽管我们当然非常强烈地这样做)鼓励他们在出发前自行备份可能仍需要的所有内容)。
我们一直在使用scp
这个,但现在无意中被一位前用户诱骗,他安装了一些软件,这些软件在他们的一个文件夹中创建了一个不寻常的符号链接结构,这似乎导致 scp 向上查找,然后尝试复制在被阻止之前,超出了预期。
不幸的是,事实证明 scp 似乎总是遵循符号链接,并且似乎没有任何选项来阻止这种情况。
我正在寻找一种备份用户文件夹的替代方法,以避免此问题(理想情况下不会比绝对需要的更复杂)。
tar
可能是一种可能性,但我有点担心在将其复制到存档服务器之前在本地创建 tarball 可能会使用大量的存储空间,并且如果我们的文件服务器在以下时间变得更满,可能会造成一些困难未来的某个时刻。
另一种可能性可能是使用rsync
,但这对于一次性文件传输来说似乎可能太过了,而且我从以前的经验中知道,调整 rsync 自己的选项有时本身就很繁琐。
任何人都可以为此建议一个可靠且简单的 scp 替代方案吗?
答案1
如果您不喜欢tar
临时文件,这很简单:不要使用临时文件。使用管道。
cd /home ; tar cf - user | gzip | ssh archivehost -l archiveuser 'cat > user.archived.tar.gz'
替代品xz
或任何你喜欢的东西gzip
。或者,如果节省主服务器上的 CPU 周期比节省网络带宽(以及存档服务器上的 CPU)更重要,则将其移至连接的另一端
cd /home ; tar cf - user | ssh archivehost -l archiveuser 'gzip > user.archived.tar.gz'
你gpg
也可以在那里贴一个。拥有一个专门用于这些档案的密钥对,在存储时使用公钥加密,在需要恢复某些内容时使用私钥。
根据要求提供更多详细信息:
我打算user
成为您正在归档其主目录的用户/home/user
。archivehost
是您要存储存档的服务器,也是archiveuser
存档服务器上拥有存档的帐户。
tar cf - user
意思是“创建一个 tar 存档user
并将其写入标准输出”。是-c
“创建”,-f -
是“使用 stdin/stdout 作为文件”。它可能会工作,tar c user
因为-f -
它可能是默认操作,但最初的默认操作是tar
读取或写入磁带设备。使用显式-f -
可能只是我老的标志。
tarz
标志会很好,但我无法展示如何将其移动到 .tar 文件的另一侧ssh
。 (另外,连接gzip
和tar
使用显式管道是那些“老人”的事情之一 -tar
并不总是有这个选项。) 另外,我可以替换bzip2
、lzop
、xz -3v
或任何其他压缩程序,而无需记住相应的tar
选项。
我--checkpoint
以前从未听说过,所以你只能依靠自己的测试。
答案2
Rsync 是一个合理的选择。使用 rsync 进行一次性传输并没有什么问题。
Tar 也是一个合理的选择。您不需要将存档存储在本地,您可以直接通过管道连接到 SSH。
另一种可能性是将服务器目录挂载到SSHFS。但是,请注意 SSHFS 不会保留所有元数据(例如权限)。 (Tar 和 rsync 可能也无法保留所有元数据,但它们可以做得更好——传递--acls --xattrs
给 GNU tar,传递--acls --xattrs
给 rsync。)