Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   Как заставить работать proc_open () (http://forum.oszone.net/showthread.php?t=72867)

Igor_I 13-10-2006 23:18 497422

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

$descriptorspec = array(     
=> array("pty"),     
=> array("pty"),       
=> 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 14-10-2006 09:38 497525

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

Igor_I 14-10-2006 11:16 497554

PHP код:

// Crée un pseudo terminal pour le processus fils  
$descriptorspec = array(     
=> array("pty"),     
=> array("pty"),     
=> 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 14-10-2006 12:39 497573

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

vadimiron 14-10-2006 22:02 497835

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

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

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

VeshchiyOleg 14-10-2006 22:24 497842

а в строке подключения к cvs пароль написан или это все, что есть???
и у юзера anoncvs доступ есть (даже с пустым паролем)?

Igor_I 14-10-2006 23:56 497869

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

$status_man system ("whoami"$outputexec);

  echo 
'<hr>$process 1';
$descriptorspec = array(
   
=> array("pty"),  // stdin is a pipe that the child will read from
   
=> array("pty"),  // stdout is a pipe that the child will write to
   
=> 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 
'<hr>$process 2';
$descriptorspec2 = array(
   
=> array("pty""r"),  // stdin is a pipe that the child will read from
   
=> array("pty""w"),  // stdout is a pipe that the child will write to
   
=> 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 
'<hr>$process 3';
$descriptorspec3 = array(
   
=> array("pipe""r"),  // stdin is a pipe that the child will read from
   
=> array("pipe""w"),  // stdout is a pipe that the child will write to
   
=> 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 16-10-2006 00:52 498287

Цитата:

Если сделать su dokuwiki и попытатся залогинится, то все нормально
и все-таки мне кажется, что проблема не в proc_open(), а в полномочиях

Igor_I 29-10-2006 16:42 504063

Докумекал :)

PHP код:

echo '<hr>Кто я - ';
 
$status_man system ("id"$outputexec);
 echo 
'<hr>Где я - ';
 
$status_man system ("pwd"$outputexec);
 echo 
'<hr>Содержимое файла тест - ';
 
$status_man system ("cat /home/dokuwiki/test"$outputexec);
 echo 
'<hr>Пишем строку в файл - ';
 
$status_man system ("echo '2 stroka' >> /home/dokuwiki/test"$outputexec);
 echo 
'<hr>Содержимое файла тест - ';
 
$status_man system ("cat /home/dokuwiki/test"$outputexec);
 echo 
'<hr>Содержимое файла .cvspass - ';
 
$status_man system ("cat //.cvspass"$outputexec);

  echo 
'<hr>env';
 
system ("env");
  echo 
'<hr>set';
 
system ("set");

$descriptorspec3 = array(
   
=> array("pipe""r"),  // stdin is a pipe that the child will read from
   
=> array("pipe""w"),  // stdout is a pipe that the child will write to
   
=> 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 не читаются.


Время: 19:36.

Время: 19:36.
© OSzone.net 2001-