Aller au contenu

Bash Sur Http Trigger


Remylpat

Messages recommandés

Bonjour a tous,

Je cherche a excuter un script bash lors de la reception d'une requete http.

J'ai essayé plein de truc mais rien n'y fait. je me rappel qu'on m'avais orienté vers la création d'un serveur http local en python mais je n'ai jamais rien réussi a faire.

quelqu'un saurais t'il m'aider ?

Je sais que vous allez dire attention faille de securité énorme, mais si je trouve un moyen de restreindre les requetes http autorisé a runner des scripts a des IP locales j'aurais déja un certain niveau de sécu.

Toute aide me serait utile.

PS : J'ai une boite de domotique (Zibase) qui sais m'envoyer des requetes HTTP sur detection d'un evenement. Qd ma porte se ferme, la zibase m'envoie une requette http, je l'analyse et je lance surveillance station.

Qd je rentre chez moi j'envoie une requete http a mon nas avec un code pour qu'il desactive la camera et si mauvais code ou pas de requette je eun un script qui fait du airplay sur ma freebox avec un son de sirene ...; On peut imaginer plein de trucs mais pour cela il faut que j'arrive a lancer a partir de http un script !#bin/sh

merci pour votre aide

Lien vers le commentaire
Partager sur d’autres sites

Salut Piwi,

Si je modifie le user apache, je donne donc les droits a apache pour executer des scripts.

et je fais un truc du genre :

<?php

echo "run script"

exec( /usr/syno/etc/rc.d/S99MonsScript.sh);

?>

C'est vrai que c'est pas le truc qui me branche le plus car je ne peux pas m'assurer de qui execute la page (@IP interne, ...)

Peut etre une autre idée ?

./Rémy

Lien vers le commentaire
Partager sur d’autres sites

ce n'est jamais une bonne idée de faire tourner apache en tant que root.

rien n'empêche de lancer un script avec l’utilisateur par défaut, et je ne comprend pas pourquoi ton script nécessiterait des droits root...

Lien vers le commentaire
Partager sur d’autres sites

En gros je me code un serveur HTTP maison.

Le truc est que j'aimerais éviter d'avoir des daemons dans tous les coins sur mon nas.

Mais si ca me permet d'etre perein avec les maj de nas et d'avoir un script http daemon qui démarre sur mon nas et gere les requetes internes spéciales why not.

Tu aurais un exemple Diaoul ?

Lien vers le commentaire
Partager sur d’autres sites

Merci Sp@ro,

J'ai bien vu ce module mais 3 questions qd meme

  • comment je "catch" les arguments de ma requette HTTP pour les faire correspondre a une commande ou un script a exectuer
  • Ca marche en multithread ?
  • Comment je fait en sorte que ca démarre a chaque demarrage du mon Nas avec du python?

Merci pour votre aide les gars

Modifié par Remylpat
Lien vers le commentaire
Partager sur d’autres sites

je pensais à un truc en perl/cgi, j'avais fait ça il y a quelques années pour les stats d'impression...

me souviens plus trop du truc, mais les ressources ne manquent pas sur internet.

en tout cas, ça fonctionne avec apache.

Lien vers le commentaire
Partager sur d’autres sites

Salut a tous,

J'ai enfin trouvé un peu de temps entre 2 biberons pour faire un server web http en python et essayer d'executer des commandes en fonction de l'url.

Je rencontre cependant un petit pb.

Mon serveur recois bien la requete http, je traite le "path" pour identifier ce que je dois faire, je lance une commande os.system() et je renvoie un message au client http.

Dans le princpe ca devrait marcher mais ca bloque au renvoie du message.

J'ai codé en mode "quick & dirty" en m'inspirant d'exemples sur le net et je pense que l'erreur vient de l'appel a os.system qui a mon avis devrait s'executer dans un thread séparé mais rien n'y fait j'y arrive pas.

Qqn pour m'aider ?


import os,string,cgi,time,subprocess

from os import curdir, sep

from subprocess import call

from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer

class MyHandler(BaseHTTPRequestHandler):

	def do_GET(self):

		try:

			if self.path.endswith(".html"):

				f = open(curdir + sep + self.path) #self.path /index.html

				self.send_response(200)

				self.send_header('Content-type', 'text/html')

				self.end_headers()

				self.wfile.write(f.read())

				f.close()

				return

			if self.path.endswith(".py"):

				f = open(curdir + sep + self.path)

				self.send_response(200)

				self.send_header('Content-type', 'text/html')

				self.end_headers()

				self.wfile.write(f.read())

				f.close()

				return

			if self.path.endswith(".sth"):   #dynamic

				self.send_response(200)

				self.send_header('Content-type', 'text/html')

				self.end_headers()

				self.wfile.write("today " + str(time.localtime()[7]))

				self.wfile.write("year " + str(time.localtime()[0]))

				return

			if self.path == "/meteo":   #Airplay Meteo

                os.system("sh /volume1/homes/admin/GoogleMeteo.sh");

                self.send_response(200)

                self.send_header('Content-type', 'text/html')

                self.end_headers()

                self.wfile.write("Airplay Meteo")

                return


		except IOError:

			self.send_error(404,'File Not Found: %s' % self.path)


	def do_POST(self):

		global rootnode

		try:

			ctype, pdict = cgi.parse_header(self.headers.getheader('content-type'))

			if ctype == 'multipart/form-data':

				query=cgi.parse_multipart(self.rfile, pdict)

			self.send_response(301)


			self.end_headers()

			upfilecontent = query.get('upfile')

			print "filecontent", upfilecontent[0]

			self.wfile.write("<HTML>POST OK.<BR><BR>");

			self.wfile.write(upfilecontent[0]);


		except :

			pass

def main():

	try:

		server = HTTPServer(('', 9990), MyHandler)

		print 'started httpserver...'

		server.serve_forever()

	except KeyboardInterrupt:

		print '^C received, shutting down server'

		server.socket.close()

if __name__ == '__main__':

	main()

Le script est bien lancé mais le browser tourne en rond jusqu'a expiration du timeout. je ne recois pas le self.wfile.write("Airplay Meteo")

J'avoue de plus pas bien avoir compris si le ';' était necessaire ou non .???

Modifié par Remylpat
Lien vers le commentaire
Partager sur d’autres sites

Merci Sp@ro,

J'avais deja essayé sans succes le subprocess mais j'ai persévéré apres ton message et ca marche.

Je vais donc pouvoir créer mon webserver interne avec toutes les actions nécessaires.

Merci encore

Merci Diaoul,

Faut que je regarde la difference entre subprocess.call et subprocess.popen.

par contre ca a marché avec python2.7 et pas le pyton natif du syno mais bon je suis pas a ca pret ;-)

Merci les gars

Lien vers le commentaire
Partager sur d’autres sites

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.