Моя проблема заключается в выполнении любой команды с моей домашней страницы 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 почти ничего не запускает, я могу получить строку из системы («pwd»), но система («ls») возвращает число 127 или 126. Я также попытался запустить скомпилированную программу c (код ниже) exec вернет объект «Массив», но система вернет только 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 отключен
echo '<pre>'; print_r(execute('ls')) echo '</pre>';
возвращается
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; }
Вот еще некоторые функции, которые нужно добавить в список 🙂
/** * 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 ); }
устройство/** * 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 ); }
Пример использования для вашего случая:
echo '<pre>'; print_r(execute('ls')); echo '</pre>';
Вышеупомянутая функция предлагает больше возможностей, чем напрямую с помощью PHP. Это может помочь вам при отладке, хотя оно больше предназначено для производственного кода.
В общем, это то, что вам следует знать:
Безопасный режим работает? Вы пытаетесь получить доступ к файлам за пределами safe_mode_exec_dir?
«Когда safe_mode включен, только исполняемые файлы, находящиеся в файле safe_mode_exec_dir, будут разрешены для выполнения через семейство функций exec».
Вы на своем собственном сервере или на общем хосте? Некоторые хосты отключат функционирование функций EXEC для целей безопасности.
Проблема заключается в разрешениях в каталоге. Каждый каталог, расположенный выше вашего пути, должен иметь как минимум разрешение на чтение. Таким образом, если вы хотите
# ls /root/test_dir
вы должны были
# chmod 777 /root/test_dir # chmod 777 /root
ПРИМЕЧАНИЕ: это плохая идея из безопасности POV. вместо этого, может быть:
# mkdir /public # chmod 744 /public # mv /root/testdir /public
обратите внимание, что здесь 744 будет применяться к test_dir
// Как сказал Немоден, использование (обратный тик):
$cmd='ls /var/www/'; $variable_name=`$cmd`;
Если вы не хотите хранить значение, используйте команду passthru. команда exec и system будет показывать только одну строку (данные после разрыва строки прерываются)