webForumDet fria alternativet

html exekverar inte cgi!

9 svar · 391 visningar · startad av mappo

mappoMedlem sedan apr. 2001487 inlägg
#1

Jag blir så trött!

Skriptet funkar klockrent när jag kör det från prompten,
men html-filen vill inte exekvera det.

Exakt samma html-kod har inga problem med att köra
andra skript i samma mapp och med samma rättigheter
som det det ska köra.

What!?

mappoMedlem sedan apr. 2001487 inlägg
#2

bakgrunden

Jag vill komma åt mina mp3:or när jag sitter på skolan.
Hemma kör jag Apache. Mp3-mappen är utdelad.

Skriptet körs från skolans webbserver (Linux).
Det hämtar hem Apaches indexsida för mp3-mappen
från min server och sparar den som en html-fil.
Sedan exekveras en fil med Unixkommandon som trimmar
till html-filen och bygger en spellista.

(Vad den gör är att slita bort allt utom filnamnen och
sätta in mitt ip framför och sedan kalla resultaten för mp3.m3u.)

html-filen:

<html>
<body>
<!--#exec cgi="../cgi-bin/mp3.cgi"-->
</body>
</html>

skriptet:

#!/usr/bin/perl
print "Content-type:text/html\n\n";
exec 'sedan2';
print("<a href=\"./mp3.m3u\">playlist</a>");

unix-skriptet:

wget -q [url]http://MITT_IP/mp3/[/url] -O lista.html
grep -i 'sound2.gif' lista.html > a
grep -i -v '.m3u' a > b
sed 's/<IMG.............................................="/http:\/\/MITT_IP\/mp3\//g' b > c
sed 's/">.*//g' c > mp3.m3u
chmod 777 mp3.m3u
rm -f lista.html
rm -f a
rm -f b
rm -f c
mv mp3.m3u ../mp3/mp3.m3u

Det verkar som om perlprogrammet vägrar köra kommandot
exec då det körs som cgi...

mappoMedlem sedan apr. 2001487 inlägg
#3

<Raderat >

spangoMedlem sedan juni 20006 147 inlägg
#4

a) Har du SSI påslaget?
b) Körs filen genom SSI (görs normalt med filändelsen .shtml)?

mappoMedlem sedan apr. 2001487 inlägg
#5

Menar du på min Apache med låtarna eller på webservern som kör skriptet?

fourtMedlem sedan juli 200352 inlägg
#6

Se till att det är rätt ägare och rätt rättigheter på filerna.

mappoMedlem sedan apr. 2001487 inlägg
#7

Som jag skrev kan html-koden köra andra skript som ligger
i samma mapp och har samma rättigheter som det skript
jag vill köra.

Dessutom funkar allt fram till exec. Där lägger den av.
Men bara då det körs från html-sidan. Om jag kör cgi-
filen direkt i prompten är allt frid o fröjd...

HansenMedlem sedan aug. 2000383 inlägg
#8

sökvägen till "unix-skriptet" måste antingen vara absolut eller relativ.

exec './sedan2';

eller

exec '/home/user/bin/sedan2';

Om du ändrar till följande så blir det lättare att felsöka:

exec('./sedan2') 
  or die("failed to exec sedan2. Reason:  $!");
mappoMedlem sedan apr. 2001487 inlägg
#9

En liten punkt, ett snedstreck och ... ta-daa!
Tack Hansen!

HansenMedlem sedan aug. 2000383 inlägg
#10

mappo skrev:

En liten punkt, ett snedstreck och ... ta-daa!
Tack Hansen!

:o)

Jag kan inte motstå frestelsen att kasta in en mer perl-ish lösning:

#!/usr/bin/perl

use strict;
use warnings;

use HTML::LinkExtor;
use LWP::UserAgent;
use URI::URL;

use constant REMOTE_URL => 'http://0.0.0.0/mp3/';

my $parser = HTML::LinkExtor->new;
my $agent  = LWP::UserAgent->new;

my @mp3s     = ();
my $response = $agent->get(REMOTE_URL);
my $base     = $response->base;

if ( $response->is_success ) {

    $parser->parse( $response->content );

    for my $link ( $parser->links ) {

        unless (     $link->[0] eq 'a'          # TAG
                 and $link->[1] eq 'href'       # ATTRIBUTE
                 and $link->[2] =~ m/\.mp3$/ )  # VALUE
        {
            next;
        }
        
        push( @mp3s, url( $link->[2], $base )->abs );
    }
}

print "Content-type: audio/x-mpegurl\n\n";

while ( my $mp3 = shift(@mp3s) ) {
    print $mp3, "\n";
}
Genererad på 382 ms · cache AV · v20260730165559-full.f96bc7eb