Показать полную графическую версию : Как заставить работать proc_open ()
Есть код
$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
14-10-2006, 09:38
Первое, что бросилось в глаза это отличие Ваше $descriptorspec от "мануального", где указаны режимы открытия.
// 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
14-10-2006, 12:39
Вот тут (http://ru2.php.net/manual/ru/function.proc-open.php) можно глянуть, "Пример 1. A proc_open() example".
vadimiron
14-10-2006, 22:02
Igor_I
попробуй всё таки точно для каждого дескриптора указать, в какую сторону он открываеться (чтение - запись)
Сама функция работает без проблем у меня (правда Винда-сервер)
Prisoner
как раз оттуда был взят пример, только чуть ниже :))
VeshchiyOleg
14-10-2006, 22:24
а в строке подключения к cvs пароль написан или это все, что есть???
и у юзера anoncvs доступ есть (даже с пустым паролем)?
В том-то и дело, что винда-сервер. На FreeBSD не все работает.
3 варианта
$status_man = system ("whoami", $outputexec);
echo '<hr>$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 '<hr>$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 '<hr>$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/internals@lists.php.net/msg14854.html
Сейчас он не работает. Вернее сам файл proc_open.c изменился, что при make patch - либо ошибка в патче, либо он просто игнорируется.
VeshchiyOleg
16-10-2006, 00:52
Если сделать su dokuwiki и попытатся залогинится, то все нормальнои все-таки мне кажется, что проблема не в proc_open(), а в полномочиях
Докумекал :)
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(
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 не читаются.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.