2011-06-04 09:01:23 +0000 2011-06-04 09:01:23 +0000
12
12
Advertisement

Een shellscript uitvoeren met een html-knop

Advertisement

Ik wil een bash script starten als er op een knop wordt gedrukt op een website. Dit is mijn eerste poging:

<button type="button" onclick="/path/to/name.sh">Click Me!</button>

Maar geen geluk. Iemand suggesties?

EDIT- Naar aanleiding van slhclk’s en mit’s advies:

Ik heb een php bestand in /var/www waar ik mijn web-browser naar toe wijs. De inhoud van het bestand is als volgt:

<?php
exec("/home/aa/scripts/test.sh");
?>

tesh.sh bevat dit:

screen -S server1 -X quit

Als ik /home/aa/scripts/test.sh in shell typ, is het script in staat om uit te voeren. Echter, als ik mijn web-browser richt op http://example.com/screen.php (die de bovenstaande code bevat), zie ik een lege pagina en het script is niet uitgevoerd. Beide hebben execute permissies. Waarom werkt het niet?

Advertisement
Advertisement

Antwoorden (5)

11
11
11
2011-06-04 09:37:02 +0000

Wat u probeert te doen is niet mogelijk op die manier.

Merk op dat er altijd twee kanten aan zitten: De client kant en de server kant. Staat het script op de client computer of op de server?

  • *

Als het op de client staat: Jij als bezoeker ziet alleen een HTML-website. onClick zal alleen JavaScript (of andere scripttalen ) kunnen starten, maar niet een willekeurig shellscript dat zich op uw computer bevindt. HTML-scripts draaien alleen in de browser en kunnen slechts beperkte dingen doen. Het belangrijkste is dat ze geen interactie met je computer kunnen hebben.

Denk er eens over na: Hoe zou de browser weten hoe hij het bestand moet openen? Denk je niet dat dit ook een veiligheidsprobleem zou zijn - een gewone website die scripts uitvoert op de computer van een klant? Wat als er iets was als onClick('rm -rf /home/user')?

Een alternatief zou zijn om een Java applet te draaien, als je wilt dat er code wordt uitgevoerd op de client, maar dit is niet precies hetzelfde en het is iets heel ingewikkelds. Ik denk niet dat het nodig is om dit in detail uit te leggen.

  • *

Als het script op de server staat: Als je een script op de server wilt uitvoeren en de gebruiker de uitvoering wilt laten starten, dan moet je een server-kant programmeertaal gebruiken. Gewoon HTML is niet voldoende, omdat het min of meer een statisch bestand is. Als je interactie met de server wilt, zou je bijvoorbeeld PHP kunnen gebruiken.

Het heeft de exec functie om een command line script uit te voeren dat op de web server is opgeslagen. Dus in principe zou je exec('/path/to/name.sh'); kunnen schrijven en het zou het script op de server uitvoeren.

Echter, alleen dit in onClick stoppen is niet genoeg hier. Als je nog niets weet over PHP en server side web programming, kun je misschien beter eerst een paar tutorials lezen en dan terugkomen met een meer specifieke vraag.

  • *

Als je een php bestand hebt met het juiste exec(...) commando, zorg er dan voor dat het script execute permissies heeft, niet alleen voor de gebruiker maar ook voor de groep waar de webserver in zit, dus in het eenvoudigste geval gewoon 777.

Controleer in geval van problemen de retourwaarde van het script met echo exec(...); om te zien of er fouten zijn.

Je kunt het script ook vanaf de commandoregel uitvoeren en niet vanuit de browser met php /path/to/file.php.

4
4
4
2011-06-04 09:50:25 +0000

Je hebt hier wat server side intelligentie voor nodig. HTML alleen is niet genoeg, omdat het statisch is. Een veel voorkomende manier zou php zijn. Veel gehoste aanbiedingen hebben standaard php geïnstalleerd.

Je kunt een ftp-programma gebruiken om een tekstbestand in de hoofddirectory van je server te zetten.

Het tekstbestand zou de naam “run.php” kunnen krijgen met de volgende inhoud:

<h3>Executing /path/to/name.sh</h3>
<?
exec('/path/to/name.sh');
?>

Laten we zeggen dat je domein “example.com” is, als je deze pagina in je browser bezoekt: http://example.com/run.php

dan zal het php bestand worden uitgevoerd op de server. Het zal een HTML pagina naar de browser sturen met de hoofding. En het script wordt op de server uitgevoerd.

Er zijn een paar dingen om in gedachten te houden en een paar mogelijke verbeteringen:

1) iedereen zal deze pagina kunnen bezoeken, ook robots. Je zou de pagina kunnen beveiligen met htacces.

2) Deze pagina zal openen bij een normaal “GET” verzoek van de browser. Maar het impliceert een actie op de server, en als deze actie gegevens verandert of iets belangrijks doet, zou het beter zijn om het script alleen op een POST verzoek af te vuren.

3) Je kunt een formulier / knop statement invoegen om de pagina te kunnen herladen / opnieuw uit te voeren. Zorg ervoor dat je de juiste methode gebruikt (GET of POST) in het method attribuut van het HTML formulier statement.

4) Het zou goed zijn om het resultaat van het shell script (rturn code en misschien tekst output) te krijgen en naar de browser te schrijven. Dit heeft genoeg problemen voor een aparte vraag : )

3
Advertisement
3
3
2012-01-06 06:21:27 +0000
Advertisement

Het zou een toestemmingsprobleem kunnen zijn.

Als je het script met webapp uitvoert, is het apache dat het script uitvoert. Als apache geen toestemming heeft om het script uit te voeren, zal het niet werken.

Oplossing: controleer de toestemming en probeer het opnieuw… :)

1
1
1
2018-08-11 08:36:42 +0000

Ik weet dat dit veel te laat is, maar ik denk dat het de moeite waard is om te vermelden dat het configureren van CGI op een server je in staat stelt om een server-side bash script te draaien zonder PHP of iets dergelijks te gebruiken.

Ik weet dat dit niet de bijgewerkte vraag adresseert, maar ik vond dit toen ik zelf dingen probeerde uit te zoeken, dus ik dacht dat ik het zou posten!

0
Advertisement
0
0
2018-11-09 17:43:32 +0000
Advertisement

Om shellscripts rechtstreeks vanuit de browser uit te voeren, moet je deze regel aan je .htaccess-bestand toevoegen:

Options +ExecCGI
AddHandler cgi-script .sh

Dit vertelt de webserver om .sh bestanden te behandelen als CGI scripts. Vergeet niet de rechten van .sh-bestanden te wijzigen in 755.

Advertisement

Gerelateerde vragen

6
10
11
37
3
Advertisement
Advertisement