我编写了一个更新SVN工作副本的PHP脚本。
它在我的开发机器(W2k3服务器)上工作正常,但我不能让它在生产服务器(W2k8服务器)上工作。我正在使用最新的Collabnet Subversion二进制文件(1.6.17)。
这是PHP代码:
$command = 'svn update C:\inetpub\wwwroot\mysite --config-dir C:\Windows\Temp';
$response = array();
$handle = popen("$command 2>&1", 'r');
$read = '';
while( $read = fread( $handle, 20096 ) )
{
$response[] = $read;
}
pclose( $handle );
flush();
echo '<h2>Command</h2><p> ' . $command . '</p>';
echo '<h2>Response</h2><p>' . implode( '<br />', $response ) . '</p>';
当我从命令提示符运行相同的命令时,它工作正常。但是当我通过IIS运行它时,我得到:
svn:无法打开文件'C:\ inetpub \ wwwroot \ mysite.svn \ lock':访问被拒绝。
据推测,我需要提升权限,但我不知道如何实现它。
我已经尝试让_IUSR帐户完全控制包含svn和C:\ inetpub \ wwwroot \ mysite.svn \文件夹的文件夹,但它没有任何区别。
由于
答案 0 :(得分:2)
C:\inetpub\wwwroot\mysite.svn
的读/写权限(如果是结帐)。C:\inetpub\wwwroot\mysite.svn
提供对IIS属性中文件夹的写入权限。答案 1 :(得分:2)
与SVN和Windows Server 2008有同样的问题。问题是由UAC引起的,如果他们不拥有该文件,通常会阻止某人更改文件。在SVN的情况下,问题通常是一个用户执行初始结账,创建.svn文件夹和相关位。然后,另一个用户转到svn up
并获得有关修改SVN数据库文件的操作系统级访问问题。
不幸的是,我们可以获得的最佳解决方案是禁用UAC。实际上解决了一些其他问题,它在服务器上确实有意义。如果它作为计划任务运行,那么您可以尝试“以最高权限运行”,但提升那么多对Web应用程序没什么意义。
答案 2 :(得分:1)
我认为你需要专门授予运行PHP的用户的读/写权限。在我的情况下,php作为Apache模块运行,因此它在同一帐户下运行。我不熟悉你的设置,但基本的想法是一样的。一旦确定了运行PHP的帐户,授予它对锁定文件的写入权限,您的问题就会消失。
我不建议在生产服务器上禁用UAC !!永远!!! 您希望为最少数量的用户授予最少量的权限,以获得所需的最少资源。
请勿删除所有用户帐户安全性以写入锁定文件!!! 而是授予单一权限写入权限。没有完全控制。将其授予需要它的单个用户(可能是本地系统帐户)。将其授予需要写入的特定文件(C:\ inetpub \ wwwroot \ mysite.svn \ lock)。
这种做法可以防止恶意利用这个漏洞!
答案 3 :(得分:0)
谢谢大家。最后所有这些答案都有所帮助。
我需要做几件事:
执行svn清理
如果在设置权限时拒绝访问,则转为UAC
顶级.svn文件夹需要IIS_IUSR的写权限
所有.svn文件夹都需要Users组的读/写权限。 但是,没有明显的方法可以执行此操作,因此需要设置权限 在整个网站目录上。
之后,PHP脚本能够执行svn update命令。呼!