Shaheen: Socket Verbindung unter LINUX

Hi,

ich habe unter SuSE über xinetd eine neue Socket-Verbindung auf einem bestimmten Port konfiguriert, die einfach ein Shell-Script aufruft, welcher etwas ausgibt, z. B. echo "gelungen".

Von einem andren Rechner aus mittels PHP (fsockopen, fgets) habe ich anschl. eine Verbindung zu diesem Rechner unter dem freigeschalteten Port geöffnet und auch wirklich "gelungen" zurückgeliefert bekommen.

Meine Frage ist, wie kann ich eigene Argumente über die Socket-Verbindung an den Shellscript senden, dort auswerten und entsprechend eine Antworte zurücksenden?

Schönen Dank im Voraus für jeden Vorschlag!

Gruß

Shaheen

  1. Hallo Shaheen,

    ich habe unter SuSE über xinetd eine neue Socket-Verbindung auf einem bestimmten Port konfiguriert, die einfach ein Shell-Script aufruft, welcher etwas ausgibt, z. B. echo "gelungen".

    Nein, du hast keine Socket-Verbindung konfiguriert, sonder das xinetd-Programm selber, welches sich um die Sockets kümmert. Dein Shellscript merkt davon gar nichts, stdin und stdout werden halt nur mal eben übers Iternet geschickt ;)

    Von einem andren Rechner aus mittels PHP (fsockopen, fgets) habe ich anschl. eine Verbindung zu diesem Rechner unter dem freigeschalteten Port geöffnet und auch wirklich "gelungen" zurückgeliefert bekommen.

    cool, ne? Das gleiche, nur etwas komplizierter habe ich vor einiger Zeit auch programmiert: Serverseite ein perl-PRogramm über xinetd, Clientseite ein PHP-Script. Können wunderbar nun miteinander kommunizieren (ich habe ein spezielles Protokoll dafür geschrieben).

    Meine Frage ist, wie kann ich eigene Argumente über die Socket-Verbindung an den Shellscript senden, dort auswerten und entsprechend eine Antworte zurücksenden?

    Hier mal ein (kleiner) Ausschnitt aus dem PHP-Programm:

    function GetOneLine($fh) {
             $data = fgets($fh, 230);
             if(strlen($data) == 0 || $data == "\n") {
                 print "(skipping blank line)\n";
                 return '100 {Blank Line}';
             }
             print "<b>&gt;</b> $data";
             return $data;
         }

    function SayLine($text, $encrypt=false) {
             #if(substr($text, 0, -1) != "\n") $text .= "\n"; // mit Leerzeile abschließen...
             global $nsock;
             $text = rtrim($text)."\n";
             print '<b>&lt;</b> '.($encrypt && !$GLOBAL['protodebug'] ? str_repeat('*', strlen($text))."\n" : $text);
             $r = fwrite($nsock, $text);
             return !$r ? die("<p><b>Fehler beim Schreiben ins Netzwerksocket!</b> (Text [$text] returned $r)</p>") : $r;
         }

    Die Idee bei Sockets ist ja, dass man Netzwerkverbindungen wie Filehandles behandelt. Also lassen sich die ganzen f*()-"Tools" verwenden :)

    Grüße,

    Sven

    --
    ich hatte mal meterlange signs, die sind alle weg
    1. Hallo Sven,

      schönen Dank dafür, clientseitig das Senden scheint zu klappen, kannst du mir auch zeigen, wie es serverseitig bei meinem offenen Socket im Shellscript das Auslesen der übermittelten Daten funzt. Ich komme leider nicht auf die richtige Idee.

      Schönen Dank!

      Gruß

      Shaheen

      1. Hallo Shaheen,

        schönen Dank dafür, clientseitig das Senden scheint zu klappen, kannst du mir auch zeigen, wie es serverseitig bei meinem offenen Socket im Shellscript das Auslesen der übermittelten Daten funzt. Ich komme leider nicht auf die richtige Idee.

        während das PHP-Script auf der Clientseite dank Verwendung von (C/PHP-)Sockets (anders geht es wohl auch nicht ;) die Ein/Ausgabe wie ein Dateihandle verwerten kann, geht es auf der Seite des Programmes, welches durch xinetd aufgerufen wurde, schlicht und einfach über den Standard Ein/Ausgabekanal (stdin und stdout). Das heißt also:

        PHP-Script schreibt Daten in  => Netzwerk => Xinetd => Daten kommen beim Programm im
           das Filehandle (= socket)                   (Server)   stdin an

        und andersrum:

        Programm schreibt ins    => Xinetd => Netzwerk  => PHP-Script kann Datenhandle
           stdout                                             belauschen

        Das ist ja der nette Vorteil von Xinetd: Man braucht sich beim Endprogramm überhauptnicht mehr um das Netzwerk kümmern - alles kommt über stdin und stdout an oder geht raus. Ein simples Shellscript also z.B.:

          
        #!/bin/sh  
          
        echo Hallo, ich bin das Shellscript. Wenn Xinetd so eingerichtet  
        echo wurde, dass er z.b. für dieses Programm an Port 9700 lauscht,  
        echo so kann man sich per Telnet daran verbinden und schwupps kriegt  
        echo man diesen Text hier.  
        echo  
        echo Gebe jetzt bitte mal etwas ein:  
          
        read EINGABE  
          
        echo Sie gaben $EINGABE ein. Sehr schön ;)  
        
        

        So einfach ist es :)

        Grüße,

        Sven

        --
        ich hatte mal meterlange signs, die sind alle weg
        1. sehr schön, das Empfangen klappt, jedoch kann ich per echo Befehl nicht zurücksenden über Shell-Script. Der PHP-Client empfängt nichts zurück. Wie kann ich den echo Befehl aufbauen?

          Danke!

          Gruß

          Shaheen