Как заставить работать proc_open ()

Ответить
Аватара пользователя
Igor_I

Как заставить работать proc_open ()

Сообщение Igor_I »

Есть код



PHP код:

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

$descriptorspec = array(     

0 => array("pty"),     

1 => array("pty"),       

2 => array("pty") 

);  

$process = proc_open("cvs -d :pserver:anoncvs@anoncvs.at.FreeBSD.org:/home/ncvs login", $descriptorspec, $pipes);  

if (is_resource($process)) {    

sleep(1);    

fwrite($pipes[0], "anoncvs");     

sleep(1);       

fwrite($pipes[0], "cvs status");    

sleep(1);     

} 






Запуск которого приводит к ошибке - Warning: proc_open() [function.proc-open]: failed to open /dev/ptmx, errno 2

Собственно вопрос на стыке взаимодействия php и Freebsd, не совсем еще разобрался с терминалами.

Сходный вопрос по терминалам в другой ветке форума.
Аватара пользователя
Prisoner

Re: Как заставить работать proc_open ()

Сообщение Prisoner »

Первое, что бросилось в глаза это отличие Ваше $descriptorspec от "мануального", где указаны режимы открытия.
Аватара пользователя
Igor_I

Re: Как заставить работать proc_open ()

Сообщение Igor_I »

PHP код:

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

// Crée un pseudo terminal pour le processus fils  

$descriptorspec = array(     

0 => array("pty"),     

1 => array("pty"),     

2 => array("pty")  );  

$process = proc_open("cvs -d:pserver:cvsread@cvs.php.net:/repository login", $descriptorspec, $pipes);  

if (is_resource($process)) {     

// Travaille sur la documentation PHP ici  

} 






Не вижу отличий, тыкните пожалуйста - где.
Аватара пользователя
Prisoner

Re: Как заставить работать proc_open ()

Сообщение Prisoner »

Вот
тут
можно глянуть, "Пример 1. A proc_open() example".
Аватара пользователя
vadimiron

Re: Как заставить работать proc_open ()

Сообщение vadimiron »

Igor_I

попробуй всё таки точно для каждого дескриптора указать, в какую сторону он открываеться (чтение - запись)



Сама функция работает без проблем у меня (правда Винда-сервер)



Prisoner

как раз оттуда был взят пример, только чуть ниже Изображение)
Аватара пользователя
VeshchiyOleg

Re: Как заставить работать proc_open ()

Сообщение VeshchiyOleg »

а в строке подключения к cvs пароль написан или это все, что есть???

и у юзера anoncvs доступ есть (даже с пустым паролем)?
Аватара пользователя
Igor_I

Re: Как заставить работать proc_open ()

Сообщение Igor_I »

В том-то и дело, что винда-сервер. На FreeBSD не все работает.

3 варианта



PHP код:

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

$status_man = system ("whoami", $outputexec);



  echo '$process 1';

$descriptorspec = array(

   0 => array("pty"),  // stdin is a pipe that the child will read from

   1 => array("pty"),  // stdout is a pipe that the child will write to

   2 => array("file", "/var/tmp/error-output.txt", "a") // stderr is a file to write to

);

$process = proc_open("cvs -d :pserver:anoncvs@anoncvs.at.FreeBSD.org:/home/ncvs login", $descriptorspec, $pipes);

if (is_resource($process)) {

  sleep(5);

  fwrite($pipes[0], "anoncvs");

  sleep(5);

  fwrite($pipes[0], "cvs status");

  sleep(1);

}



   echo '$process 2';

$descriptorspec2 = array(

   0 => array("pty", "r"),  // stdin is a pipe that the child will read from

   1 => array("pty", "w"),  // stdout is a pipe that the child will write to

   2 => array("file", "/var/tmp/error-output.txt", "a") // stderr is a file to write to

);

$process2 = proc_open("cvs -d :pserver:anoncvs@anoncvs.at.FreeBSD.org:/home/ncvs login", $descriptorspec2, $pipes2);

if (is_resource($process2)) {

  sleep(5);

  fwrite($pipes2[0], "anoncvs");

  sleep(5);

  fwrite($pipes2[0], "cvs status");

  sleep(1);

}



   echo '$process 3';

$descriptorspec3 = 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("file", "/var/tmp/error-output.txt", "a") // stderr is a file to write to

);



$process3 = proc_open("cvs -d :pserver:anoncvs@anoncvs.at.FreeBSD.org:/home/ncvs login", $descriptorspec3, $pipes3);

if (is_resource($process3)) {

  sleep(5);

  fwrite($pipes3[0], "anoncvs");

  sleep(5);

  fwrite($pipes3[0], "cvs status");

  sleep(1);

} 






Что возвращает сервер- lighttpd, запущен от имени пользователя dokuwiki, группа его же. PHP5 как FastCGI.


Цитата:



dokuwiki dokuwiki

--------------------------------------------------------------------------------

$process 1

Warning: proc_open() [function.proc-open]: failed to open /dev/ptmx, errno 2 in /home/dokuwiki/test.php on line 52



--------------------------------------------------------------------------------

$process 2

Warning: proc_open() [function.proc-open]: failed to open /dev/ptmx, errno 2 in /home/dokuwiki/test.php on line 68



--------------------------------------------------------------------------------

$process 3



лог-файл


Цитата:



CVS password:

cvs login: warning: failed to open //.cvspass for reading: No such file or directory

cvs [login aborted]: could not open //.cvspass for writing: Permission denied



Все три строчки от третьего варианта.

Если убрать сервер, то пишется, что не установлен CVSROOT, хотя в .profile он прописан (шелл - sh).

Если сделать su dokuwiki и попытатся залогинится, то все нормально.

Под FreeBSD год назад был патч

http://www.mail-archive.com/internal.../msg14854.html


Сейчас он не работает. Вернее сам файл proc_open.c изменился, что при make patch - либо ошибка в патче, либо он просто игнорируется.
Аватара пользователя
VeshchiyOleg

Re: Как заставить работать proc_open ()

Сообщение VeshchiyOleg »

Цитата:



Если сделать su dokuwiki и попытатся залогинится, то все нормально



и все-таки мне кажется, что проблема не в proc_open(), а в полномочиях
Аватара пользователя
Igor_I

Re: Как заставить работать proc_open ()

Сообщение Igor_I »

Докумекал Изображение





PHP код:

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

echo 'Кто я - ';

 $status_man = system ("id", $outputexec);

 echo 'Где я - ';

 $status_man = system ("pwd", $outputexec);

 echo 'Содержимое файла тест - ';

 $status_man = system ("cat /home/dokuwiki/test", $outputexec);

 echo 'Пишем строку в файл - ';

 $status_man = system ("echo '2 stroka' >> /home/dokuwiki/test", $outputexec);

 echo 'Содержимое файла тест - ';

 $status_man = system ("cat /home/dokuwiki/test", $outputexec);

 echo 'Содержимое файла .cvspass - ';

 $status_man = system ("cat //.cvspass", $outputexec);



  echo 'env';

 system ("env");

  echo 'set';

 system ("set");



$descriptorspec3 = 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("file", "/var/tmp/error-output.txt", "a") // stderr is a file to write to

);

   $cwd = "/home/dokuwiki";

$process3 = proc_open("cvs -d :pserver:anoncvs@anoncvs.at.FreeBSD.org:/home/ncvs login", $descriptorspec3, $pipes3, $cwd);

if (is_resource($process3)) {

  sleep(5);

  fwrite($pipes3[0], "anoncvs");

  sleep(5);

  fwrite($pipes3[0], "cvs status");

  sleep(1);

} 







Цитата:



Кто я - uid=80(www) gid=80(www) groups=80(www)

--------------------------------------------------------------------------------

Где я - /home/dokuwiki

--------------------------------------------------------------------------------

Содержимое файла тест - 1 stroka

--------------------------------------------------------------------------------

Пишем строку в файл -

--------------------------------------------------------------------------------

Содержимое файла тест - 1 stroka2 stroka

--------------------------------------------------------------------------------

Содержимое файла .cvspass -

--------------------------------------------------------------------------------

env

HOME=/ PATH=/sbin:/bin:/usr/sbin:/usr/bin

--------------------------------------------------------------------------------

set

HOME=/ PS1='$ ' OPTIND=1 PS2='> ' PPID=595 PATH=/sbin:/bin:/usr/sbin:/usr/bin IFS=' '



Несмотря на то, что казалось бы PHP & lighthttpd запущены от пользователя dokuwiki, никакие переменные из ~/.chsrc не читаются.
Ответить

Вернуться в «Вебмастеру»