via PHP auf eine Shell zugreifen

pipes, mehrere befehle nacheinander

hi all

ich habe den code von oben übernommen und angepasst. nun sind mir aber noch einige sachen unklar.

PHP:
$ssh = '';
$err='';
          $descriptorspec = array(
          0 => array("pipe", "r"),
          1 => array("pipe", "w"),
          2 => array("file", "/error.txt", "a")
          );
 if (is_resource($ssh)==FALSE || $ssh==""){
                   $ssh = proc_open("ssh -l cod ".$serveradr."", $descriptorspec, $pipes);
                   echo $ssh;
                   if (is_resource($ssh)){
                      //error('yes');
                      fwrite($pipes[0],'yes');
                      fclose($pipes[0]);
                      while(!feof($pipes[1])) {
                                $err .= fgets($pipes[1])."  ";
                      }
                      fclose($pipes[1]);
                      echo $err;
                      fwrite($pipes[0],'$passw');
                      fclose($pipes[0]);
                      while(!feof($pipes[1])) {
                                $err .= fgets($pipes[1])."  ";
                      }
                      fclose($pipes[1]);
                      echo $err."<br/>";

                     echo "Error-Pipes: ".$pipes.$pipes[0].$pipes[1]."<br/>";
                     //Fehler auslesen
                      echo "SSH Connection Successfull<br>";
                    }else{
                      echo "SSH Connection failed<br>";
                    }
           }


nun wo ich mir nicht sicher bin ist, wann ich die pipes schliessen muss. ich habe jetzt nach jeder übergabe an pipe[0], eine while und die beiden pipes geschlossen. wäre für mich am logisten so. aber irgendwie geht das nicht, die Seite bleibt weiss, bzw. er lädt endlos lang. ist das ein deadlock was ich da gemacht habe ?

also meine frage eigentlich: wie ist die stuktur wenn ich mehrere befehle nach einander übergeben muss ?

ich hoffe ich hab mich klar genug ausgedrückt!

mfg Bubblez
 
Zuletzt bearbeitet:
also 3 fehler...

1.) hast du die pipes für lesen und schreiben vertauscht....

ein "r" pipe kann man nicht schreiben, und ein "w" pipe kann man nicht lesen.. alles klar?

2.) ein geschlossenes pipe, ist geschlossen und bleibt es auch! wenn du einmal fclose() aufgerufen hast für das pipe, darfst du es später nciht mehr benutzen..

das pipe wird ganz am ende geschlossen, das sind die letzten komandos vor dem proc_close().

3.) einen prozess muss man am ende wieder schließen.
also einen proc_close() aufruf, direkt nach dem schließen der pipes.
 
shh verbindung bei erneutem laden noch aktiv ?

hi

ok danke für die schnelle hilfe!

wenn ich richtig verstanden habe sollte ich bei jedem dokumentaufruf die ssh connection von neuem herstellen ?
oder kann ich die auch einmal herstellen und dann nur auf verlangen die pipes schliessen und proc_close aufrufen ?, also das die ssh verbindung bestehen bleibt wenn ich die seite neu lade.

also etwa so mein ich:


if (is_resource($ssh)==FALSE || $ssh==""){
//SSH verbindung aufbauen
}

if ($_GET['end']){
fclose($pipes[0]);
fclose($pipes[1]);
proc_close($ssh);
}
//andere commands
 
Die verbindung bleit selbstverständlich bestehen

proc_open()
....
....
....
//alle zugriffe auf pipes, abschließen mit fflush()
...
...
...
fclose()
fclose()
proc_close()


Naja dazwischen kannst du lesen und schreiben wie du willst, nur nach einem schreibvorgang solltest du fflush() für das pipe aufrufen, um sicherzustellen das die daten abgeschickt wurden.

Aber wenn du die seite neu lädst, kannst du die pipes nicht beibehalten, das es sich hier um nicht persistente aufrufe handelt!

das heißt jede seite am anfang erstellt die SSH verbindung und schließt sie am ende wieder...das geht leider nicht anders...
 
Zuletzt bearbeitet:
ok gut, nun begreif ich schon mehr, aber noch nicht alles ;).

nun es funktioniert aber leider noch nicht.

hier die URL:

http://www.webrama.de/maske/remote/serverstatus_short.org.php

bei
SSH: Resource id #7
kommt bei echo $ssh;

nun so siehts momentan aus:

$ssh = proc_open("ssh -l cod ".$serveradr."", $descriptorspec, $pipes);
echo "SSH: ".$ssh."<br>";
if (is_resource($ssh)){
fwrite($pipes[0],'$passw');
fflush($pipes[1]);
while(!feof($pipes[1])) {
$err .= fgets($pipes[1])." ";
}
echo "ERROR: ".$err;
}
es wird kein error zurückgegeben, dann kann ich annehmen das der login funktioniert hat oder nicht ?
oder ist der fehler bei SSH der beweis das der login nicht funktioniert ?
eigentlich sollte er doch gar nicht in die if schlaufe gehen weil ich ja den resource prüfe....

weiter unten im script hab ich:
zuerst die funktion error() (am anfang des dokuments):

function error($cmd){
global $pipes;
global $descriptorspec;

$pipes[0]='$cmd';
fflush($pipes[1]);
//Fehler auslesen
while(!feof($pipes[1])) {
$err .= fgets($pipes[1])." ";
}
return $err;
}
$input=error('find / -name config.inc.php');
echo "ERROR of input: ".$input."<br>";




noch was wenn jetzt ein befehl nid ausgeführt werden konnte oder falsche parameter hatte oder was auch immer, dann kann ich nach der fehlerbehanlung mit der while einfach den nächsten befehl schicken?

wenn ich echo fflush($pipes[0]); mache ist die ausgabe 1



ich hoffe meine fragen sind nicht zu umstädnlich...

bist jetzt ist das forum das einzige wo ich antwort zu meinem problem bekommen habe.
 
Das Hier:

PHP:
fwrite($pipes[0],'$passw');
fflush($pipes[1]);

Hab ich so NICHT gesagt..

Ich sagte 1.) Das es NIX bringt auf einen ReadOnly handle zu SCHREIBEN...
und 2.) sagte ich du sollst das selbe pipe flushen in das du geschrieben hast, und nicht das andere.

ich sagte:

PHP:
fwrite($pipes[1],'$passw');
fflush($pipes[1]);

Alles andere bringt sichs net wirklich oder?

Außerdem sagte ich
3.) Das es NIX bringt von einem WriteOnly handle zu LESEN.
 
Hallo!
Könntet ihr das ganze nochmal zusammenfassen
also den Code so wie er im moment aussieht ?
MFG

Peter Hansen

PS: Ich brauch auch so einen SSH connect für ein script :)
 
Weil ihr zu faul seid, euch die Beiträge und eventuell ein paar man-pages durchzulesen, sollen Andere für euch das ganze nochmal Idiotensicher abtippen?
Finde ich ziemlich dreist ..

Im Übrigen gilt auch hier, man sollte nichts tun wovon man keine Ahnung hat, sonst öffnet man Sicherheitslücken wie Schneunentore.
 
Andere Lösung

Hallo,
Da ich mit den ganzen Pipes sowieso nicht Klarkomme ahbe ich mir eine andere lösung einfallen lassen :)
Also:
man öffne auf dem Webserver einen screen in dem man eine ssh verbindung zu einem anderen server aufbaut ... dann muss man nurnoch mir proc_open oder dem backtick operator den screen joinen, die commands ausführen und wieder schließen ... was haltet ihr davon ? Das einzige was ich noch nicht gelöst habe ist, das beim backtick operator kein terminal geöffnet werden kann ... auf einen tip von rythms werde ich nun proc_open ausprobiern :)

MFG

Peter Hansen

PS: Schreibt doch einmal eure meinung zu meiner idee ....
PPS: Postet eure scripte :)
 

Neue Beiträge

Zurück