当把文件从dev移动到prod服务器时,tar – swap所有者

在Dev服务器上,我们有一个由“webdev”或“webserv”用户拥有的文件树。

我想打开这个文件树并将其解压到prod服务器上, 修改 “webdev”拥有的任何文件现在将归“webprod”所有,webserv所拥有的任何文件都将归webserv所有。

有没有办法做这种“交换”?

在解压缩你的压缩文件后,你可以使用find来最高效地完成这个任务:

 # find /path -user webdev -exec chown webprod '{}' + 

如果webprod运行tar命令,这些文件将由webprod拥有。 webprod可能需要tar文件中的文件。

在大多数情况下,这个webprod不应该是web服务器运行的用户id。 这将限制通过危害Web服务器来修改您的内容的能力。

我认为你可以在最近版本的gnu tar(1.25左右) --to-command 选项来做一些巧妙的--to-command来处理这个问题。 这应该允许您通过自定义filter程序对其进行pipe道转换,从而对tarfile输出进行任意转换。 从理论上讲,可以检查从档案中提取的每个文件的所有者,并在必要时进行更改。

但是现在没有好的例子说明如何在networking上使用这个function,而且我的filter脚本的尝试也是徒劳的。

然后,我感到你可以通过将档案分成两个单独的文件来解决这个困境。 这可以用tar来完成,但这实际上是由cpio最好的处理,因为cpio具有更灵活的input处理。

所以,这是我使用findcpio解决scheme的尝试。 首先,制作一个由webserv拥有的所有文件的cpio归档文件:

 cd /var/www && find . -owner webserv | cpio -ov --format=crc | gzcat webserv-files.cpio.gz 

然后,制作由webdev拥有的文件的cpio归档,将所有者更改为webprod

 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 

我想这样会有理想的结果,虽然我没有太详细的testing。