interacción proc_open

Esto es lo que estoy tratando de lograr: abrir un shell (korn o bash, no importa), desde ese shell, quiero abrir una conexión ssh (ssh user@host). En algún momento es probable que ocurra. Se me pedirá una contraseña o se me preguntará si estoy seguro de que quiero conectarme (claves ofensivas).

Antes de que alguien pregunte: sí, soy consciente de que hay un complemento para las llamadas ejecutables ssh2, pero los servidores en los que estoy trabajando no lo admiten y es poco probable que lo hagan.

Esto es lo que he intentado hasta ahora:

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

Entonces traté de leer la salida de la consola (stream_get_contents($pipes[1])) para ver lo que tengo que pasar a continuación (ya sea contraseña, sí o volver'connection failed: '.stream_get_contents($pipes[1]) y proc_close $ p.

Esto me dio el siguiente error:

El pseudo-terminal no se asignará porque stdin no es un terminal.

Así que, a pesar de que ssh fue llamado en elphp:// Contexto de flujo continuo, parece una explicación plausible del error anterior.

Siguiente: pensé enmi primera pregunta SO y decidió que podría ser una buena idea abrir primero una shell bash / ksh:

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

Y lo tomo desde allí, pero recibí exactamente el mismo mensaje de error, solo que esta vez, el script dejó de ejecutarse pero ssh se ejecutó. Así que tuve esperanzas, luego me sentí estúpido y, finalmente, desesperado:

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

Después de unos segundos de espera, recibí el siguiente error:

Error grave de PHP: Tamaño de memoria permitido de 134217728 bytes agotado (se intentó asignar 133693440 bytes)

La Pila de llamadas sigue mostrando la línea stream_get_contents, incluso en mi último intento desesperado:

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

Lo sé, es un desastre, un montón defflush y redundancia, pero el punto es: Sé que esta conexión primero me pedirá que ofenda las claves y luego pida una contraseña. Mi conjetura es que la transmisión en $ pipe [1] contiene la conexión ssh, por lo tanto, su contenido es enorme. Lo que necesito entonces, ¿es una tubería dentro de una tubería ... es esto posible? Debo estar perdiendo algo, ¿de qué sirve una tubería si esto no es posible ... Creo que el comando proc_open es incorrecto para empezar, (error: tubería rota). Pero realmente no puedo ver de otra manera alrededor del primer error ... ¿alguna idea? O haga preguntas de seguimiento si la queja anterior no es del todo clara (lo que probablemente no lo es).

Respuestas a la pregunta(1)

Su respuesta a la pregunta