避免让subversion修改Linux文件权限。

时间:2011-05-10 16:20:12

标签: linux svn file-permissions

我的所有代码库都存储在一个subversion存储库中,我将其分散到负载均衡的Apache Web服务器中,从而可以轻松检查代码,运行更新,并将我的代码无缝地开发到生产环境中。

我确信有一个简单的方法(除了在每次结账时执行脚本),其中一个不便之处就是在使用subversion更新或检出的文件上设置(返回)Linux权限。我们的安全团队设置了 httpd.conf 文件中设置的OwnerGroupdocumentRoot中的所有目录都获得了700的权限,所有非可执行文件(例如* .php,* .smarty,* .png)接收600的Linux权限,所有可执行文件接收700(例如* .sh,* .pl,* .py)。所有文件必须将所有者和组设置为apache:apache才能被httpd服务读取,因为只有文件所有者才能通过权限进行访问。

每次运行svn updatesvn co时,即使可能无法创建文件(即svn update),我发现文件的所有权正在变得越来越重要设置为运行svn命令的帐户,并且通常情况下,文件权限设置为不同于它们最初的内容(即更新前的.htm文件为600,但是在svn update之后,它被设置为755,甚至是777)。

绕过subversion尝试更新文件权限和所有权的最简单方法是什么?有没有什么可以在svn客户端或Linux服务器上完成以保留原始文件权限?我正在运行RHEL5(现在在几个选择实例上运行6个。)

6 个答案:

答案 0 :(得分:16)

文件的所有者将被设置为运行svn命令的用户,因为它实现了基础向上命令 - 它删除并替换了更新的文件,这将导致所有权“更改”到相关用户。防止这种情况的唯一方法是实际执行svn up作为文件应该被拥有的用户。如果要确保它们由特定用户拥有,请以该用户身份运行该命令。

关于权限,svn只服从帐户的umask设置 - 它可能类似于066 - 为了确保组和其他帐户无法访问该文件,您需要先发出'umask 077'执行svn up,这可确保只有发出命令的用户帐户才能访问这些文件。

除非.svn目录是安全的,否则我会注意将subversion数据部署到Web服务器的安全问题。

答案 1 :(得分:9)

您可以在Subversion中存储文件的属性(请参阅http://svnbook.red-bean.com/en/1.0/ch07s02.html)。您对svn:executable属性特别感兴趣,它将确保存储可执行权限。

但是,对于所有权限,没有通用的方法。 Subversion也不存储所有权 - 它假设,如果你检查出来,你就拥有它。

答案 2 :(得分:1)

您可以考虑做的一件事是在路径之外安装svn二进制文件,并在路径中放置替换脚本(在/usr/bin/svn或其他任何地方)。该脚本看起来像这样:

#!/bin/sh

# set umask, whatever else you need to do before svn commands

/opt/svn/svn $* # pass all arguments to the actual svn binary, stored outside the PATH

# run chmod, whatever else you need to do after svn commands

一个明显的缺点是你可能不得不对传递给svn的参数进行一些解析,即你可以将相同的路径传递给chmod,而不是为大多数svn命令运行chmod等。

这里也可能有一些安全考虑因素。我不知道您的部署环境是什么样的,但您可能应该进一步调查一下。

答案 3 :(得分:1)

我编写了一个小脚本,用于存储权限和所有者,执行SVN命令并恢复权限和所有者。 它可能不是黑客,但私人使用它可以做到这一点。

svnupdate.sh:

var data = [{
"RES_ID":"2622959",
"PROP_ID":"76055",
"RES_CHECK_IN":"2015-04-21",
"RES_CHECK_OUT":"2015-04-25",
"RES_N_ADULTS":"6",
"RES_GUEST_FIRSTNAME":"Nicolas",
"RES_GUEST_LASTNAME":"Prantzos"
 }];
 $("#reservation_id").autocomplete({
            source: function (request, response) {
                response($.map(data, function(v,i){
                    return {
                                label: v.RES_ID,
                                value: v.RES_GUEST_LASTNAME
                               };
                }));
            }
        }); 

答案 4 :(得分:1)

您可以解决此问题。使用setgid

  1. apache:apache正在运行服务器

  2. 为所有文件和目录设置组权限。服务器将通过它的组

  3. 读取文件
  4. 在所有目录上设置setgid - 仅在目录上:在文件上设置此功能

    示例(' 2'是setgid):

    chmod 2750

  5. apache设为所有目录的组

  6. 会发生什么

    • 任何帐户创建的新文件和目录将归apache组所有

    • 新目录将继承setgid,从而不遗余力地保留结构

    请参阅https://en.wikipedia.org/wiki/Setuid#setuid_and_setgid_on_directories

答案 5 :(得分:0)

我也有类似的问题。 我发现了一个很酷的脚本:asvn(存档SVN)。

您可以在此处下载: https://svn.apache.org/repos/asf/subversion/trunk/contrib/client-side/asvn

Description:
Archive SVN (asvn) will allow the recording of file types not
normally handled by svn. Currently this includes devices,
symlinks and file ownership/permissions.

Every file and directory has a 'file:permissions' property set and
every directory has a 'dir:devices' and 'dir:symlinks' for
recording the extra information.

Run this script instead of svn with the normal svn arguments.

此博客条目(帮助我查找脚本)http://jon.netdork.net/2010/06/28/configuration-management-part-ii-setting-up-svn/显示了一个简单的用法。