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!?
9 svar · 391 visningar · startad av mappo
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!?
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...
<Raderat >
a) Har du SSI påslaget?
b) Körs filen genom SSI (görs normalt med filändelsen .shtml)?
Menar du på min Apache med låtarna eller på webservern som kör skriptet?
Se till att det är rätt ägare och rätt rättigheter på filerna.
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...
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: $!");
En liten punkt, ett snedstreck och ... ta-daa!
Tack Hansen!
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";
}