per http ein programm auf dem server ausführen

Brusko

Well-Known Member
Guten Morgen,
nun weis ich nicht ob ich hier mit diesem Thema richtig bin,
aber ich versuch es mal.
Ich möchte gerne per Webseite ein programm auf einem server ausführen.
auf dem server befindet sich das programm mb_tcpclient. Dieses muss ich mit einigen parametern und ip starten:
mb_tcpclient 0.0.0.0 502 255 write_coil 0 1
es bewirkt das der ausgang eines gerätes das sich an der ip 0.0.0.0 befindet auf 1 gesetzt wird.
Wenn ich dies am server direkt eingebe geht das ganze aber nun möchte ich es gerne in einer Webseite einbinden.
Wenn es ein sript schreibe und dieses starte geht es nicht bsw. es pasiert nicht im browser.
Kann mir jemand sagen was ich da evtl falsch mache ?
ich benutze netobjektfusion 8

mfg Michael
 
Hallo Kamikaze
habe vorhin mal gelesen wie dein logo entstanden ist, würde es so lassen wie es ist.simpel und dennoch mit hintergrundgedanken wie die zahnräder usw. Ich finde das Logo vollkommen ok und auch nicht zu übetrieben.
Das wollte ich mal vorweg sagen :-)

Also das script nennt sich mb-test.sh und befindet sich im gleichen ordner wo die website liegt (dokumentroot) und in diesem ordner befindet sich auch das dazugehörenden programm und sieht folgender maßen aus:

#! /bin/sh
mb_tcpclient 192.168.0.137 502 255 write_coil 0 1

Habe nun mal versucht das script zu starten auch unter root (su) er sagt mit denn keine rechte bzw Permission denied.
der direkt aufruf
mb_tcpclient .......
geht
mfg Michael
 
Ich kenn mich damit nicht allzugut aus, aber man müsste mit php oder perl was zusammenfrickeln können.
 
Um das Skript lokal zu starten muss es ausführbar sein.

# chmod +x SKRIPT

Um es über das Web zu starten muss beim Webserver .sh als CGI mit /bin/sh als Interpreter konfiguriert werden.
 
Um das Skript lokal zu starten muss es ausführbar sein.

# chmod +x SKRIPT

Um es über das Web zu starten muss beim Webserver .sh als CGI mit /bin/sh als Interpreter konfiguriert werden.

wenn ich dich richtig verstehe müsteich chmod +x mb-test.sh im rc.conf eingeben ? oder in dem skript die zeile mit einfügen ?

deinen zweiten satz verstehe ich leider komplett nicht nicht sorry :-(
 
  1. Das Script muss für den Webserver-User lesbar und ausführbar sein
  2. Für die Endung .sh muss ein CGI-Handler konfiguriert sein
  3. Das Script wird mit den Rechten des Webservers ausgeführt. Also musst Du noch einen Wrapper einbauen. Entweder Du nimmst suexec, um das Script mit root-Rechten laufen zu lassen, oder Du nutzt sudo im Script selbst.
 
  1. Das Script muss für den Webserver-User lesbar und ausführbar sein
  2. Für die Endung .sh muss ein CGI-Handler konfiguriert sein
  3. Das Script wird mit den Rechten des Webservers ausgeführt. Also musst Du noch einen Wrapper einbauen. Entweder Du nimmst suexec, um das Script mit root-Rechten laufen zu lassen, oder Du nutzt sudo im Script selbst.

Hallo , glaube ich mus zugeben das ich zurzeit nur bahnhof verstehe :-( sorry
 
Wenn das so ist, solltest du dich Fragen ob du die richtige Person bist um diese Aufgabe anzugehen. Dir fehlt hier offensichtlich einiges an Hintergrundwissen. Dir bleibt wohl nichts anderes übrig als Handbücher (z.B. Apache, FreeBSD-Handbook, irgendwas mit Unix-Grundlagen) zu lesen.
 
Wenn das so ist, solltest du dich Fragen ob du die richtige Person bist um diese Aufgabe anzugehen. Dir fehlt hier offensichtlich einiges an Hintergrundwissen. Dir bleibt wohl nichts anderes übrig als Handbücher (z.B. Apache, FreeBSD-Handbook, irgendwas mit Unix-Grundlagen) zu lesen.

Da mus ich dir wohl leider recht geben, es ist so ich möchte eine haussteuerung realisieren. Soweit geht es auch aber da ich ja gerne mal ein touchscreen irgendwo installieren wollte, möchte ich gerne das ganze auch über eine homepage einbinden. das das ganze doch etwas mehr aufwenig ist hätte ich nicht gedacht. Aber da ich nu viele der Komponeten besitze möchte ich es auch gerne durchführen.
 
Da mus ich dir wohl leider recht geben, es ist so ich möchte eine haussteuerung realisieren. Soweit geht es auch aber da ich ja gerne mal ein touchscreen irgendwo installieren wollte, möchte ich gerne das ganze auch über eine homepage einbinden. das das ganze doch etwas mehr aufwenig ist hätte ich nicht gedacht. Aber da ich nu viele der Komponeten besitze möchte ich es auch gerne durchführen.


Mal ein wenig zusammengefasst:

  • Auf dem Server läuft FreeBSD
  • Per Netzwerk (Ethernet?) dort angeschlossen ist ein gerät, das du vernsteuern möchtest?
  • Das Programm, mit den du das gerät ansteuern möchtest, liegt auf dem server, muss (muss?) von dort gestartet werden, um dem gerät befehle zu übermitteln?
  • Du möchtest "irgendwann" per http/browser auf den FreeBsdServer von einem Touchpanel (was für eins? Kompletter Touchpanel-Computer?) zugriefen, um das o.G. Programm aufzurufen?

Wäre es nicht evtl. Sinnvoller sich DANN dadrüber gedanken zu machen, wenn du das Toucpanel hast? Evtl. könntest du ja auch etwas anderes als einen Browser nutzen e.t.c.
 
Mal ein wenig zusammengefasst:

  • Auf dem Server läuft FreeBSD
  • Per Netzwerk (Ethernet?) dort angeschlossen ist ein gerät, das du vernsteuern möchtest?
  • Das Programm, mit den du das gerät ansteuern möchtest, liegt auf dem server, muss (muss?) von dort gestartet werden, um dem gerät befehle zu übermitteln?
  • Du möchtest "irgendwann" per http/browser auf den FreeBsdServer von einem Touchpanel (was für eins? Kompletter Touchpanel-Computer?) zugriefen, um das o.G. Programm aufzurufen?

Wäre es nicht evtl. Sinnvoller sich DANN dadrüber gedanken zu machen, wenn du das Toucpanel hast? Evtl. könntest du ja auch etwas anderes als einen Browser nutzen e.t.c.

Auf dem server läuft freebsd 6.2 und das gerät ist per netzwerk 10/100 angeschlossen. Die treiber dazu befinden sich auf dem Server und das programm zum steuern auch. das nennt sich mb_tcpclient. Dieses prgramm mus ich mit zusätzlichen parametern aufrufen z.b.
mb_tcpclient 192.168.0.137 502 255 write_coil 0 1
Den Touchscreen habe ich schon den ich am server angeschlossen habe. läuft auch "soweit" bis auf das beim touchscree die maus in der falschen richtung läuft. habe den original treiber dafür noch nicht drin. das wäre mal irgendwann hier sicherlich meine nächste frage wie das geht. Aber ja erst ein teil nach dem anderen.
Bin auch nu etwas weiter gekommen.
ich habe folgenes nachgetragen.
in /etc/rc.conf
chmod +x /usr/local/www/apache22/cgi-bin/mb-test.sh

wuste nicht das apache 22 scripte aus diesen ordner schon zuläst.

es funtkioniert soweit wenn ich nu den Link auf meiner webseite klicke, dann komme aber das Fenster zum download der datei mb-test.sh. dieses möchte ich ja nicht ich möchte es ausführen. habe diesen link als dateilink verknüft ist das falsch ?
 
Hallo,

also, ich habe hier etwas ähnliches am laufen, um Programme fern zu steuern.
Mein erster Ansatz hierzu war ähnlich wie der hier beschriebene, daß Skript eben einfach über den Webserver ausführen zu lassen.
Das habe ich wie folgt gemacht ...

Apache mit PHP, ein PHP Skript ( mit .htaccess gesichert ).
Dieses Skript / diese PHP Seite sah so aus:
(Ist bei mir eine index Seite gewesen, daher die form Action ...)

<?php
if(isset($_REQUEST['doIt'])){
passthru('/usr/local/opt/MeinSkripteben.sh');
echo 'Okay, ausgeführt';
} else {
>
<html>
<head>
<title>
Meine Fernsteuerung
</title>
</head>
<body>
<form action="./" method="post">
<input type="submit" name="doIt" value="Programm los!">
</form>
</body>
</html>
<? } ?>

Dieses Skript führt dann das Shellskript aus, welches als User www gestartet wird unter FreeBSD. Dem Benutzer dann eben über sudo erlauben die Operationen auszuführen, die er soll.

Dann sollte es funktionieren, hat es bei mir wenigstens dann schon mal.

Schöner finde ich allerdings meinen neuen Ansatz ... da benutze ich xml-rpc.
Das ist ein bischen mehr Arbeit, aber dafür kann man sich dann auch GUI Clients schreiben und braucht keine Websites mehr.

Ich hoffe dieser "Erfahrungsbericht" kann ein bischen helfen,
ein schönes Wochenende wünscht,

mir.ko
 
Zur eigentlichen Frage:
wie andere schon geschrieben haben geht das mit html alleine nicht.
Mit php z.B. reicht ein einfaches shell_exec.
Dazu benötigt der user des webserves, im Falle des Apaches www, bestimmte Rechte (heisst der bei allen Webservern www?).
Ich hatte das Ganze bei meinem Ausbildungsabschlussprojekt mit sudo erledigt.

Da die Befehle ohne Eingabe eines Passwortes durchgeführt werden, ist das bei einem öffentlich Zugänglichen Webserver nicht unbedingt das Wahre, aber es funktioniert. Alternativ könnte man den Befehlen bzw. Scripten die Berechtigungen großzügig auf alle und jeden erweitern. Da ich das nicht wollte habe ich mit sudo gearbeitet.

Der Befehl ist zwar schnell geschrieben, aber ohne Hintergrundwissen wie man einen Button oder sonstwas mit phphtml zum Laufen bringt ists dann nicht ganz so einfach.

Falls es was bringt: hier mein Projekt mit Buttons die Filterregeln des IPFW durch ausführen eines Befehls ändern.

Kamikaze hatte ja beschrieben, dass man ein Script mit chmod +x in ein ausführbares Programm umwandelt.
Es sollte aber ein einfaches
Code:
$output = shell_exec('sh /path/to/script.sh');
reichen.
Edit: Das Blöde an html/php du kannst nicht einfach einen Button drücken um etwas auszufühen, sondern du setzt durch das Betätigen des Buttons eine Variable. Die Seite muss neu geladen werden und dann muss die Variable die gesetzt wurde ausgewertet werden.
 
Zuletzt bearbeitet:
Zur eigentlichen Frage:
wie andere schon geschrieben haben geht das mit html alleine nicht.
Mit php z.B. reicht ein einfaches shell_exec.
Dazu benötigt der user des webserves, im Falle des Apaches www, bestimmte Rechte (heisst der bei allen Webservern www?).
Ich hatte das Ganze bei meinem Ausbildungsabschlussprojekt mit sudo erledigt.

Da die Befehle ohne Eingabe eines Passwortes durchgeführt werden, ist das bei einem öffentlich Zugänglichen Webserver nicht unbedingt das Wahre, aber es funktioniert. Alternativ könnte man den Befehlen bzw. Scripten die Berechtigungen großzügig auf alle und jeden erweitern. Da ich das nicht wollte habe ich mit sudo gearbeitet.

Der Befehl ist zwar schnell geschrieben, aber ohne Hintergrundwissen wie man einen Button oder sonstwas mit phphtml zum Laufen bringt ists dann nicht ganz so einfach.

Falls es was bringt: hier mein Projekt mit Buttons die Filterregeln des IPFW durch ausführen eines Befehls ändern.

Kamikaze hatte ja beschrieben, dass man ein Script mit chmod +x in ein ausführbares Programm umwandelt.
Es sollte aber ein einfaches
Code:
$output = shell_exec('sh /path/to/script.sh');
reichen.
Edit: Das Blöde an html/php du kannst nicht einfach einen Button drücken um etwas auszufühen, sondern du setzt durch das Betätigen des Buttons eine Variable. Die Seite muss neu geladen werden und dann muss die Variable die gesetzt wurde ausgewertet werden.

Vieleicht sollte ich noch sagen das ich so gut wie keine ports unter freebsd installiert habe und auch kein PHP drauf habe.
sorry hatte ich vergesssen zu schreiben
 
Shell Skripte werden von /bin/sh interpretiert. Dieses wissen sollte schon Reichen um mit Hilfe der Apache Doku deine httpd.conf so zu ändern, dass du Shell Skripte über einen http Aufruf ausführen kannst. Im Browser bekommst du dann einfach die Ausgabe des Skripts angezeigt. PHP Wrapper machen nur Sinn, wenn du den Server nicht selbst konfigurieren kannst, aber PHP zur Verfügung hast.
 
Also der scriptaufruf geht mitlerwiese aber ich bekomme die Fehlermeldung im browser
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>500 Internal Server Error</title>
</head><body>
<h1>Internal Server Error</h1>
<p>The server encountered an internal error or
misconfiguration and was unable to complete
your request.</p>
<p>Please contact the server administrator,
brusko@web.de and inform them of the time the error occurred,
and anything you might have done that may have
caused the error.</p>
<p>More information about this error may be available
in the server error log.</p>
</body></html>

in der error_log steht

[Sun Jul 08 19:41:44 2007] [error] [client 192.168.0.100] Premature end of script headers: test.cgi, referer: http://192.168.0.110/
das schript sieht wie folgt aus
#!/usr/bin/perl -w
use CGI::Carp qw(fatalsToBrowser);
system("/usr/local/bin/mb_tcpclient 192.168.0.137 502 255 write_coil 0 1");
Das script funktioniert das sehe ich ja daran das mein ausgang geschaltet wird. aber warum die fehlermeldung?
 
Das Perl-Script wird über CGI aufgerufen. Der Webserver erwartet von einem solchen Script oder Programm bestimmte Rückgabewerte; an erster Stelle z. B. einen HTTP-Header, den er an den Client übermitteln soll. Diese Minimal-Ausgabe erzeugt Dein Programm aber nicht, sondern endet vorher. Ergo bekommt der Server zwar einen Exit-Code des CGI-Prozesses gemeldet, muss aber feststellen, dass gar kein Content erzeugt wurde (auch kein Header), den er an den anfragenden Client schicken könnte. Daher der Premature End of Script Fehler.
 
Das Perl-Script wird über CGI aufgerufen. Der Webserver erwartet von einem solchen Script oder Programm bestimmte Rückgabewerte; an erster Stelle z. B. einen HTTP-Header, den er an den Client übermitteln soll. Diese Minimal-Ausgabe erzeugt Dein Programm aber nicht, sondern endet vorher. Ergo bekommt der Server zwar einen Exit-Code des CGI-Prozesses gemeldet, muss aber feststellen, dass gar kein Content erzeugt wurde (auch kein Header), den er an den anfragenden Client schicken könnte. Daher der Premature End of Script Fehler.

Also wenn ich dich richtig verstehe mus der Browser grob gesagt eine Anwort vom script , so bekommen so das der Browser weis die shriptdatei wurde ausgeführt ?
Ich möchte ja eigtlich nicht das mir mein Browser jedesmal eine neue seute ausschmeist wenn ich den link zum script drücke.
 
Der Browser benötigt die Antwort nicht unbedingt, aber der Webserver erwartet sie. Wenn Du allerdings mit der Fehlermeldung in den Logs leben kannst, musst Du natürlich nix ändern, wenn die gewünschte Funktionalität auch so erreicht wird. Ansonsten bietet sich für sowas dann JavaScript an, wenn man das neu laden der Seite verhindern möchte...
 
Der Browser benötigt die Antwort nicht unbedingt, aber der Webserver erwartet sie. Wenn Du allerdings mit der Fehlermeldung in den Logs leben kannst, musst Du natürlich nix ändern, wenn die gewünschte Funktionalität auch so erreicht wird. Ansonsten bietet sich für sowas dann JavaScript an, wenn man das neu laden der Seite verhindern möchte...

Nun eigentlich möchte ich nur das keine fehlermeldung im browser erscheint oder wenn man den headerzurückgibt es keine weiße gibt. Nun java hab ich wohl mal gehört wäre aber sicherlich wieder was ganz anderes zu programieren und einstellen oder ?
 
Zurück
Oben