организация коммандного канала (Apache+php)

Любые обсуждения, не нарушающие правил форума.

Модератор: Модераторы

организация коммандного канала (Apache+php)

Сообщение Sniper » 28.05.2007 16:49:47

т.е. Как организовать канал передачи между Apache и php?
например что б можно было выполнить такую команду "посылаю символ 'pp' скрипт это воспринимает как кманду и выполняет действие по копированию файла из одного места в другое" или "передать обратно файл который лежит в /tmp/ttt.txt"?

приветствуется всё что может мне помочь включая пример :D
Sniper
постоялец
 
Сообщения: 472
Зарегистрирован: 28.05.2005 13:02:42

Сообщение ev » 28.05.2007 18:51:54

ух... даже не знаю что сказать

куда посылаешь команду?
прям на порт пару байт или или еще как? (например GET или POST)

имхо стоит прочитать любое начало из книги PHP для начинающих
там как правило затрагиваются и вопросы связки с апачем
ev
долгожитель
 
Сообщения: 1772
Зарегистрирован: 27.04.2005 23:19:06
Откуда: Москва

Сообщение Replicator » 28.05.2007 19:18:33

Непонятно, что имеется ввиду под словом "канал".

например что б можно было выполнить такую команду "посылаю символ 'pp' скрипт это воспринимает как кманду и выполняет действие по копированию файла из одного места в другое" или "передать обратно файл который лежит в /tmp/ttt.txt"?

shell.php:
Код: Выделить всё
<form method="post" action="shell.php">
  <input type="text" name="cmd" value="" />

  <textarea name="prev"><?php

//лог предыдущих команд
if (isset($_POST['prev']) && !empty($_POST['prev'])) {
  echo htmlspecialchars($_POST['prev']);
}

//добавили текущую команду к логу
if (isset($_POST['cmd']) && !empty($_POST['cmd'])) {
  echo htmlspecialchars($_POST['cmd']), "\n";
}
  ?></textarea>
</form>

<?php

//выполняем команду
if (isset($_POST['cmd']) && !empty($_POST['cmd'])) {
  echo '<pre>', system($_POST['cmd']), '</pre>';
}
?>
Replicator
постоялец
 
Сообщения: 154
Зарегистрирован: 30.04.2006 17:14:45
Откуда: Outer Heaven

Сообщение Sniper » 29.05.2007 00:43:53

извините, конечно, но я новичок в PHP. канал, как я понимаю можно сделать при помощи сокетов или при помощи TCP/IP.
нужно чтобы какой-нить порт слушался постоянно и когда приходит команда её нужно выполнить...
Sniper
постоялец
 
Сообщения: 472
Зарегистрирован: 28.05.2005 13:02:42

Сообщение ev » 29.05.2007 02:24:06

сам пхп как правило не слушает порт - это просто интерпритатор
слушает порт апач и когда приходит запрос открыть страничку он (апач) читает страничку с диска и выдает в сеть
если для странички указаны обработчики, то страница сначала обрабатывается, и только потом отсылается
так примерно и работает пхп :) апач получает запрос и говорит пхп какой именно файл обработать
доступ к переменные возможен стандартными средствами PHP
ev
долгожитель
 
Сообщения: 1772
Зарегистрирован: 27.04.2005 23:19:06
Откуда: Москва

Сообщение Sniper » 29.05.2007 10:19:18

я могу послать апачу пользовательский запрос
чтобы он мне выдал какой-нить файл на диске...кроме PHP?
предполагаю что я спросил бред :oops:
Sniper
постоялец
 
Сообщения: 472
Зарегистрирован: 28.05.2005 13:02:42

Сообщение shade » 29.05.2007 11:07:44

Sniper писал(а):предполагаю что я спросил бред

Правильно предполагаете. Вам нужно почитать азы web-программирования.

Sniper писал(а):я могу послать апачу пользовательский запрос
чтобы он мне выдал какой-нить файл на диске...кроме PHP?

Можете. В конфигурационном файле апача прописываются какие файлы нужно передавать и как их обрабатывать.

Sniper писал(а):т.е. Как организовать канал передачи между Apache и php?

А зачем? для чего?
Если PHP установлен как модуль, то он может обратиться к апачи через API и заставить его выполнить какую-нибудь команду, например обработать и выдать файл, как для пользователя, например, чтобы из PHP получить текст страницы SSI (Server Side Includes) см. virtual. Но врядли это то, что вам нужно.

Если вам нужно выполнить какую-то команду на сервере, то это может сам PHP (но эти функции для безопасности могут быть отключены), см
http://ru2.php.net/manual/ru/ref.exec.php
http://ru2.php.net/manual/ru/function.passthru.php
http://ru2.php.net/manual/ru/function.system.php
еще команду можно заключить в обратные кавычки `cat ~/somefile`
Но если тебе нужно скопировать файл, то это нужно делать в самом PHP ( http://ru2.php.net/manual/ru/function.copy.php )
Если надо его прочесть и выдать пользователю, то см. readfile
...
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Сообщение Sniper » 29.05.2007 14:50:46

вот смотри: пользователь тыкает на кнопку в поле ввода прописан путь
выглядит это так
<form action = "lists.php" method="post">
<input type=text size="20" maxlength="200" value='.$path.'>
<input type="submit" value="Получить текущее состояние"></form>

path это путь до файла. его нужн забрать с другого компьютера.
кроме как через FTP это можно сделать?

ссылки кстати очень полезные
Sniper
постоялец
 
Сообщения: 472
Зарегистрирован: 28.05.2005 13:02:42

Сообщение Replicator » 29.05.2007 15:08:29

Через FTP, HTTP, ssh. Смотря что за "другой" комп. Если этот "другой" - HTTP сервер, то в PHP это делается через сокеты, либо просто fopen/file (если разрешено, конечно).
Replicator
постоялец
 
Сообщения: 154
Зарегистрирован: 30.04.2006 17:14:45
Откуда: Outer Heaven

Сообщение shade » 29.05.2007 15:47:26

Есть еще http://ru2.php.net/manual/ru/ref.curl.php чтобы не возиться с сокетами. Кстати, и FTP поддерживает ;)

fopen может открывать URL-ы как обычные файлы (естественно только для чтения), но эта функция может быть отключена..
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Сообщение Sniper » 29.05.2007 16:13:13

Replicator
>>Если этот "другой" - HTTP сервер, то в PHP это делается через сокеты
Покажи как? ;-)
Потому что по докам ничего не понятно.
Sniper
постоялец
 
Сообщения: 472
Зарегистрирован: 28.05.2005 13:02:42

Сообщение shade » 29.05.2007 17:45:21

Код: Выделить всё
<?php

require_once "urlutils.php";
Header('Content-type: text/plain');

$response = getURL('http://localhost/');

echo "code: {$response->code}\n";
echo "Headers: ";
print_r ($response->headers);
echo "Content:\n\n";
echo $response->content;

?>


Модуль urlutils.php использует CURL
Код: Выделить всё
<?php

/**

urlutils.php
 
class URLResponse - объект описывающий результат запроса
class curlWrapper - обертка для расширения curl
 
function getURL($url, $timeout) - Запросить страницу
function postURL($url, $data, $timeout) - Отправить POST запрос
function parse_url_ex($url) - разбор URL
function build_url($data) - собрать URL из частей
function make_query_str($args) - создать параметров
function normalizeURL($url) - нормализация URL
 
*/

/** Веремя ожидания по-умолчанию (в секундах) */
define('URLUTILS_DEFAULT_TIMEOUT', 20);

/** объект описывающий результат запроса */
class URLResponse
{
   var $code;
   var $headers;
   var $content;
   var $errno;
   var $error;
   
   function HTTPResponse()
   {
      $this->code = 0;
      $this->headers = array ();
      $this->content = "";
      $this->errno = 0;
      $this->error = false;
   }
}

/** обертка для расширения curl */
class curlWrapper
{
   /**
    * @access private
    */
   var $response;
   
   /**
    * @access private
    */
   function _writeHeader($ch, $header)
   {
      if ( strpos($header, ":") !== false )
      {
         list($name, $value) = explode(":", $header, 2);
         $this->response->headers[trim($name)] = trim($value);
      }
      return strlen($header);
   }
   
   /**
    * @access private
    */
   function _writeData($ch, $data)
   {
      $this->response->content .= $data;
      return strlen($data);
   }
   
   function getURL($url, $post, $timeout)
   {
      $this->response = new URLResponse;
      $ch = curl_init();
      curl_setopt($ch, CURLOPT_URL, $url);
      //curl_setopt($ch, CURLOPT_NOSIGNAL, true);
      curl_setopt($ch, CURLOPT_WRITEFUNCTION, array (&$this, "_writeData"));
      curl_setopt($ch, CURLOPT_HEADERFUNCTION, array (&$this, "_writeHeader"));
      curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
      curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
      
      if ( $post )
      {
         curl_setopt($ch, CURLOPT_POST, 1);
         curl_setopt($ch, CURLOPT_POSTFIELDS, make_query_str($post));
      }
      
      curl_exec($ch);
      $response = $this->response;
      $response->code = @ curl_getinfo($ch, CURLINFO_HTTP_CODE);
      if ( $response->errno = curl_errno($ch) ) $response->error = curl_error($ch);
      curl_close($ch);
      $this->response = null;
      return $response;
   }
}

class URL
{
   var $scheme = '';
   var $host = '';
   var $port = false;
   var $user = '';
   var $pass = '';
   var $path = '';
   var $args = array ();
   var $fragment = '';
   
   function toString()
   {
      $URL = ($this->scheme ? $this->scheme : 'http') . '://';
      if ( $this->user ) $URL .= $this->user . ':' . $this->pass . '@';
      $URL .= $this->host;
      if ( $this->port !== false ) $URL .= ':' . $this->port;
      $URL .= $this->path ? $this->path : '/';
      if ( count($this->args) > 0 ) $URL .= '?' . make_query_str($this->args);
      if ( $this->fragment ) $URL .= '#' . $this->fragment;
      return $URL;
   }
   
   function parse($URL)
   {
      if (strpos($URL, "://") === false) $URL = "http://" . $URL;
      $x = @ parse_url($URL);
      $this->scheme = $x['scheme'];
      if ( ! isset($x['host']) ) return false;
      $this->host = $x['host'];
      $this->port = isset($x['port']) ? intval($port) : '';
      $this->user = isset($x['user']) ? $x['user'] : '';
      $this->pass = isset($x['pass']) ? $x['pass'] : '';
      $this->path = isset($x['path']) ? $x['path'] : '/';
      $this->args = isset($x['query']) ? parse_str($x['query']) : array ();
      $this->fragment = isset($x['fragment']) ? $x['fragment'] : '';
      return true;
   }
}

function getURL($url, $timeout = URLUTILS_DEFAULT_TIMEOUT)
{
   $wrapper = new curlWrapper;
   return $wrapper->getURL($url, false, $timeout);
}

function postURL($url, $data, $timeout = URLUTILS_DEFAULT_TIMEOUT)
{
   $wrapper = new curlWrapper;
   return $wrapper->getURL($url, $data, $timeout);
}

function parse_url_ex($url)
{
   if (strpos($url, "://") === false) $url = "http://" . $url;
   $x = @ parse_url($url);
   if ( ! isset($x['path']) || $x['path'] == '' ) $x['path'] = '/';
   return $x;
}

function build_url($data)
{
   $url = isset($data['scheme']) ? $data['scheme'] : 'http';
   $url .= '://' . $data['host'];
   if ( isset($data['port']) ) $url .= ':' . $data['port'];
   $url .= isset($data['path']) ? $data['path'] : '/';
   if ( isset($data['query']) ) $url .= '?' . $data['query'];
   if ( isset($data['fragment']) ) $url .= '#' . $data['fragment'];
   return $url;
}

function make_query_str($args)
{
   $val = array();
   foreach ($args as $key => $value)
   {
      $val[] = urlencode($key) . '=' . urlencode($value);
   }
   return implode('&', $val);
}

function url_append_args($URL, $args)
{
   $pURL = parse_url_ex($URL);
   if ( isset($pURL['query']) ) parse_str($pURL, $args);
   $pURL['query'] = make_query_str($args);
   return build_url($pURL);
}

function normalizeURL($url)
{
   return build_url( parse_url_ex($url) );
}

?>
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/


Вернуться в Потрепаться

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 12

Рейтинг@Mail.ru