proc_open-Interaktion

Folgendes versuche ich zu erreichen: Öffne eine Shell (korn oder bash, spielt keine Rolle), von dieser Shell aus möchte ich eine ssh-Verbindung öffnen (ssh user@host). Irgendwann ist es wahrscheinlich, dass ich zur Eingabe eines Passworts aufgefordert werde oder gefragt werde, ob ich sicher bin, dass ich eine Verbindung herstellen möchte (beleidigende Schlüssel).

Bevor jemand fragt: Ja, ich bin mir bewusst, dass es ein Plugin für ssh2 exec-Aufrufe gibt, aber die Server, auf denen ich arbeite, unterstützen es nicht und das ist unwahrscheinlich.

Folgendes habe ich bisher versucht:

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

Dann habe ich versucht, die Konsolenausgabe zu lesen (stream_get_contents($pipes[1])) um zu sehen, was ich als nächstes weitergeben muss (entweder Passwort, ja oder zurück'connection failed: '.stream_get_contents($pipes[1]) und proc_close $ p.

Dies gab mir den folgenden Fehler:

Pseudo-Terminal wird nicht zugewiesen, da stdin kein Terminal ist.

Also, ich dachte, ssh wurde im Internet angerufenphp:// Der io-stream-Kontext scheint eine plausible Erklärung für den obigen Fehler zu sein.

Nächstes: Ich dachte darüber nachmeine erste SO Frage und entschieden, dass es eine gute Idee sein könnte, zuerst eine bash / ksh-Shell zu öffnen:

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

Und nehmen Sie es von dort, aber ich habe genau die gleiche Fehlermeldung bekommen, nur dieses Mal lief das Skript nicht mehr, aber ssh lief. Also wurde ich hoffnungsvoll, fühlte mich dann dumm und schließlich verzweifelt:

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

Nach ein paar Sekunden habe ich folgende Fehlermeldung erhalten:

Schwerwiegender PHP-Fehler: Zulässige Speichergröße von 134217728 Byte erschöpft (versucht, 133693440 Byte zuzuweisen)

Der Call Stack ruft die Zeile stream_get_contents auch in meinem letzten verzweifelten Versuch immer wieder auf:

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

Ich weiß, es ist ein Durcheinander, eine Mengefflush und Redundanz, aber der Punkt ist: Ich weiß, dass diese Verbindung mich zuerst zu beleidigenden Schlüsseln auffordert und dann nach einem Passwort fragt. Ich vermute, der Stream in $ pipes [1] enthält die ssh-Verbindung, daher ist der Inhalt riesig. was ich dann brauche, ist ein rohr in einem rohr ... ist das überhaupt möglich? Ich muss etwas vermissen, was nützt eine Pipe, wenn dies nicht möglich ist ... Ich vermute, der Befehl proc_open ist anfangs falsch (Fehler: Pipe defekt). Aber ich kann wirklich keinen anderen Weg um den ersten Fehler herum sehen ... irgendwelche Gedanken? Oder setzen Sie sich mit Fragen in Verbindung, wenn das oben Gesagte überhaupt nicht klar ist (was es wahrscheinlich nicht ist).

Antworten auf die Frage(1)

Ihre Antwort auf die Frage