взаимодействие proc_open

Вот что я пытаюсь достичь: открыть оболочку (korn или bash, это не имеет значения), из этой оболочки я хочу открыть ssh-соединение (ssh user@host). В какой-то момент может случиться так, что мне будет предложено ввести пароль, или меня спросят, уверен ли я, что хочу подключиться (неправильные ключи).

Прежде чем кто-либо спросит: да, я знаю, что есть плагин для вызовов ssh2 exec, но серверы, над которыми я работаю, не поддерживают его и вряд ли будут это делать.

Вот что я пробовал до сих пор:

<code>$desc = array(array('pipe','r'),array('pipe','w'));//used in all example code
$p = proc_open('ssh user@host',$desc,$pipes);
if(!is_resource($p)){ die('@!#$%');}//will omit this line from now on
sleep(1);//omitting this,too but it's there every time I need it
</code>

Затем я попытался прочитать вывод консоли (stream_get_contents($pipes[1])) чтобы увидеть, что я должен пройти дальше (либо пароль, да, либо возврат)'connection failed: '.stream_get_contents($pipes[1]) и proc_close $ p.

Это дало мне следующую ошибку:

Pseudo-terminal will not be allocated because stdin is not a terminal.

Итак, я, хотя SSH был вызван вphp:// io-stream context, кажется правдоподобным объяснением вышеуказанной ошибки.

Далее: я думал омой первый ТАК вопрос и решил, что было бы неплохо сначала открыть оболочку bash / ksh:

<code>$p = proc_open('bash',$desc,$pipes);
</code>

И возьмите его оттуда, но я получил точно такое же сообщение об ошибке, только на этот раз скрипт прекратил работать, но ssh запустился. Так что я обнадежился, затем почувствовал себя глупо и, в конце концов, отчаялся:

<code>$p=proc_open('bash && ssh user@host',$desc,$pipes);
</code>

После нескольких секунд ожидания я получил следующую ошибку:

PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 133693440 bytes)

Стек вызовов продолжает вызывать строку stream_get_contents, даже в моей последней отчаянной попытке:

<code>#!/path/to/bin/php -n
<?php
    $p = proc_open('bash && ssh user@host',array(array('pipe','r'),array('pipe','w')),$ps);
    if (!is_resource($p))
    {
        die('FFS');
    }
    usleep(10);
    fwrite($ps[0],'yes'."\n");
    fflush($ps[0]);
    usleep(20);
    fwrite($ps[0],'password'."\n");
    fflush($ps[0]);
    usleep(20);
    fwrite($ps[0],'whoami'."\n");
    fflush($ps[0]);
    usleep(2);
    $msg = stream_get_contents($ps[1]);
    fwrite($ps[0],'exit'."\n");
    fclose($ps[0]);
    fclose($ps[1]);
    proc_close($p);
?>
</code>

Я знаю, это беспорядок, многоfflush и избыточность, но суть в том, что я знаю, что это соединение сначала запросит у меня поврежденные ключи, а затем спросит пароль. Я предполагаю, что поток в $ pipe [1] содержит ssh-соединение, поэтому его содержание огромно. тогда что мне нужно, это труба внутри трубы ... это вообще возможно? Должно быть, я что-то упустил, что хорошего в трубе, если это невозможно ... Я предполагаю, что команда proc_open неверна с самого начала (ошибка: сломанная труба). Но я действительно не вижу другого способа обойти первую ошибку ... есть мысли? Или ответьте на вопросы, если вышеупомянутые слова не совсем понятны (что, вероятно, не так).

Ответы на вопрос(1)

Ваш ответ на вопрос