взаимодействие 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 неверна с самого начала (ошибка: сломанная труба). Но я действительно не вижу другого способа обойти первую ошибку ... есть мысли? Или ответьте на вопросы, если вышеупомянутые слова не совсем понятны (что, вероятно, не так).