Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Не могу запустить exe через php на windows server 2008 r2.
Форумы портала PHP.SU » » Операционная система и системные вызовы » Не могу запустить exe через php на windows server 2008 r2.

Страниц (1): [1]
 

1. gadalov - 12 Июня, 2013 - 16:29:07 - перейти к сообщению
Здравствуйте. Прошу помощи от Вас. Стоит Windows Server 2008 R2, php, mysql, IIS веб-сервер. Пытаюсь через php документ запустить файл exe, но увы ничего не происходит (должен создаться файл output.txt). У меня есть обработчик на php, который отправляет файл на сервер (в моём случаи exe), и выполняет его. Как выше сказано результата нет. Я изначально закачал файл exe на сервер и указал его путь в php документе. Файл закачивается моментально, но тот exe, который я указал не выполняется. Общий доступ к папке с exe-шником есть. Вот код этого обработчика:

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. if(isset($_POST['upload'])){
  3.    
  4.     $whitelist = array(".exe",".bat");        
  5.     $data = array();
  6.     $error = true;
  7.    
  8.  
  9.     foreach  ($whitelist as  $item) {
  10.         if(preg_match("/$item\$/i",$_FILES['userfile']['name'])) $error = false;
  11.     }
  12.  
  13.     if(!$error) {
  14.                  
  15.         $folder =  'upload/prog/';    //директория в которую будет загружен файл
  16.        
  17.         $uploadedFile =  $folder.basename($_FILES['userfile']['name']);
  18.                
  19.         if(is_uploaded_file($_FILES['userfile']['tmp_name'])){
  20.        
  21.             if(move_uploaded_file($_FILES['userfile']['tmp_name'],$uploadedFile)){
  22.        
  23.                 $data = $_FILES['userfile'];
  24.             }
  25.             else {    
  26.                 $data['errors'] = "Во время загрузки файла произошла ошибка.";
  27.             }
  28.         }
  29.         else {    
  30.             $data['errors'] = "Файл решения не загружен.";
  31.         }
  32.     }
  33.     else{
  34.        
  35.         $data['errors'] = 'Вы загружаете неправильный тип файла. Для проверки задачи необходим файл формата .exe';
  36.     }
  37.    
  38.    
  39.     $res = '<script type="text/javascript">';
  40.     $res .= "var data = new Object;";
  41.     foreach($data as $key => $value){
  42.         $res .= 'data.'.$key.' = "'.$value.'";';
  43.     }
  44.     $res .= 'window.parent.handleResponse(data);';
  45.     $res .= "</script>";
  46.    
  47.     echo $res;
  48.  
  49. }
  50. else{
  51.     die("ERROR");
  52. }
  53.  
  54. exec("upload/prog/program21.exe"); //запуск exe-шника  
  55.  
  56.  
  57. ?>
2. DelphinPRO - 12 Июня, 2013 - 17:07:09 - перейти к сообщению
gadalov пишет:
exec("upload/prog/program21.exe");

я так думаю нужно указывать полный путь, начиная с буквы диска
3. Мелкий - 12 Июня, 2013 - 17:11:50 - перейти к сообщению
gadalov пишет:
должен создаться файл output.txt

Где? Внимание, вопрос с подвохом.

PS: 39-45 строки - о json не слышали?
4. gadalov - 12 Июня, 2013 - 18:29:15 - перейти к сообщению
Мелкий пишет:
gadalov пишет:
должен создаться файл output.txt

Где? Внимание, вопрос с подвохом.

PS: 39-45 строки - о json не слышали?


Файл output.txt создаётся самим exe-шником, т.е. он выполняется и создаёт текстовый файл в папке где он и запускается. P.S. Паскаль, операции ввода-вывода.
5. Мелкий - 12 Июня, 2013 - 18:51:25 - перейти к сообщению
gadalov пишет:
в папке где он и запускается

Вы в этом уверены? Что этот бинарник нормально переопределяет рабочий каталог или корректно определяет своё местоположение в иерархии файловой системы?
6. gadalov - 12 Июня, 2013 - 19:03:36 - перейти к сообщению
Мелкий пишет:
gadalov пишет:
в папке где он и запускается

Вы в этом уверены? Что этот бинарник нормально переопределяет рабочий каталог или корректно определяет своё местоположение в иерархии файловой системы?


Ещё раз объясню, если вы запускаете этот exe-шник самостоятельно, то он создаёт текстовый файл без помощи обработчика. Я хочу добится того, чтобы этот обработчик запускал exe-шник с нажатия кнопки (использую форму на HTML). См. код обработчика выше.
7. Мелкий - 12 Июня, 2013 - 19:09:04 - перейти к сообщению
Ещё раз спрошу:
Этот бинарник переопределяет рабочий каталог? Или же этот бинарник определяет собственное местоположение и пишет файл с учётом оного? Или тупым относительным адресом, закономерно оказываясь черти где, будучи вызванным черти откуда же?

CODE (cmd):
скопировать код в буфер обмена
  1. cd "директория, где расположен ваш скрипт" # скрипт, а не бинарник!
  2. ./upload/prog/program21.exe

Что будет?
8. gadalov - 12 Июня, 2013 - 19:11:52 - перейти к сообщению
Мелкий пишет:
Ещё раз спрошу:
Этот бинарник переопределяет рабочий каталог? Или же этот бинарник определяет собственное местоположение и пишет файл с учётом оного? Или тупым относительным адресом, закономерно оказываясь черти где, будучи вызванным черти откуда же?

CODE (cmd):
скопировать код в буфер обмена
  1. cd "директория, где расположен ваш скрипт" # скрипт, а не бинарник!
  2. ./upload/prog/program21.exe

Что будет?


А можно на более понятном языке? Радость Я просто Вас не понимаю.

Вот код HTML, который вызывает скрипт.

CODE (html):
скопировать код в буфер обмена
  1. <form action="upload.php" method="post" target="hiddenframe" enctype="multipart/form-data" onsubmit="hideBtn();"> <input type="file" id="userfile" name="userfile" /> <input type="submit" name="upload" id="upload" value=" Загрузить решение.. " /> </form>
  2. <p> </p>
  3. <div id="res"></div>
  4. <p><iframe id="hiddenframe" name="hiddenframe" style="width: 0px; height: 0px; border: 0px;"></iframe></p>
9. DelphinPRO - 12 Июня, 2013 - 19:55:52 - перейти к сообщению
gadalov пишет:
если вы запускаете этот exe-шник самостоятельно, то он создаёт текстовый файл
когда вы запускаете файл самостоятельно, он получает текущий каталог тот из которого его запустили. Если запустить файл скриптом из другого каталога, он получит в качестве текущего именно тот другой каталог. и если программа на паскале написана без определения каталога своего расположения, то она создаст файл в том самом текущем каталоге, из которого была запущена.
т.е. более коректно будет в скрипте сначала установить текущим каталогом тот, в котором лежит экзешник, а потом его запускать.

PHP:
скопировать код в буфер обмена
  1. chdir('каталог-с-экзешником');
  2. exec('каталог-с-экзешником\экзешник.exe');

На случай, если программа на паскале написана не совсем корректно с точки зрения определения своего каталога.
10. gadalov - 12 Июня, 2013 - 22:45:50 - перейти к сообщению
DelphinPRO пишет:
gadalov пишет:
если вы запускаете этот exe-шник самостоятельно, то он создаёт текстовый файл
когда вы запускаете файл самостоятельно, он получает текущий каталог тот из которого его запустили. Если запустить файл скриптом из другого каталога, он получит в качестве текущего именно тот другой каталог. и если программа на паскале написана без определения каталога своего расположения, то она создаст файл в том самом текущем каталоге, из которого была запущена.
т.е. более коректно будет в скрипте сначала установить текущим каталогом тот, в котором лежит экзешник, а потом его запускать.

PHP:
скопировать код в буфер обмена
  1. chdir('каталог-с-экзешником');
  2. exec('каталог-с-экзешником\экзешник.exe');

На случай, если программа на паскале написана не совсем корректно с точки зрения определения своего каталога.


Эхх... Всё равно, без результата.. Вот как указал:

PHP:
скопировать код в буфер обмена
  1.  
  2. chdir('http://localhost/mod/page/upload/prog/');
  3. exec('http://localhost/mod/page/upload/prog/program21.exe');
  4.  
11. DelphinPRO - 12 Июня, 2013 - 22:59:04 - перейти к сообщению
яя выше по-моему ясно написал - полный путь, начиная с буквы диска
путь в файловой системе! а не URL

т.е. примерно так
C:\server\localhost\mod\page\upload\prog\
выделенная часть - это физическая папка на компьютере, где у вас располагаются файлы сайта.
12. gadalov - 13 Июня, 2013 - 08:33:04 - перейти к сообщению
DelphinPRO пишет:
яя выше по-моему ясно написал - полный путь, начиная с буквы диска
путь в файловой системе! а не URL

т.е. примерно так
C:\server\localhost\mod\page\upload\prog\
выделенная часть - это физическая папка на компьютере, где у вас располагаются файлы сайта.


Сделал всё как Вы сказали, в общем результата опять нет, и перестал работать тот скрипт, который загружал файл на сервер из-за строчки


Вот как полностью получилось:

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.  
  4. if(isset($_POST['upload'])){
  5.    
  6.     $whitelist = array(".exe",".bat");        
  7.     $data = array();
  8.     $error = true;
  9.    
  10.  
  11.     foreach  ($whitelist as  $item) {
  12.         if(preg_match("/$item\$/i",$_FILES['userfile']['name'])) $error = false;
  13.     }
  14.  
  15.     if(!$error) {
  16.                  
  17.         $folder =  'upload/prog/';//директория в которую будет загружен файл
  18.        
  19.         $uploadedFile =  $folder.basename($_FILES['userfile']['name']);
  20.                
  21.         if(is_uploaded_file($_FILES['userfile']['tmp_name'])){
  22.        
  23.             if(move_uploaded_file($_FILES['userfile']['tmp_name'],$uploadedFile)){
  24.        
  25.                 $data = $_FILES['userfile'];
  26.             }
  27.             else {    
  28.                 $data['errors'] = "Во время загрузки файла произошла ошибка.";
  29.             }
  30.         }
  31.         else {    
  32.             $data['errors'] = "Файл решения не загружен.";
  33.         }
  34.     }
  35.     else{
  36.        
  37.         $data['errors'] = 'Вы загружаете неправильный тип файла. Для проверки задачи необходим файл формата .exe';
  38.     }
  39.    
  40.    
  41.     $res = '<script type="text/javascript">';
  42.     $res .= "var data = new Object;";
  43.     foreach($data as $key => $value){
  44.         $res .= 'data.'.$key.' = "'.$value.'";';
  45.     }
  46.     $res .= 'window.parent.handleResponse(data);';
  47.     $res .= "</script>";
  48.    
  49.     echo $res;
  50.  
  51. }
  52. else{
  53.     die("ERROR");
  54. }
  55.  
  56. chdir('E:\web\mod\page\upload\prog\');
  57. exec('E:\web\mod\page\upload\prog\program21.exe');
  58.  
  59.  
  60. ?>
  61.  


Что посоветуете?
13. DelphinPRO - 13 Июня, 2013 - 08:40:08 - перейти к сообщению
gadalov пишет:
Что посоветуете?
екли пакли, это просто ошибка синтаксиса... Улыбка Обратный слэш в строках - управляющий символ, его экранировать надо.

PHP:
скопировать код в буфер обмена
  1. chdir('E:\\web\\mod\\page\\upload\\prog\\');
  2. exec('E:\\web\\mod\\page\\upload\\prog\\program21.exe');
14. gadalov - 13 Июня, 2013 - 08:50:27 - перейти к сообщению
DelphinPRO пишет:
gadalov пишет:
Что посоветуете?
екли пакли, это просто ошибка синтаксиса... Улыбка Обратный слэш в строках - управляющий символ, его экранировать надо.

PHP:
скопировать код в буфер обмена
  1. chdir('E:\\web\\mod\\page\\upload\\prog\\');
  2. exec('E:\\web\\mod\\page\\upload\\prog\\program21.exe');


Как странноУлыбка Я написал как Вы, скрипт начал запускаться, а программа до сих пор нет..
(Добавление)
DelphinPRO пишет:
gadalov пишет:
Что посоветуете?
екли пакли, это просто ошибка синтаксиса... Улыбка Обратный слэш в строках - управляющий символ, его экранировать надо.

PHP:
скопировать код в буфер обмена
  1. chdir('E:\\web\\mod\\page\\upload\\prog\\');
  2. exec('E:\\web\\mod\\page\\upload\\prog\\program21.exe');


Я так думаю проблема в доступе..

 

Powered by ExBB FM 1.0 RC1