繁体   English   中英

PHP运行bash(.sh)脚本。 dpkg --info有效但dpkg -i无效

[英]PHP running bash (.sh) script. dpkg --info works but not dpkg -i

示例PHP脚本如下所示:

#!/usr/bin/php
    $file = '/private/var/www/app/install.sh';
    if(is_file($file)){
        $output = shell_exec('bash /private/var/www/app/install.sh');
        fwrite(STDOUT, $output."\n");
    }
    exit(0);

install.sh示例

#!/bin/bash
clear
echo "Executing Install Script..."
dpkg --info /private/var/www/app/app.deb
dpkg -i /private/var/www/app/app.deb
echo "Script Finished"
exit 0

这将打印出最终的dpkg --info数据,但不会运行dpkg -i。 它不会打印出任何错误或任何内容...

另外,这是通过网络浏览器执行的。 从终端运行脚本时,它可以正常工作。 但是在网络上,仅返回info命令。

您在此处尝试执行的操作可能涉及一些安全问题,我不会在此发表评论。 但是,我猜想dpkg -i需要以root身份运行,而您的Web服务器(执行install.sh脚本)不是以root身份运行。 另一方面, dpkg --info命令不需要root特权即可运行,因此当通过Web服务器的用户执行时,您将看到其输出。 如果您确实需要以root用户身份运行此脚本,则可能需要查看特定的/etc/sudoers配置。 也许从这里开始: https : //help.ubuntu.com/community/Sudoers

并在这里看看: http : //ubuntuforums.org/showthread.php?t=1132821

dpkg --info不需要root权限,而dpkg -i则需要root权限。 由于您在浏览器上运行脚本,因此这意味着您的脚本在php / apache的用户上运行。 我相信,在大多数安装中,该用户没有root权限。

为了克服这个问题,您可以创建某种具有以下步骤的处理器:

创建queue列表

  • queue_id
  • 时间戳记
  • deb_file
  • is_processed

浏览器脚本

  • 单击安装后,将条目插入队列表。

处理器脚本(比方说queue_processor.php

  • 运行时,检查队列表中是否存在is_processed = 0的条目
  • 是否有:
    • 更新is_processed = 1
    • 处理该文件
    • 完成处理后(安装deb文件),将is_processed设置为2

最后一步是,在crontab上设置queue_processor.php并将其所有者作为根用户:

*   *   *   *   *   root   /path/to/php/binary/php /path/to/your/queue_processor.php

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM