0

示例 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。它不会打印出任何错误,或任何东西......

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

4

2 回答 2

1

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

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

于 2011-04-26T02:23:07.243 回答
0

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

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

创建queue

  • queue_id
  • 时间戳
  • deb_file
  • is_processed

浏览器脚本

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

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

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

最后一步是,queue_processor.php在 crontab 上进行设置,并以 root 身份拥有它:

*   *   *   *   *   root   /path/to/php/binary/php /path/to/your/queue_processor.php
于 2011-04-26T02:38:50.693 回答