在 Dev 服务器上,我们有一个文件树,所有文件均归“webdev”或“webserv”用户所有。
我想将此文件树打包并解压到生产服务器上,随着变化任何由“webdev”拥有的文件现在将归“webprod”所有,任何由 webserv 拥有的文件现在将归保持由 webserv 拥有。
有什么办法可以进行这种“交换”吗?
答案1
find
您可以在解压档案后使用以下命令最有效地完成此操作:
# find /path -user webdev -exec chown webprod '{}' +
答案2
如果 webprod 运行 tar 命令,则文件将归 webprod 所有。tar 文件中的文件可能需要由 webprod 读取。
在大多数情况下,此 webprod 不应是 Web 服务器运行时的用户 ID。这将限制通过破坏 Web 服务器来修改您的内容的能力。
答案3
我认为你可以用--to-command
选项在 gnu tar 的最新版本(大约 1.25)中可以解决这个问题。这样您就可以通过自定义过滤器程序对 tarfile 输出进行任意转换。理论上,这可以检查从存档中提取的每个文件的所有者,并在必要时进行更改。
但是,目前网络上还没有关于如何使用此功能的好的例子,而且我尝试编写过滤脚本也无济于事。
然后我突然想到可以通过将存档拆分为两个单独的文件来解决这个难题。这可以用 tar 来完成,但这实际上是 cpio 处理的最佳方式,因为 cpio 具有更灵活的输入处理能力。
find
因此,我尝试使用和来解决问题cpio
。首先,创建一个 cpio 存档,其中包含所有由网络服务:
cd /var/www && find . -owner webserv | cpio -ov --format=crc | gzcat webserv-files.cpio.gz
然后,创建由以下人员拥有的文件的 cpio 档案:网络开发,将所有者更改为网络产品:
cd /var/www && find . -owner webdev | cpio -ov --format crc --owner webprod | gzcat webdev-files.cpio.gz
(请注意,只有按照 cpio 手册页以 root 身份运行时才会起作用)。
现在在您的目的地,提取两个档案:
cd /var/www
gzcat webserv-files.cpio.gz | cpio -iv
gzcat webdev-files.gpio.gz | cpio -iv
我认为这会产生预期的结果,尽管我还没有测试得太彻底。