Remylpat Posté(e) le 16 février 2012 Partager Posté(e) le 16 février 2012 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 0 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
PiwiLAbruti Posté(e) le 16 février 2012 Partager Posté(e) le 16 février 2012 En effet c'est une belle faille de sécurité. Le plus simple (mais le plus moche) c'est de modifier l'utilisateur dans /usr/syno/apache/conf/httpd-user.conf et de redémarrer le service Apache : User root Group root # /usr/syno/etc/rc.d/S97apache-user.sh restart 0 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Remylpat Posté(e) le 16 février 2012 Auteur Partager Posté(e) le 16 février 2012 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 0 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
PiwiLAbruti Posté(e) le 16 février 2012 Partager Posté(e) le 16 février 2012 Tu peux vérifier l'adresse IP du client depuis ton script avec $_SERVER['REMOTE_ADDR']. 0 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
PatrickH Posté(e) le 16 février 2012 Partager Posté(e) le 16 février 2012 Et tu peux mettre une identification sur la page avec un .htaccess Patrick 0 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
cricx Posté(e) le 17 février 2012 Partager Posté(e) le 17 février 2012 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... 0 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
PiwiLAbruti Posté(e) le 17 février 2012 Partager Posté(e) le 17 février 2012 S'il n'est pas root, il ne peut pas utiliser les fonctions exec(), system() ou encore passthru(). Synology a quand même sécurisé un minimum WebStation pour éviter les dégâts que peuvent causer ces fonctions. 0 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Remylpat Posté(e) le 17 février 2012 Auteur Partager Posté(e) le 17 février 2012 @cricx Tu as un moyen de faire autrement, je serais interressé si jamais je peux limiter les potentielles failles 0 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Diaoul Posté(e) le 17 février 2012 Partager Posté(e) le 17 février 2012 Bah y'a plein d'autres moyens. Par contre il faut pas passer par le serveur HTTP de Syno mais pas un truc fait toi même. 0 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Remylpat Posté(e) le 17 février 2012 Auteur Partager Posté(e) le 17 février 2012 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 ? 0 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sp@r0 Posté(e) le 17 février 2012 Partager Posté(e) le 17 février 2012 En python 0 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Remylpat Posté(e) le 17 février 2012 Auteur Partager Posté(e) le 17 février 2012 (modifié) 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é le 17 février 2012 par Remylpat 0 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
cricx Posté(e) le 17 février 2012 Partager Posté(e) le 17 février 2012 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. 0 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Diaoul Posté(e) le 17 février 2012 Partager Posté(e) le 17 février 2012 Oui tu peux faire un CGI aussi, PERL, Python, après c'est toi qui vois pour le langage. Si tu ne connais aucun des deux je te conseille tout de même Python, perso je trouve PERL plutôt obscur. 0 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
cricx Posté(e) le 17 février 2012 Partager Posté(e) le 17 février 2012 oui python c'est mieux ! mais perl c'est bien 0 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Remylpat Posté(e) le 18 février 2012 Auteur Partager Posté(e) le 18 février 2012 va pour python, je vais faire qq essais, jevous solliciterais surement encore pou qq conseils. Merci de vos reponses 0 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Remylpat Posté(e) le 24 février 2012 Auteur Partager Posté(e) le 24 février 2012 (modifié) 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é le 24 février 2012 par Remylpat 0 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Remylpat Posté(e) le 2 mars 2012 Auteur Partager Posté(e) le 2 mars 2012 Personne n'aurais une idée ? 0 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sp@r0 Posté(e) le 2 mars 2012 Partager Posté(e) le 2 mars 2012 import subprocess subprocess.Popen(['ton script.sh','parametre1','parametre2']) 0 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Diaoul Posté(e) le 2 mars 2012 Partager Posté(e) le 2 mars 2012 Tu as aussi subprocess.call Pour faire un serveur web minimaliste tu devrais plutôt t'orienter vers le module "Flask" : http://flask.readthedocs.org/en/latest/quickstart/ Tu pourras pas trouvé plus court comme code 0 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Remylpat Posté(e) le 2 mars 2012 Auteur Partager Posté(e) le 2 mars 2012 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 0 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Diaoul Posté(e) le 3 mars 2012 Partager Posté(e) le 3 mars 2012 Y'a pas de python natif sur le Syno à ma connaissance. 0 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
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.