Почему этот сценарий оболочки не работает, как ожидалось от PHP?

У меня есть эта программа PHP в папке /var/www для запуска сценария оболочки и загрузки файла HTML, созданного этим сценарием оболочки. Если я запускаю сценарий оболочки вручную из командной строки, он работает как шарм, но при запуске через программу PHP из браузера он создает только пустой файл.

PHP-КОД

$a = './script.sh '.$foo.' '.$bar;
$b = shell_exec($a);
include '/var/tmp/reports/r.html';

СЦЕНАРИЙ ОБОЛОЧКИ

cat file.ext | awk <something with $foo and $bar> | command > /var/tmp/reports/r.html

(Редактировать ^ "file.ext" на самом деле является файлом .log. Он расположен в /var/log/.. А "command" - это другая программа, которая создает файл .html из этого файла журнала)

Права доступа к моим файлам:

-rw-r--r-- 1 abc    www-data   848 Feb 13 10:43 php.php
-rwxr-xr-x 1 ubuntu www-data   230 Feb 13 10:51 script.sh*

И /var/tmp/reports/r.html не существует до выполнения PHP. После выполнения скрипта напрямую через командную строку он создает файл r.html, например:

-rw-rw-r-- 1 ubuntu ubuntu 121884 Feb 13 11:42 r.html

Но когда скрипт выполняется через PHP из браузера, он создает пустой файл, подобный этому

-rw-r--r-- 1 www-data www-data      0 Feb 13 11:43 r.html

Edit1: по предложению @lurker я попытался изменить script.sh на

#!/bin/sh

cat file.log | awk '{if(substr($5,2)>="'$1'" && substr($5,2)<="'$2'")print $0}' | awk 'gsub(",", "", $1);' | /usr/bin/command > /var/tmp/reports/r.html

Он также создал только пустой файл.

Edit2: я изменил скрипт на ->

#!/bin/bash
sudo echo "sdfsf" > /var/tmp/reports/r.html

Даже это не сработает.


person Sumit Sinha    schedule 13.02.2015    source источник
comment
shell_exec($output) ... что такое $output? Разве это не должно быть shell_exec($a)?   -  person lurker    schedule 13.02.2015
comment
@lurker ой! Я исправил это!   -  person Sumit Sinha    schedule 13.02.2015
comment
Где находится file.ext? И определен ли command в PATH, с которым работает PHP? Похоже, что ./script.sh выполняется, но что-то не работает в командной строке внутри скрипта, поэтому > ... создает файл, но выполнение того, что его заполняет, не выполняется.   -  person lurker    schedule 13.02.2015
comment
file.ext на самом деле является файлом .log. он находится в /var/log/.. И команда - это другая программа, которая создает файл .html из этого файла журнала.   -  person Sumit Sinha    schedule 13.02.2015
comment
Верно. Я предположил, что, возможно, script.sh не знал, где он находится при выполнении из PHP. Где определяется command? Он может быть в вашем PATH при запуске из оболочки, но не в PATH, который PHP видит при выполнении. Эти ПУТИ разные. В вашем script.sh вы должны попробовать /path/to/command вместо command, чтобы посмотреть, решит ли это проблему (/path/to — это полный путь, в котором находится command).   -  person lurker    schedule 13.02.2015
comment
У вас могут возникнуть проблемы с использованием переменных в awk. Что если показать код части awk?   -  person fedorqui 'SO stop harming'    schedule 13.02.2015
comment
Как установить путь для этого? Должен ли я сделать что-то подобное? stackoverflow.com/questions/5144238/   -  person Sumit Sinha    schedule 13.02.2015
comment
@fedorqui скрипт работает как шарм, если я запускаю его непосредственно из командной строки, например ./script.sh В любом случае, awk похож на -› | awk '{if(substr($5,2)›='$1' && substr($5,2)‹='$2')print $0}' | awk 'gsub(,, , $1);' |   -  person Sumit Sinha    schedule 13.02.2015
comment
@SumitSinha проблема со сценариями awk заключается в том, что им может потребоваться экранирование $i для работы, если они вызываются с другой платформы, например PHP: \$i и т. д.   -  person fedorqui 'SO stop harming'    schedule 13.02.2015
comment
@fedorqui пытался. Даже тогда это не сработает.   -  person Sumit Sinha    schedule 13.02.2015
comment
@SumitSinha да, вы можете изменить путь из PHP, или я думаю, было бы неплохо обновить путь изнутри script.sh или просто указать полный путь к команде, как я указал в своем последнем комментарии.   -  person lurker    schedule 13.02.2015
comment
@lurker Я попробовал твое предложение. Я дал мне тот же пустой файл, что и раньше.   -  person Sumit Sinha    schedule 13.02.2015
comment
Пожалуйста, покажите, что вы пробовали, добавив это в описание проблемы. Мне непонятно, как выглядит ваш обновленный код. Кроме того, не зная, что такое PATH в PHP, может быть, он тоже не может найти awk? Трудно сказать, не зная, что такое ПУТЬ. Попробуйте также тестовый пример, временно удалив awk из вашего скрипта и просто cat файл на выходе, и посмотрите, работает ли это. Другими словами, разбейте проблему методом исключения, чтобы вы могли определить, где она находится.   -  person lurker    schedule 13.02.2015
comment
Конечно! см. Изменить внизу вопроса выше.   -  person Sumit Sinha    schedule 13.02.2015
comment
Смотрите дополнительную информацию в моем ответе. Я почти уверен, что это проблема PATH, и неясно, насколько ограничен PATH по умолчанию в вашей среде PHP. Я также предложил несколько советов по отладке в своем предыдущем комментарии.   -  person lurker    schedule 13.02.2015
comment
@lurker Спасибо, дорогая! Я пробую эти ваши советы.   -  person Sumit Sinha    schedule 13.02.2015
comment
У вас есть разрешение на запуск этой команды? Возможно, пользователь-владелец скрипта не в sudoers.   -  person fedorqui 'SO stop harming'    schedule 13.02.2015
comment
Пользователь ubuntu, владелец скрипта, находится в sudoers. Я даже пытался изменить владельца программы php на «ubuntu». Но тогда он даже не создаст пустой файл   -  person Sumit Sinha    schedule 13.02.2015
comment
Какие права доступа к каталогу /var/tmp/reports?   -  person lurker    schedule 13.02.2015
comment
@lurker Разрешения для каталога отчетов: drwxrwxrwx 2 root root 4096 Feb 15 10:21 reports/ .   -  person Sumit Sinha    schedule 15.02.2015


Ответы (1)


Для команды cat file.ext | awk <something with $foo and $bar> | command > /var/tmp/reports/r.html, когда я выполнял ее непосредственно из script.sh, она подошла к file.ext как ubuntuuser. ubuntu пользователю был разрешен доступ к file.ext, так как он принадлежал к группе, которая могла его прочитать. Но когда я выполнил командную форму php.php script через браузер, он получил доступ к file.ext как abc пользователь (abc на самом деле был www-data пользователем apache2). Ни пользователь abc (я имею в виду пользователя www-data), ни принадлежит к группе, которая могла получить доступ к файлу, ни файл не позволял other users читать его. Следовательно, скрипт php не смог произвести правильный вывод.

person Sumit Sinha    schedule 26.02.2015