无法打开文件 'svn/repo/db/txn-current-lock':权限被拒绝。

50

我已经建立了一个Linux服务器,并安装了Apache、SVN和dav_svn。现在,当我尝试使用Tortoise SVN上传到https://x.x.x.x:x/svn/repo时,出现以下错误信息:

Can't open file '/server/svn/repo/db/txn-current-lock': Permission denied

我已经正确设置了SSL(我可以结账,没有问题,甚至远程访问,因为端口转发)。

我猜这与存储库文件夹的Linux所有权有关,我该如何设置/使用哪些命令?


6
为确保问题出在这里,请在所有项目上都输入777。 - Itay Moav -Malimovka
1
777是什么意思? - wsd
@wsd » 我更新了我的答案,包括与权限相关的其他信息,因为你似乎对此感到困惑。 - John Feminella
9个回答

69

这是一个常见的问题。你很可能遇到了权限问题。要解决这个问题,请确保 apache 用户有读/写整个存储库的权限。为此,请在 svn 存储库下的所有内容上执行 chown -R apache:apache *chmod -R 664 *

此外,如果仍然困惑,请参见这里这里


回答 OP 在评论中额外提出的问题:

"664" 字符串是权限的八进制(基数为 8)表示法。这里有三个数字,分别代表该文件或目录对于 所有者其他人(有时称为“世界”)的权限。

请注意,每个八进制数字可以用 3 位二进制数表示(从“0”的“000”到“7”的“111”)。每个位都有一些含义:

  • 第一位:读取权限
  • 第二位:写入权限
  • 第三位:执行权限

例如,在文件上的 764 表示:

  • 所有者(第一位)有读/写/执行(7)权限
  • 组(第二位)有读/写(6)权限
  • 其他人(第三位)有读取(4)权限

希望这能解决问题!


1
我通过将仓库目录的完全控制权授予svn用户来解决了Windows Server 2003上的这个问题。 - Jason
5
你的回答顶部(灰色突出显示部分)写着 chmod 664,但我认为你的意思是 764? - Shane H
3
为了避免目录问题,请尝试以下操作: find . -type d -exec chmod 755 {} \; find . -type f -exec chmod 644 {} \; - Terence Johnson
根据您的配置,您可能需要使用chmod -R 770 repoName,否则用户可能会收到“无法打开请求的SVN文件系统”的消息。 - Steve Swinsburg
chmod -R 774 对我有用,否则我无法通过svn+ssh以另一个用户身份提交。 - Jonny
显示剩余4条评论

13

这是权限问题。不是Apache用户的“传统”读写权限,而是selinux权限。

Apache无法写入标记为httpd_sys_content_t的文件,它们只能被Apache读取。

您有两种可能性:

  1. label svn repository files as httpd_sys_content_rw_t:

    chcon -R -t httpd_sys_content_rw_t /path/to/your/svn/repo
    
  2. set selinux boolean httpd_unified --> on

    setsebool -P httpd_unified=1
    
我更倾向于第二种可能性。您还可以尝试使用与httpd相关的其他Selinux布尔值来解决问题。
getsebool -a | grep httpd

3
选项1的问题在于,如果文件系统再次被重新标记(有时会在重启时发生),那么您所做的更改将会消失。一个更好的选项(我比你的选项2更喜欢)是“教”SELinux的策略,让其允许apache写入特定的目录:semanage fcontext -a -t httpd_sys_content_rw_t "/path/to/your/svn/repo(/.*)?",然后使用restorecon -R /path/to/your/svn/repo重新标记此路径。这样更加安全,因为您使用SELinux来实现它的设计目的:精确地指定允许和不允许的内容。 - Guss
如果您认为这有点过头了,您可以按照以下链接禁用SELinux:http://docs.fedoraproject.org/en-US/Fedora/13/html/Security-Enhanced_Linux/sect-Security-Enhanced_Linux-Working_with_SELinux-Enabling_and_Disabling_SELinux.html - ATorras
这可能在 Red Hat/CentOS/... 的不同版本中有所改变。 为了让 RHEL 7.3 安装正常工作,我必须执行以下操作:semanage fcontext -a -t httpd_sys_rw_content_t "/SOME/PATH/TO/repos/.*",然后执行 restorecon -R /SOME/PATH/TO/repos,最后执行 systemctl restart httpd(尽管最后一个命令可能不是必需的。) - Troels Arvin

3

最近我也遇到了这个问题,原因是SELinux引起的。我试图通过Subversion的post-commit通知Jenkins代码发生了变化,以便Jenkins进行构建和部署到Nexus。

为了让它正常工作,我需要执行以下操作:

1)首先检查SELinux是否启用:

    less /selinux/enforce

这将输出1(表示开启)或0(表示关闭)

2)临时禁用SELinux:

    echo 0 > /selinux/enforce

现在测试看看它是否正常工作。

3) 启用SELinux:

    echo 1 > /selinux/enforce

改变SELinux策略。 4)首先查看当前配置:
    /usr/sbin/getsebool -a | grep httpd

这将给你:httpd_can_network_connect --> 关闭
5) 将其设置为开启,您的提交后操作将可以在 SELinux 下工作:
    /usr/sbin/setsebool -P httpd_can_network_connect on

现在它应该可以正常工作了。

1
我遇到了一些奇怪的问题。如果我将_selinux enforce_设置为0,我可以提交更改,仓库将通知jenkins并执行作业等。但是当我将enforce设置回1和_httpd_can_network_connect on_时,当我尝试提交时,我会收到_svn:E000013:Commit failed(details follow):svn:E000013:无法打开文件'/usr/share/svn-repositories/ci_repo/db/txn-current-lock':Permission denied_。该文件夹的仓库所有者是apache。我还尝试将权限设置为766,如@JohnFerminella所建议的那样。将_enforce 0_设置为什么后果? - Jonathan Morales Vélez
我在禁用SELinux之前强制将其设置为0。现在它对我来说完美地工作了。 - ATorras

2
例如在Debian上的示例。
sudo gpasswd -a svn-admin www-data
sudo chgrp -R www-data svn/
sudo chmod -R g=rwsx svn/

0
我通过删除txn-current-lock来解决这个问题。

0

我刚遇到了这个问题

  1. 多个用户使用同一个仓库导致了问题
  2. 请注销其他正在使用该仓库的用户

希望这可以帮到你


0
除了仓库权限外,所有用户还必须能够写入 /tmp 目录。

0

以下是您可以遵循的3个步骤:

  1. chmod -R 775 <repo path>  
    ---> 修改仓库权限
    
  2. chown -R apache:apache <repo path>  
    ---> 修改 SVN 仓库所有者
    
  3. chcon -R -t httpd_sys_content_t <repo path>  
    ----> 修改 SVN 仓库的 SELinux 安全上下文
    

-1
尝试通过以下命令禁用SELinux:/usr/sbin/setenforce 0。在我的情况下,它解决了问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接