首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过PhP执行bash脚本与手动执行的结果不同

通过PhP执行bash脚本与手动执行的结果不同
EN

Stack Overflow用户
提问于 2015-09-22 18:19:09
回答 4查看 983关注 0票数 1

正如标题所述,当我尝试手动执行脚本时,双击并通过终端按执行。它工作正常

但是,当我运行php脚本或在终端窗口中键入php时

代码语言:javascript
复制
/usr/bin/php start_cam.php

它锁定(命令没有以"$“结束,"$”没有显示在终端窗口中,以显示它已经结束了任务,并且它不能正常工作。

下面是我的php脚本

代码语言:javascript
复制
<?php
        $command =escapeshellcmd("/bin/bash cmd_start_cam.sh");
        $output = shell_exec($command);
        echo $output;
        echo  "php_startcam2";

?>

下面是我的bash脚本(cmd_start_cam.sh)

代码语言:javascript
复制
!/bin/bash

echo 'running start camera script' 
cd
sudo chmod 755 /etc/rc.local
cd 
cd RPi_Cam_Web_Interface 
sudo chmod u+x RPi_Cam_Web_Interface_Installer.sh

sudo ./RPi_Cam_Web_Interface_Installer.sh stop 
sudo ./RPi_Cam_Web_Interface_Installer.sh start
echo 'complete start camera script' 

注意:我使用cd来确保根目录下的im与文件所在的位置相同。由于它是通过手动执行的,不认为存在路径问题吗?任何帮助都是非常感谢的。谢谢

Update:这是终端命令窗口输出的错误:

我想我在bash脚本命令echo 'complete start camera script'之后遇到了管道破裂

终端窗口输出cmd_start_cam.sh: line 12: echo: write error: Broken Pipe,并且不像正常执行时那样以$结束

顺便说一下,这是在raspberry pi 2上运行的。

更新已解决/解决方案:

感谢@ikra对检查apache日志文件的洞察力,这使我发现根本原因是权限访问。www-数据需要添加到sudoers文件中。

  1. 关于备份和编辑sudoers文件的说明:http://raspbypi.com/enabling-the-sudo-command-for-a-new-user/
  2. 苏多维苏
  3. 在文件www-data ALL=( ALL ) NOPASSWD: ALL的末尾添加以下内容
  4. 按CTRL+X,按yes键
  5. 登录和注销,以确保权限现在设置。
  6. 如果您的sudoer文件被破坏:在终端窗口中键入此文件以修复您输入错误的任何文本,pkexec visudo。(源:https://askubuntu.com/questions/73864/how-to-modify-a-invalid-etc-sudoers-file-it-throws-out-an-error-and-not-allowi)
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-09-27 21:37:52

感谢@ikra对检查apache日志文件的洞察力,这使我发现根本原因是权限访问。www-数据需要添加到sudoers文件中。

  1. 关于备份和编辑sudoers文件的说明:http://raspbypi.com/enabling-the-sudo-command-for-a-new-user/
  2. 苏多维苏
  3. 在文件www-data ALL=( ALL ) NOPASSWD: ALL的末尾添加以下内容
  4. 按CTRL+X,按yes键
  5. 登录和注销,以确保权限现在设置。
  6. 如果您的sudoer文件被破坏:在终端窗口中键入此文件以修复您输入错误的任何文本,pkexec visudo。(源:https://askubuntu.com/questions/73864/how-to-modify-a-invalid-etc-sudoers-file-it-throws-out-an-error-and-not-allowi)
票数 1
EN

Stack Overflow用户

发布于 2016-05-20 11:07:49

我最近发布了一个项目,允许PHP获得真正的Bash并与之交互(如果请求作为根),它解决了exec()和shell_exec()的限制。到这里来:https://github.com/merlinthemagic/MTS

下载后,只需使用以下代码:

代码语言:javascript
复制
$shell    = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', true);
$return1  = $shell->exeCmd('php start_cam.php');
//the return will be a string containing the return of the command
echo $return1;

您可以维护bash脚本,并像我的示例那样简单地触发它。然而,看到这个脚本只是一堆bash命令,为什么不直接将它们触发到shell中,这样就可以处理返回和任何异常。

在安全性方面,这比将apache作为root或在解决方案更新中列出的大范围开放的sudo权限运行要好得多。但是让PHP靠近根总是很棘手的。

我构建的项目通过以下两种方式之一实现了根bash:

1)允许apache拥有sudo python的权利。

2)每次需要根设置的shell时,都会将根凭据传递给对象。

挑出你的毒药。)阅读文件。

票数 1
EN

Stack Overflow用户

发布于 2015-09-22 18:27:10

你要么检查一下:

  • 苏伊德您的shell脚本,这些脚本与sudo一起运行。
  • 并确保PHP脚本的当前目录(和PATH)一切正常。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32724081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档