roger: mit print ipadresse auf html seite schreiben

Hallo,

ich hole mir die ip-Adresse vom Webserver

  
my $ipr = `exec /sbin/ifconfig | grep ippp0 -A 1 | grep "inet ADresse" | cut -d: -f2 | cut -d" " -f1`;  

und will Sie mit

  
print "Content-type: text/html\n\n";  
print "<table>;  
print <<"END2";  
   <tr>  
       <td align="right">akt. IP</td>  
       <td align="center">$ipr</td>  
   </tr>  
END2  
print "</table>";  

Auf die Webseite schreiben.
Es wird alles angezeigt nur nicht die IP-Adresse.
Wenn ich das Script debugge sehe ich das die ip richtig erzeugt/geholt wird.
Wenn ich die Variable "$ipr" gegen 123.123.123.123 tausche werden die Nummern angezeigt.

Ich kann mir das überhaupt nicht erklären was das sein soll.
ifconfig kann von jedem Benutzer ausgeführt werden.
Entweder ist im IP-String ein Sonderzeichen das html nicht mag,
oder wenn das cgi-Script vom Webserver aufgerufen wird, kann die ip-Adresse nicht wermittelt werden.

Fragen über Fragen. :-)

Gruß
   roger

  1. hi,

    ifconfig kann von jedem Benutzer ausgeführt werden.

    sicher? Auch vom Webserver-Prozess? Wie auch immer, wenn der Wert in einer Variablen steht, kannst Du den auch ausgeben.

    Entweder ist im IP-String ein Sonderzeichen das html nicht mag,

    Na, das lässt sich doch prüfen, oder?

    oder wenn das cgi-Script vom Webserver aufgerufen wird, kann die ip-Adresse nicht wermittelt werden.

    Siehe oben.

    Hotti

  2. Dein Code ist großer Murks. Das grep funktioniert nicht, weil ein Tippfehler im String ist. Das grep funktioniert nicht, weil der String localeabhängig ist. (Ich vermute, dies ist der Grund für das beschriebene Fehlverhalten.) Man pfriemelt keine Daten mit Screenscraping raus, wenn diese bereits in strukturierter Form vorliegen.

    So geht's richtig:

      
        use IO::Interface::Simple qw();  
        my $interface_address = IO::Interface::Simple->new('ippp0')->address;  
        # 123.123.123.123  
    
    

    Woher weißt du eigentlich, dass ippp0 der richtige Interfacename ist? Diese Frage ist nicht rhetorisch, ich möchte es erfahren. Morgen, oder insbesonders gerne nach einem Neustart, kann das Interface ja plötzlich anders heißen.

    U.u. ist eine Auflistung nützlich.

      
        use IO::Interface::Simple qw();  
        my %interfaces_addresses_map = map {  
            $_ => $_->address  
        } IO::Interface::Simple->interfaces;  
        # (  
        #    eth0     => '192.168.0.1',  
        #    lo       => '127.0.0.1',  
        #    vboxnet0 => undef,  
        # )  
    
    

    Weitere Kritik: die Art, wie du eine Webanwendung schreibst, war schon 1997(!) überholt. Kannst du auf eine modernere Weise umsatteln? Insbesonders lege ich dir die Verwendung von Templates zu Herzen, damit du später das Markup in Dateien auslagern kannst und so eine saubere Trennung von Inhalt und Form hast, die du mittels print nur schwerlich erreichen kannst.

    ════════════════════════════════════════════════════════════════════════════════

    Als PSGI-Anwendung:

      
    use HTTP::Status qw(HTTP_OK);  
    use IO::Interface::Simple qw();  
    use Template::Tiny qw();  
      
    my $app = sub {  
        my ($env) = @_;  
        my $fill_in = {  
            interface_address => IO::Interface::Simple->new('ippp0')->address,  
        };  
      
        my $content_body;  
        Template::Tiny->new->process(\<<'END_TEMPLATE', $fill_in, \$content_body);  
    <!DOCTYPE html>  
    <html>  
        <head>  
            <title></title>  
        </head>  
        <body>  
            <table>  
                <tr>  
                    <td>aktuelle IP</td>  
                    <td>[% interface_address %]</td>  
                </tr>  
            </table>  
        </body>  
    </html>  
    END_TEMPLATE  
      
        return [HTTP_OK, ['Content-Type' => 'text/html;charset=UTF-8'], [$content_body]];  
    };  
    
    

    ════════════════════════════════════════════════════════════════════════════════

    Oder als CGI-Anwendung:

      
    use CGI qw();  
    use IO::Interface::Simple qw();  
    use Template::Tiny qw();  
      
    my $cgi = CGI->new;  
    print $cgi->header('text/html;charset=UTF-8');  
      
    my $fill_in = {  
        interface_address => IO::Interface::Simple->new('ippp0')->address,  
    };  
    Template::Tiny->new->process(\<<'END_TEMPLATE', $fill_in);  
    <!DOCTYPE html>  
    <html>  
        <head>  
            <title></title>  
        </head>  
        <body>  
            <table>  
                <tr>  
                    <td>aktuelle IP</td>  
                    <td>[% interface_address %]</td>  
                </tr>  
            </table>  
        </body>  
    </html>  
    END_TEMPLATE  
      
    1;