Статьи

proc_open и pty’s

Что-то из моего почтового ящика (лучше всего читать снизу вверх), следуя CLI, часть 2, есть любители?

+++++++++++++++++++++++++

Сейчас я работаю сейчас с PHP
Версия 5.0.1

ВЕРСИЯ PHP
http://www.php.net/ChangeLog-5.php#5.0.1

Версия 5.0.0, кандидат на выпуск 2 * * 25 апреля 2004 г.

(…)

* Добавлена ​​поддержка pty для proc_open (). (Мы з)

РУКОВОДСТВО
http://www.php.net/manual/en/function.proc-open.php

В PHP 5RC2 появилась поддержка pty для систем с Unix98 ptys. Эта
позволяет вашему сценарию взаимодействовать с приложениями, которые ожидают
разговаривать с терминалом. Pty работает как труба, но является двунаправленным,
поэтому нет необходимости указывать режим чтения / записи. Пример ниже
показывает, как использовать pty; обратите внимание, что вам не нужно иметь все дескрипторы
разговаривать с pty. Также обратите внимание, что создается только один pty, хотя
pty указан 3 раза. В будущей версии PHP это может быть
можно сделать больше, чем просто читать и писать в pty.
(…)
Номера дескрипторов файлов в descriptorspec не ограничиваются 0, 1
и 2 — вы можете указать любой допустимый номер дескриптора файла, и он будет
перешел на дочерний процесс. Это позволяет вашему сценарию взаимодействовать
с другими сценариями, которые выполняются как «совместные процессы». * В частности, это
полезно для передачи парольных фраз в такие программы, как PGP, GPG и openssl в
более безопасный способ *. Это также полезно для чтения информации о состоянии
предоставленные этими программами на дескрипторах вспомогательных файлов.

Правильно? Вот мой сценарий …


echo "this is a testr";

// Create a pseudo terminal for the child process
$descriptorspec = array(
0 => array("pty"),
1 => array("pty"),
2 => array("pty")
);
$process = proc_open("/usr/bin/passwd", $descriptorspec, $pipes);
if (is_resource($process)) {
fwrite($pipes[0], "mypasswd");
fclose($pipes[0]);

while (! feof ($ pipe [1])) {
echo fgets ($ pipe [1], 1024);
}
fclose ($ труб [1]);
// Важно, чтобы вы закрыли все каналы перед вызовом
// proc_close, чтобы избежать тупика
$ return_value = proc_close ($ process);

echo «команда вернула $ return_valuen»;
}
?>

НО … когда я запустил программу:


username:~/Sites/Grid david$ php pty.php
this is a test
Warning: proc_open(): pty is not a valid descriptor spec/mode in
/Users/david/Sites/Grid/pty.php on line 10

ЛИНИЯ 10
$ process = proc_open («/ usr / bin / passwd», $ descriptorspec, $ pipe);

Не могли бы вы мне помочь, пожалуйста?

> Привет, Дэвид,

>

> Не уверен, что это вопрос новичка;) Это не тот вопрос, который я пробовал, но PHP

> 5+ следует

> (теоретически) разрешить это с помощью функции proc_open, описанной в

> второй PHP

> Статья CLI. В руководстве есть несколько заметок
( http://www.php.net/proc_open ).

> Вам нужен дескриптор spec что-то вроде;

>

> $ descriptorspec = array (

> 0 => массив («pty»),

> 1 => массив («pty»),

> 2 => массив («pty»)

>);

>

> Было бы интересно услышать, как вы поживаете.

>

>> ———————————————————–

>> От: «Дэвид»

>> Сообщение: это вопрос новичка, может быть, мне нужен большой RTFM. Это

>> Очень интересные и полезные две ваши статьи «PHP на команде»

>> Линия ».

>>

>> У меня есть большие сомнения … Мы работаем с PHP 4.3.3, я должен

>> написать скрипт PHP для изменения пароля пользователя unix.

>>

>> Нечто подобное

>> http://www.faqs.org/faqs/unix-faq/faq/part3/section-9.html

>>

>> Можно ли это сделать с помощью PHP? Спасибо

>> заранее.