interação proc_open

Aqui está o que eu estou tentando alcançar: abrir um shell (korn ou bash, não importa), a partir desse shell, eu quero abrir uma conexão ssh (ssh user@host). Em algum momento, é provável que isso aconteça. Eu serei solicitado a fornecer uma senha ou ser-lhe-á perguntado se estou certo de que quero me conectar (chaves incorretas).

Antes que alguém pergunte: sim, estou ciente de que existe um plugin para chamadas exec do ssh2, mas os servidores em que estou trabalhando não o suportam, e é improvável que o façam.

Aqui está o que eu tentei até agora:

<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>

Então eu tentei ler a saída do console (stream_get_contents($pipes[1])) para ver o que tenho que passar (senha, sim ou retorno'connection failed: '.stream_get_contents($pipes[1]) e proc_close $ p.

Isso me deu o seguinte erro:

O pseudo-terminal não será alocado porque stdin não é um terminal.

Então, eu acho que o ssh foi chamado nophp:// contexto do io-stream, parece uma explicação plausível do erro acima.

Next: Eu penseiminha primeira pergunta e decidiu que seria uma boa idéia abrir um shell bash / ksh primeiro:

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

E pegue a partir daí, mas eu recebi exatamente a mesma mensagem de erro, só que desta vez, o script parou de funcionar mas o ssh correu. Então eu fiquei esperançoso, então me senti estúpido e, eventualmente, desesperado:

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

Após alguns segundos, recebi o seguinte erro:

PHP Erro fatal: tamanho de memória permitido de 134217728 bytes esgotados (tentou alocar 133693440 bytes)

A Pilha de Chamadas continua trazendo a linha stream_get_contents, mesmo na minha última tentativa desesperada:

<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>

Eu sei, é uma bagunça, muitafflush e redundância, mas o ponto é: eu sei que essa conexão primeiro me pedirá as chaves ofensivas e, em seguida, peço uma senha. Meu palpite é que o fluxo em $ pipes [1] contém a conexão ssh, por isso o conteúdo é enorme. o que eu preciso então, é um cano dentro de um cano ... isso é possível? Eu devo estar faltando alguma coisa, que bom é um pipe se isso não for possível ... Meu palpite é que o comando proc_open está errado para começar, (error: Broken pipe). Mas eu realmente não consigo ver outra maneira de contornar o primeiro erro ... algum pensamento? Ou faça perguntas se o discurso acima não estiver claro (o que provavelmente não é).

questionAnswers(1)

yourAnswerToTheQuestion