通过浏览器从 php 脚本调用 svn update 不起作用

Posted

技术标签:

【中文标题】通过浏览器从 php 脚本调用 svn update 不起作用【英文标题】:Calling an svn update from a php script via a browser is not working 【发布时间】:2011-02-26 05:33:27 【问题描述】:

我有两个脚本。

    运行更新并调用 shell_exec('svn update') 和 shell_exec('svn st') 运行 mysqldump shell_exec('mysqldump params')

svn 脚本没有运行更新命令,svn st 正在打印结果但不是svn update

我尝试在调用 svn update 时声明参数,例如 'svn 更新' 。目录' --username myuser --password mypasswd --non-interactive'; - 依然没有 玩了大部分的参数

如果这与二进制文件/权限/组有关,我看不到。 mysqldump 命令运行良好,并且正在生成文件,那么为什么 svn 不更新文件系统?

请不要建议在 php 中使用核心 SVN 类。这不是一个选项,我无法完全控制服务器并且该模块不可用。

感谢您的帮助,

-hbt

PS:这里要提一下重要。当通过命令行调用时,脚本工作。只有在通过网络浏览器调用时才会失败。

【问题讨论】:

你确定从浏览器调用shell_exec('svn update')的结果是空的吗?很可能是权限问题(svn 工作目录和 http 进程的用户不同),但在这种情况下应该会出现类似“svn: Can't open file '.svn/lock': Permission denied”的错误。 您是否已经尝试过捕获输出并将其转储到屏幕/调试时查看输出? IE。 $output = shell_exec('svn update ...'); print_r($output);。您确定您没有忘记将文件夹作为变量引用吗(因为给出的示例包含 dir 而不是 $dir,除非 dir 当然被定义为命名常量)。 @alexander 确实获得了许可。它是 .svn 目录。 svn update 命令正在尝试在其中写入内容。感谢您的帮助 @wimvds 是的,示例是即时编写的。 print_r 为exec 命令返回空, var_dump 为shell_exec 命令返回空。不过我想通了。下面贴出答案。感谢您的帮助 我找到了另一种运行顺畅的方法。 ***.com/a/8532448/2805783 【参考方案1】:

要获得返回值中的标准错误,请使用:

shell_exec('2>&1 svn update')

如果你把2>&1放在最后就不行了

【讨论】:

【参考方案2】:

是的,问题在于 .svn 目录的权限。

确保它对运行 PHP 的用户(在我的例子中是 apache)和 chmod 到 775 的用户具有正确的权限。

【讨论】:

【参考方案3】:

我也遇到了同样的问题,但连权限都没有解决。

根据这里的一些其他建议,我做了:

<?php
echo shell_exec('2>&1 svn update /path/to/checked/out/directory/ --non-interactive');

然后我的浏览器中出现了一个错误:

svn: warning: Can't open file '/root/.subversion/servers': Permission denied
svn: OPTIONS of 'http://my.svn.server/svn/project/trunk': authorization failed: Could not authenticate to server: rejected Basic challenge (http://my.svn.server)

不知道为什么我的网络服务器用户尝试访问 /root,但我通过在 svn up 命令中添加 --config-dir 来解决问题而没有更改任何权限:

<?php
echo shell_exec('2>&1 svn update /path/to/checked/out/directory/ --non-interactive --config-dir /path/to/my/home/.subversion');

*注意 /path/to/my/home/.subversion 存在是因为初始签出是在命令行上完成的

【讨论】:

【参考方案4】:

好的。我得到了它。 这是权限问题。 .svn 目录必须具有正确的权限,因为 svn update 命令正在使用这些目录来写入内容。

所以! ---确保您以 sudo 或 root 身份运行所有 chmod 命令----

    在 .svn 目录上运行 chmod 777 通过命令行运行 svn 更新 调用脚本

如果没有。您必须为所有 .svn 目录递归运行 chmod 777 然后运行另一个 svn update

还是什么都没有?

确保你没有两个 svn 客户端 就我而言,UI 使用的 svn 客户端与 svn(命令行)不同 如果您有两个客户端,请确保它们运行相同的版本 或者更新您的脚本以直接调用客户端。

还是什么都没有?

运行 chmod 777 -R * svn更新 然后再试一次

如果您可以使其与另一组权限一起使用,请告诉我。我知道 777 并不理想,但我无法让它与更低的东西一起使用。

再次感谢各位。

【讨论】:

【参考方案5】:

你试过PECLsvn extension吗?你不需要为此使用shell_exec

【讨论】:

很遗憾,svn 扩展在服务器上不可用。【参考方案6】:

这可能是权限问题:通过网络浏览器调用的脚本在与 svn 工作目录所有者不同的用户名下运行,因此它具有只读访问权限。只读访问应该足以让svn status 执行,但不适用于svn update(尽管在这种情况下应该有类似 "svn: Can't open file '.svn/lock': Permission拒绝”)。

【讨论】:

没有错误,但已通过权限修复。下面贴出答案。谢谢!

以上是关于通过浏览器从 php 脚本调用 svn update 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个带有 shell_exec 调用的 PHP 脚本从 Windows 10 的命令行运行,而不是浏览器/本地主机?

从 ubuntu 服务器向浏览器推送数据

从 php While 循环中调用的 jQuery 脚本无法正常工作

如何从需要 SUDO 的 php 调用 shell 脚本?

windows下用php实现svn代码更新

svn up (svn update) 状态缩写含义: