【问题标题】:exec bash script from php website, script not running从 php 网站执行 bash 脚本,脚本未运行
【发布时间】:2023-08-12 23:29:01
【问题描述】:

有一个带有按钮的网站,单击该按钮应该会启动一个假设卸载目录的 bash 脚本。按钮调用functions.inc php 脚本与此功能:

function sftmz_release_s3test_connections($bucket_name){
    if($bucket_name == 's3test'){
        drupal_set_message('Check mount status ! - released?');
        $cmd = '/var/www/html/company/sites/default/modules/rp_minisite/admin/script.sh';
        exec($cmd);
    }
}

我的问题是:当我在 shell 中运行命令时:

/var/www/html/company/sites/default/modules/rp_minisite/admin/script.sh  

它工作正常。

当我单击按钮时,会出现测试,但它不会运行脚本。如何查看日志?我可以将日志打印到 shell 吗?我不能,因为它是使用 html 上的按钮激活的...
我认为这是权限问题?

【问题讨论】:

    标签: php linux bash


    【解决方案1】:

    尝试获取更多关于致电exec 时实际发生的情况的信息:

    exec($cmd, $return, $status);
    echo '<pre>';
    var_dump($return);//is an array, containing the commands output
    echo '</pre>';
    if ($status === 0)
    {//normally, if a cmd exits with 0, all is well
        echo 'Command executed';
    }
    

    如果发生了一些有趣的事情,您可能需要检查您的脚本是否依赖于设置的环境变量/别名等。也许您必须加载一个.profile 文件才能使脚本正常工作。
    Here you can see how to do this

    【讨论】:

    • 当我回显时,我看不到任何东西,因为回显是从 php 脚本运行的,而不是我使用 shell 运行的,我如何以 root 身份查看脚本发送的回显?
    • script.sh 脚本(STDOUT、STDERR)的输出被重定向到$return 变量(exec 调用中的第二个参数),因此脚本的输出可以在@987654328 中找到@,回声确实是php脚本。注意:脚本以运行 php 的任何用户身份运行,因此您可能必须对脚本进行 chmod 以便所有用户都可以执行它
    • 我已经 chmod 777 脚本所以我想这已经足够了?
    • 如何在 shell 窗口中查看输出或将返回值写入文件..?谢谢
    • 正如我之前所说:exec($cmd, $output); file_put_contents('tmpFile.tmp', implode('\n', $output); 会将输出写入 tmpFile.tmp,但这会通过 php。您可以通过将其添加到命令中轻松地做到这一点:$cmd .= '&gt; tmpFile.tmp'&gt; 将 STDOUT 流重定向到文件 tmpFile.tmp。工作完成...
    【解决方案2】:

    您检查过exec() 函数的返回值吗?请参阅the doc 了解更多信息。

    【讨论】:

    • 如何查看?如果我执行 exec('script.sh',$output);然后 echo implode("\n", $output) 我无法查看它,以 root 身份登录但无法看到该 php 脚本的回声,因为它是从 web 运行的
    【解决方案3】:

    尝试使用exec 命令的其他参数..

    【讨论】: