PHP или Apache?Команды exec, popen, system и proc_open не выполняют никаких команд, даже ls - PullRequest
0 голосов
/ 15 апреля 2011

Моя проблема с выполнением любой команды с моей домашней страницы php

Половина решена, я запустил свой pythonscript, но далее у pythonscript нет разрешения на выполнение его модулей

но я начинаю думать, что проблема в apache, а не в php? я попытался запустить pythonscript, который на самом деле и будет работать в конце, затем он запускается, но останавливается, когда скрипт пытается получить доступ к txt-файлу, похожему на этот

[stdout] =>
[stderr] => Traceback (most recent call last): 
 File "pythontest.py", line 4, in ? f = open("(path)/temp.txt", "w") 
 IOError: [Errno 13] Permission denied: '(path)/temp.txt'

Я перепробовал все различные виды методов выполнения, которые я мог найти exec, system, popen, proc_open, почти ничего не работает, я могу получить строку из system ("pwd"), но system ("ls") возвращает число 127 или 126. Я также пытался запустить скомпилированную программу c (код ниже), exec вернет объект "Array", но система вернет только 127 или 126, как это делает ls.

Также я пытался получить значения из объекта "Массив"? из exec, но ничего не возвращает, если я php print_R Array страница не загрузится.

вывод php (код ниже) -> a:, out1: 126, t [[0]:, strlen out: 5, out: Array, t: независимо от того, сколько аргументов я на самом деле привел!

полный путь к ls дает 126, а просто "ls" дает число 127

Я протестировал chmod для всех файлов с полным разрешением, из page.php для тестирования программы, но все равно выдает тот же вывод

php безопасный режим отключен

<code>echo '<pre>';
print_r(execute('ls'))
echo '
';

возвращает

array
(
    [stdout] => 
    [stderr] => sh: /var/www/html/grndb/upscgenesearch/test1: Permission denied

    [return] => 126
)

почему выдается разрешение «Отказано», когда программа test1 имеет полное разрешение?

<?php
$a = system("/bin/ls",$out1);
echo "a: "; echo $a;
echo ", out1: "; echo $out1;
$t = exec('pwd/test1 aa hh 11',$out);

foreach ($t as &$value) {
    echo ($value);
}

echo ", t[[0]: "; echo $t[0]; 
echo ", strlen out: "; echo strlen($out);
echo ", out: "; echo $out; 
echo ", t: "; echo $t;
?>

C исходный код

int main(int argc, char *argv[])
{
int i;

for(i = 0; i < argc; i++)
printf("arg %d: %s\n", i, argv[i]);
return 0;
}

Ответы [ 4 ]

3 голосов
/ 15 апреля 2011

Вот еще одна функция для добавления в список :)

/**
 * Executes a program and waits for it to finish, taking pipes into account.
 * @param string $cmd Command line to execute, including any arguments.
 * @param string $input Data for standard input.
 * @return array Array of "stdout", "stderr" and "return".
 * @copyright 2011 K2F Framework / Covac Software
 */
function execute($cmd,$stdin=null){
    $proc=proc_open($cmd,array(0=>array('pipe','r'),1=>array('pipe','w'),2=>array('pipe','w')),$pipes);
    fwrite($pipes[0],$stdin);                      fclose($pipes[0]);
    $stdout=stream_get_contents($pipes[1]);        fclose($pipes[1]);
    $stderr=stream_get_contents($pipes[2]);        fclose($pipes[2]);
    $return=proc_close($proc);
    return array( 'stdout'=>$stdout, 'stderr'=>$stderr, 'return'=>$return );
}

Пример использования для вашего случая:

<code>echo '<pre>';
print_r(execute('ls'));
echo '
';

Приведенная выше функция предлагает больше возможностей, чем прямое использование PHP. Это может помочь при отладке, хотя больше предназначено для производственного кода.

В общем, это то, что вы должны знать:

  • Вы не в безопасном режиме
  • Ваш исполняемый файл существует
  • Ваш исполняемый файл является работоспособным - знайте, что FTP-клиенты часто используют режим ASCII / Text, изменяя CRLF в загруженных файлах, тем самым портя их
  • Не забудьте chmod вашего исполняемого файла как минимум 755
1 голос
/ 05 августа 2011

Проблема в разрешениях на каталог. Каждый каталог выше вашего в пути должен иметь по крайней мере, разрешение на чтение. Таким образом, если вы хотели

# ls /root/test_dir

вы бы оба

# chmod 777 /root/test_dir
# chmod 777 /root

ПРИМЕЧАНИЕ: это плохая идея с точки зрения безопасности. вместо этого возможно:

# mkdir /public
# chmod 744 /public
# mv /root/testdir /public

обратите внимание, что здесь 744 будет применяться к test_dir

1 голос
/ 15 апреля 2011

Работает ли безопасный режим?Вы пытаетесь получить доступ к файлам за пределами safe_mode_exec_dir?

"Когда включен safe_mode, только исполняемые файлы, расположенные в safe_mode_exec_dir, будут разрешены для выполнения через семейство функций exec."

Вына вашем собственном сервере или на общем хосте?Некоторые хосты отключают работу функций EXEC в целях безопасности.

0 голосов
/ 15 апреля 2011

// Как сказал Немоден, используйте (обратный тик):

$cmd='ls /var/www/';
$variable_name=`$cmd`;

Если вы не хотите сохранять значение, используйте команду passthru. exec и системная команда будут показывать только одну строку (данные после прерывания строки обрезаются)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...