frankx: Ruby und Strato

Hellihello,

an Stratokenner die Frage: gemäß Anleitung habe ich mir dort via FTP (nicht Telnet) ein Verzeichnis cgi-bin angelegt, die Rechte auf 755 gesetzt und eine Datei per FTP im Ascii-Modus aufgespielt mit dem Inhalt:

#!usr/bin/ruby
BEGIN {
 puts "Hallo Welt!"
}

und auch hier die Rechte auf 755 gesetzt.

Immer nur bekomme ich den Internal Server Error 500. Egal ob die Datei test.rb oder test.cgi heißt. Wer weiß, was ich falsch mache?

Dank und Gruß,

frankx

  1. Hellihello,

    an Stratokenner die Frage: gemäß Anleitung habe ich mir dort via FTP (nicht Telnet) ein Verzeichnis cgi-bin angelegt, die Rechte auf 755 gesetzt und eine Datei per FTP im Ascii-Modus aufgespielt mit dem Inhalt:

    #!usr/bin/ruby
    BEGIN {
    puts "Hallo Welt!"
    }

    Vielleicht brauchst du zerst noch ein

    puts "Content-type: text/html\n\n";
    bzw.
    puts "Content-type: text/plain\n\n";

    ?
    fg,
    p

    1. Hellihello p,

      dank aber das hülft nischt. Ich hätte jetzt auch gedacht, dass bei der Ausgabe der Server ja bereits keinen Error mehr hätte, der kontolliert ja vermutlich nicht, ob ein Browser das kapieren könnte, oder tut er?

      Dank und Gruß,

      frankx

      1. Hi frankx,

        dank aber das hülft nischt. Ich hätte jetzt auch gedacht, dass bei der Ausgabe der Server ja bereits keinen Error mehr hätte, der kontolliert ja vermutlich nicht, ob ein Browser das kapieren könnte, oder tut er?

        Tut er in gewisser Weise schon - du musst dem Server mindestens den Statuscode und den Content-Type mitteilen, unter welchem er das Dokument ausliefern soll. Bei Programmiersprachen wie PHP wirst du nur insofern verwöhnt, als dass PHP für dich Standardwerte sendet, sofern du nicht selber etwas angibst.

        Desweiteren fehlte ein Slash am Beginn des Pfades - ist der Pfad an sich den korrekt? Hat dein Provider dir den so mitgeteilt?

        Wenn ja, dann probier einfach mal:

        puts "Status: 200 OK\r\n";  
        puts "Content-Type: text/plan\r\n";  
        puts "\r\n";  
        puts "Hallo Welt!";
        

        Ich höffe dass Ruby \r und \n durch die entsprechendne Zeilenumbrüche (CL und RF oder so) ersetzt - ich kenne mich mit Ruby nicht aus ;-)

        MfG, Dennis.

        --
        Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
        Patch zur Verwendung von PATHINFO in JLog
        Jeder kann wütend werden, das ist einfach. Aber wütend auf den Richtigen zu sein, im richtigen Maß, zur richtigen Zeit, zum richtigen Zweck und auf die richtige Art, das ist schwer. (Aristoteles)
        1. Hellihello Dennis,

          und ihr da oben. Dank, mit text/plan kommt die Frage zum Download, mit

            
          #!/usr/bin/ruby  
          BEGIN {  
          puts "Status: 200 OK\r\n";  
          puts "Content-Type: text/html\r\n";  
          puts "\r\n";  
          puts "Hallo Welt!";  
          }  
          
          

          schnuffelts dann. Wobei es auch ohne Statuszeile geht, nicht aber ohne den Slash vor "usr" und nicht ohne die Absatzzeile zwischen Contentype und Hallowelt.

          besten dank,

          frankx

          1. Hi frankx,

            Wobei es auch ohne Statuszeile geht, nicht aber ohne den Slash vor "usr" und nicht ohne die Absatzzeile zwischen Contentype und Hallowelt.

            Stimmt - Denkfehler meinerseits, fehlt die Statuszeile, so wird sie i.d.R. vom Webserver mit 200 OK (und richtigem Protokoll) ergänzt. Das es ohne den Slash vor usr nicht klappt ist klar, weil dann ist es einfach der falsche Pfad zum Ruby-Interpreter - du kannst ja bei einem Windowspfad auch nicht vorne  den Laufwerksbuchstaben weglassen ;-) (ich weiß, Vergleiche hinken *g*).

            Die Absatzzeile zwischen Headern (hier lediglich der Header Content-Type) und dem Inhalt (hier Hallo Welt) ist einfach notwendig, weil irgendwer mal für das HTTP-Protokoll festgelegt hat, dass Header und Inhalt durch eine Leerzeile voneinander getrennt sind ;-) Genauso ist festgelegt, dass die einzelnen Header mit \r\n beendet (bzw. voneinander getrennt) werden müssen und nicht lediglich nur mit \n [1].

            MfG, Dennis.

            [1] \r wie auch \n steht hierbei lediglich als Platzhalter für die „wirklichen” Zeilenumbrüche.

            --
            Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
            Patch zur Verwendung von PATHINFO in JLog
            Berater sind Leute die dir deine Uhr wegnehmen, damit sie dir anschließend sagen können wie spät das es ist! (Aus einem Kabarett)
            1. Hellihello Dennis,

              Die Absatzzeile zwischen Headern (hier lediglich der Header Content-Type) und dem Inhalt (hier Hallo Welt) ist einfach notwendig, weil irgendwer mal für das HTTP-Protokoll festgelegt hat, dass Header und Inhalt durch eine Leerzeile voneinander getrennt sind ;-)

              Wie kann ich mir die Interaktion mit einer CGI-Anwendung denn vorstellen? Der Server erkennt an der Dateiendung, welches Programm der  damit ansprechen möchte, bzw. um Interpretation bittet, und erwartet dann seinerseits eine Rückgabe, die dem HTT-Protokoll entspricht? Und wenn es den geforderten Konventionen wiederspricht, gibt es einen internen Serverfehler?

              Ich hatte ja wohl fälschlicherweise vermutet, dass der einfach unbesehen ausspuckt, was das Programm zurückgibt an Text und dann wäre es ja Browserproblem, damit umzugehen, wenn kein Content-Type vorhanden ist.

              \r wie auch \n steht hierbei lediglich als Platzhalter für die „wirklichen” Zeilenumbrüche.

              Und was ist ein wirklicher Zeilenumbruch, ein ASCII-Wert?
              dank
              frankx

              1. Hi frankx,

                Wie kann ich mir die Interaktion mit einer CGI-Anwendung denn vorstellen? Der Server erkennt an der Dateiendung, welches Programm der  damit ansprechen möchte, bzw. um Interpretation bittet, und erwartet dann seinerseits eine Rückgabe, die dem HTT-Protokoll entspricht? Und wenn es den geforderten Konventionen wiederspricht, gibt es einen internen Serverfehler?

                Hm, jein - es gibt da verschiedene Möglichkeiten:

                1. Man sagt dem Server (d.h. dem Apache-Webserver) alle Dateien im
                     Verzeichnis X (meist cgi-bin, „CGI Binaries”) sollen ausgeführt werden -
                     dafür muss man dann auch das X-Bit (also die Ausführrechte) für die Datei
                     setzen. Der Server guckt dann, ob es sich bei der Datei um eine
                     ausführbare Datei handelt (unter Windows spricht man von einer
                     .exe-Datei, aber unter Linux ist die Dateinendung egal - x-Bit gesetzt
                     heißt ausführbar… grob gesagt *g*) - ist dem so, so wird sie einfach
                     direkt ausgeführt. Andernfalls guckt sich der Server die erste Zeile der
                     Datei an - die muss den Pfad zu einer gültigen ausführbaren Datei
                     enthalten - dieser Datei, oder besser gesagt diesem Programm wird dann
                     der komplette nachfolgende Inhalt zum abarbeiten übergeben.
                2. Man konfiguriert den Apache-Webserver so, dass er automatisch alle
                     Dateien mit der Endung .x an das Programm y übergibt - also z.B. alle
                     .php Dateien automatisch an /usr/bin/php oder so - das erspart den Leuten
                     die auf dem Server PHP nutzen, dass Sie bei jedem PHP-Script in die erste
                     Zeile #!/usr/bin/php schreiben müssen ;-)

                Ich hatte ja wohl fälschlicherweise vermutet, dass der einfach unbesehen ausspuckt, was das Programm zurückgibt an Text und dann wäre es ja Browserproblem, damit umzugehen, wenn kein Content-Type vorhanden ist.

                Der Server hat dir vermutlich einen Internal Server Error angeguckt - in diesem Fall solltest du immer in die error.log Datei des Apaches gucken, da steht nämlich meist eine genauere Fehlerbeschreibung drin. Wenn du nicht weißt wo diese error.log ist, frag deinen Provider - wenn dieser dir keine zur Verfügung steht, dann wechsel den Provider.

                In deinem Fall dürfte die altbekannte Meldung „Premature End of Script Headers” in der error.log gestanden haben - das deutet meist darauf hin, dass das CGI-Script nicht alle notwendigen Header gesendet hat.

                \r wie auch \n steht hierbei lediglich als Platzhalter für die „wirklichen” Zeilenumbrüche.

                Und was ist ein wirklicher Zeilenumbruch, ein ASCII-Wert?

                Ja, es handelt sich hierbei um „Schriftzeichen” wie Buchstaben auch und welche in ASCII enthalten sind - du kannst sie lediglich nicht sehen, weshalb man sie (zusammen mit Leerzeichen u.a.) auch Whitespaces nennt.

                AFAIK handelt es sich um die ASCII-Werte 10 und 13 - wobei ich jetzt nicht weiß welcher davon \r und welcher \n entspricht…

                MfG, Dennis.

                --
                Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
                Patch zur Verwendung von PATHINFO in JLog
                Das Leben ist kein Warenhaus - es nimmt nichts zurück. (Anette Louisan)
          2. Hallo frankx.

            und ihr da oben. Dank, mit text/plan kommt die Frage zum Download, […]

            Logisch, es heißt ja auch „text/plain“.

            Einen schönen Montag noch.

            Gruß, Mathias

            --
            sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
            „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
            [HTML Design Constraints: Logical Markup]
    2. Hellihello Dennis,

      und ihr da oben. Dank, mit text/plan kommt die Frage zum Download, mit

      #!/usr/bin/ruby
      BEGIN {
      puts "Status: 200 OK\r\n";
      puts "Content-Type: text/html\r\n";
      puts "\r\n";
      puts "Hallo Welt!";
      }

      schnuffelts dann. Wobei es auch ohne Statuszeile geht, nicht aber ohne den Slash vor "usr" und nicht ohne die Absatzzeile zwischen Contentype und Hallowelt.

      besten dank,

      frankx

  2. Was steht im error.log?

    1. Hellihello richard,

      Was steht im error.log?

      hatte ich mich auch schon gefragt und finde nicht, wo ich die finde...;
      dank
      frankx

    2. Hallo jUnit (oder besser Richard?),

      Ich glaube, hier liegt eine grobe Verwechslung vor: gib entweder deine oder keine EMail-Adresse bzw. Homepage-URL an!

      Beste Grüße
      Richard

  3. Huhu

    #!usr/bin/ruby

    probier es mal so

    #!/usr/bin/ruby

    Viele Grüße

    lulu

    --
    bythewaythewebsuxgoofflineandenjoytheday
    1. Hellihello lulu,

      dank des tipps, hilfochnischt,

      frankx

      1. Hellihello lulu,

        dank des tipps, hilfochnischt,

        wie wärs mal mit etwas Systematik?
        Was sagt die Konsole, was steht im Log, usw.

        Viele Grüße,
        Reiner

  4. Ich grüsse den Cosmos,

    #!usr/bin/ruby

    Das heisst

    #!/usr/bin/ruby

    Möge das "Self" mit euch sein

    --
    Ich bin keine Signatur, ich fülle nur diesen leeren Platz mit sinnlosen Worten
    1. Ich grüsse den Cosmos,

      Hab grad gelesen, das du das schon probiert hast.
      Hast du nen Shellzugriff?

      Wenn ja, was passiert, wenn du

      /usr/bin/ruby -v

      eingibst?

      Möge das "Self" mit euch sein

      --
      Ich bin keine Signatur, ich fülle nur diesen leeren Platz mit sinnlosen Worten