непонятки с exec system и т.д.

Тема в разделе "PHP", создана пользователем DangerD, 5 июл 2008.

Статус темы:
Закрыта.
Модераторы: latteo
  1. DangerD

    DangerD Постоялец

    Регистр.:
    2 июл 2007
    Сообщения:
    71
    Симпатии:
    13
    В общем взбрела в голову идея запустить ICQ Bot для уведомлений по аське. В общем запустил в скрине centericq.

    для отправки сообщения используется команда:
    echo "message text"|/usr/local/bin/centericq -p icq -s msg -t "номер аськи"'
    с консоли работает и отправляется.

    а вот с пхп трабла:
    PHP:
    echo exec('echo "message text"|/usr/local/bin/centericq -p icq -s msg -t "номер аськи"');
    ничего не возвращает и не выполняется

    PHP:
    echo system('echo "message text"|centericq -p icq -s msg -t "номер аськи"',$retval);
    echo 
    $retval;
    тут retval выводит: 127 и всё равно не работает


    PHP:
    $desc = array(
                  
    => array('pipe''r'),
                  
    => array('pipe''w'),
                 );

    $z proc_open('centericq -p icq -s msg -t "номер аськи"',$desc,$pipes);
    if (
    is_resource($z)) echo "GOOD!<br>";
        
    fwrite($pipes[0], 'echo "zzz"');
        
    //fflush($pipes[0]);
        
    echo fread($pipes[1],1024);
        
    fclose($pipes[0]);
        
    fclose($pipes[1]);
    echo 
    proc_close($z);
    в общем выводится та же ошибка 127

    в общем у кого есть идеи?
     
  2. Jeurey

    Jeurey

    Регистр.:
    13 сен 2006
    Сообщения:
    419
    Симпатии:
    576
    Линк на бинарник в студию. Вообще говоря, это не к php предъявы.
    По сути, $retval должен быть массивом -> echo к нему не канает.
     
  3. Miraage

    Miraage Angular/Laravel

    Регистр.:
    3 июн 2008
    Сообщения:
    230
    Симпатии:
    51
    команда exec ничего не возвращает, а всего лишь выполняет действие. т.е. echo exec(..) ничего не напечатает.используй return
     
  4. masto

    masto Прохожие

    1. exec - не команда, а функция.
    2. не пробовал man почитать, прежде чем бред писать?
     
  5. DangerD

    DangerD Постоялец

    Регистр.:
    2 июл 2007
    Сообщения:
    71
    Симпатии:
    13
    на какой бинарник?
     
  6. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    Для того, чтобы что-то выводилось, надо вместо exec()использовать passthru()

    Если бинарник и так ничего в консоль не выводит, а только ошибки - тогда делай exec('/bin....... 2>file.log') и выводи на экран потом этот file.log
     
  7. Xenos

    Xenos Создатель

    Регистр.:
    14 янв 2008
    Сообщения:
    14
    Симпатии:
    0
    а если включен safemode или exec, system, passthru выклчючены админом - то забить на идею или искать иной хостинг.

    ;)

    а обычно при сэйфе и возникают такие симптомы.
     
  8. DangerD

    DangerD Постоялец

    Регистр.:
    2 июл 2007
    Сообщения:
    71
    Симпатии:
    13
    echo passthru ('echo "message text"|centericq -p icq -s msg -t "12345678"',$out);
    echo " | ";
    print_r($out);

    это всё выводит:
    | 127
     
  9. DangerD

    DangerD Постоялец

    Регистр.:
    2 июл 2007
    Сообщения:
    71
    Симпатии:
    13
  10. BACZ

    BACZ

    Регистр.:
    18 июн 2008
    Сообщения:
    608
    Симпатии:
    381
    тогда сведения из phpinfo() в студию
    то что касается disable_functions, open_basedir и все что связано с safe_mode
    потому что 127 это то что выводят эти команды при safe mod on
    простейшие тестики погоняй типа
    Код:
    $cmd="ls -al";
    $result = "";
    if (is_callable("exec")) {exec($cmd,$result); $result = join("\n",$result); print "<pre>" ;print_r($result);print "</pre>\n";} else echo "no exec";
    
    пробуй всю кучу, exec, popen, passthru, system, shell_exec, proc_open
    Код:
    $result = "";
    $cmd="ls -al";
    if (($result = `$cmd`) !== FALSE) { echo "<pre>"; echo $result; echo "</pre>\n";}
    

    Код:
    $cmd="ls -al";
    $res="";
    if (is_callable("system")){
      @ob_start();
      @system($cmd);
       $res = @ob_get_contents();
       @ob_end_clean();
    echo "<pre>";echo $res;echo "</pre>\n";} else echo "system() is disabled";
    
    Код:
    $cmd="ls -al";
    $res="";
    if (is_callable("passthru")){
      @ob_start();
      @passthru($cmd);
       $res = @ob_get_contents();
       @ob_end_clean();
    echo "<pre>";echo $res;echo "</pre>\n";} else echo "passthru is disabled";
    
    Код:
    $cmd="ls -al";
    $result="";
    if (is_resource($fp = popen($cmd,"r")))
      {
       $result = "";
       while(!feof($fp)) {$result .= fread($fp,1024);}
       pclose($fp);
      }
    echo "<pre>"; echo $result; echo "</pre>\n";
    
    
    Код:
    $result= runExternal("ls -al",$code);
    
    print "<pre>";
    print $result;
    print "</pre>\n";
    
    print "<b>code: $code</b>\n";
    
    
     function runExternal($cmd,&$code) {
            $descriptorspec = array(
                0 => array("pipe", "r"),  // stdin is a pipe that the child will read from
                1 => array("pipe", "w"),  // stdout is a pipe that the child will write to
                2 => array("pipe", "w") // stderr is a file to write to
            );
           
            $pipes= array();
            $process = proc_open($cmd, $descriptorspec, $pipes);
           
            $output= "";
           
            if (!is_resource($process)) return false;
           
            #close child's input imidiately
            fclose($pipes[0]);
           
            stream_set_blocking($pipes[1],false);
            stream_set_blocking($pipes[2],false);
           
            $todo= array($pipes[1],$pipes[2]);
           
            while( true ) {
                $read= array();
                if( !feof($pipes[1]) ) $read[]= $pipes[1];
                if( !feof($pipes[2]) ) $read[]= $pipes[2];
               
                if (!$read) break;
               
                $ready= stream_select($read, $write=NULL, $ex= NULL, 2);
               
                if ($ready === false) {
                    break; #should never happen - something died
                }
               
                foreach ($read as $r) {
                    $s= fread($r,1024);
                    $output.= $s;
                }
            }
           
            fclose($pipes[1]);
            fclose($pipes[2]);
           
            $code= proc_close($process);
           
            return $output;
        }
    
    
     
Статус темы:
Закрыта.