【问题标题】:PHP passthru() returning "sh: 1: svn: not found " errorPHP passthru() 返回“sh: 1: svn: not found” 错误
【发布时间】:2015-02-19 01:52:55
【问题描述】:

我们的大学在 Linux 服务器上免费托管,我在其中将一个 SVN 项目签入到我的本地学生目录中。在远程登录服务器时,我在服务器上的 SVN 项目沙箱中添加/提交/等没有问题。

我在同一台服务器上有一个 PHP 脚本,它发出 passthru 调用以在该沙箱上执行一个简单的 SVN 版本号命令:

<?php
    echo passthru(' 2>&1 cd /nav/to/svnSandbox && 2>&1 svn --version ');
?>

上面的 exec() 调用在服务器端失败并输出

"sh: 1: svn: not found" 到client 一侧。这意味着没有安装SVN?不过它其实是安装在服务器上的,而且我在登录的时候也能正常使用SVN。

以下 PHP 代码可以正常工作:

<?php
    echo passthru('pwd');
?>

PHP 脚本和 SVN 沙箱目录的用户权限为 755(我也尝试了许多其他变体)。我还阅读了this 链接等。

PHP 脚本是否未授予对服务器端 SVN 命令的某些访问权限?

为什么我不能从我的脚本中成功调用 SVN exec() ?有没有比我上面的代码更简单的方法?

服务器管理员通常对使用 exec() 的脚本有某种我不知道的保护措施吗?

【问题讨论】:

    标签: php linux svn exec server


    【解决方案1】:

    这说明没有安装SVN?

    不,它只是表示在您的路径中找不到svn

    可能是因为它没有安装,或者可能是你的路径没有为你使用的方法正确设置。

    比较输出:

    <?php
        echo passthru('echo $PATH');
    ?>
    

    并在登录到盒子时执行echo $PATH

    您可能会在后者而不是前者上找到svn 目录。

    接下来就是想办法为 passthru 方法设置路径了。

    可能很简单,比如:

    <?php
        echo passthru('( cd /nav/to/svnSandbox; PATH=$PATH:/svnpath; svn --version ) 2>&1');
    ?>
    

    或:

    <?php
        echo passthru('( cd /nav/to/svnSandbox; /svnpath/svn --version ) 2>&1');
    ?>
    

    【讨论】:

    • 您对 PATH 中的差异是正确的。谢谢,我学到了很多。不幸的是,PHP 脚本的 PATH 中唯一的东西是 /bin,我不确定是否可以通过 exec 调用来设置 PATH 变量。
    • 年轻的@Padawan,设置它你可以:-) 你给出的那个命令看起来像一个通用的shell命令,所以修改PATH 应该可以正常工作。或者您可以尝试运行svn 的绝对路径,如更新中所示(当然,将/svnpath 替换为svn实际 路径)。
    猜你喜欢
    • 2018-06-06
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    • 2015-12-18
    • 2020-07-28
    • 1970-01-01
    相关资源
    最近更新 更多