【问题标题】:Get return value from a bash script with PHP使用 PHP 从 bash 脚本中获取返回值
【发布时间】:2011-12-30 07:44:14
【问题描述】:

如何用 PHP 执行 shell 文件?

我有一个名为sync.sh的文件,那么如何在php中运行该文件以及完成执行后如何获取响应?我认为shell_exec() 将有助于触发文件,但我怎样才能得到脚本是否正确完成任务的响应?

【问题讨论】:

    标签: php shell


    【解决方案1】:

    看看exec() 函数。你可以传入一个 return_var 来保存 shell 脚本的退出代码。

    $out = array();
    $status = -1;
    
    exec( '/path/to/sync.sh', $out, $status );
    
    if ( $status != 0 ) {
        // shell script indicated an error return
    }
    

    需要注意的一点是,脚本将以 Web 服务器的权限运行,而不是您作为用户自己的权限。

    另外,请务必注意文档的安全相关警告:

    当允许将用户提供的数据传递给这个函数时,使用 escapeshellarg() 或 escapeshellcmd() 以确保用户无法欺骗 系统执行任意命令。

    【讨论】:

    • 这给了我错误 126。我认为我需要管理员权限才能运行该命令以及位于 /home/administrator/scripts 这条路径的脚本。我认为 Web 服务器没有授予访问 /var/www 文件夹之外的权限。对吗?
    • @SubhojitMukherjee 您是否设置了脚本的权限以便网络服务器可以运行它? (例如“chmod o+rx sync.sh”)。当您从您的用户帐户运行该脚本时,它是否有效?
    • 试试sh sync.sh。这不需要 sync.sh 是可执行的。
    【解决方案2】:

    根据documentation

    返回值

    执行命令的输出,如果发生错误,则为 NULL。

    只需获取该函数的返回值即可。

    $result = shell_exec('sync.sh');
    

    $result 将包含您想要的内容。

    【讨论】:

    • 问题是,我的同步文件位于 /home/administrator/scripts 所以命令将访问外部 www 文件夹?
    • @SubhojitMukherjee 这取决于 PHP 的设置方式,但通常情况下,这是可能的。只需给出脚本的绝对路径即可。
    • 我知道这是旧的,但只是不得不这样做,所以我想在这里发表评论:请注意,如果您将 PHP 脚本作为 Web 应用程序的一部分运行,则用户将是用户它在 Web 服务器上下文中运行,与在命令行上下文中不同。因此,您可能会以用户身份登录并测试脚本并且它可以工作,但是作为 Web 应用程序的一部分,它会失败,因为 Web 服务器没有以登录用户身份运行。要使其工作:“sudo -u username /path”,其中用户名是脚本所有者的名称,路径是脚本的完整路径。
    猜你喜欢
    • 2012-04-22
    • 2015-10-06
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    • 2012-10-27
    • 2021-03-20
    相关资源
    最近更新 更多