IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Commande shell (iptables) dans python


Sujet :

Python

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Février 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 35
    Par défaut Commande shell (iptables) dans python
    Bonjour,

    Je dois remplacer mon script shell par un langage python

    Dans mon script shell y figure de nombreuses commandes iptables

    Dans mon programme python aucune commande ne marche pourquoi? (je ne connais rien en python j'ai juste vu qu'il fallait faire os.system pour exécuter une commaande)

    ex : import os

    os.system("iptables -A INPUT -s 192.6.1.96 -j ACCEPT")(la même commande dans le script : /sbin/iptables -A INPUT -s 192.6.1.81 -j ACCEPT)

  2. #2
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    Lancez vous le script avec les droits nécessaires ? (Comprendre root)

    @+

  3. #3
    Membre chevronné Avatar de cboudy
    Profil pro
    Ingénieur informatique industrielle
    Inscrit en
    Avril 2006
    Messages
    407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique industrielle
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 407
    Par défaut
    c'est normal qu'il y ait sbin d'un coté et pas de l'autre
    un os.system qui ne passe pas ça peut être un problème de droits, de PATH, de syntaxe ...

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Février 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 35
    Par défaut
    quand je lance le script je suis en root

  5. #5
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Bonjours,

    Citation Envoyé par albertopisto Voir le message
    Dans mon programme python aucune commande ne marche pourquoi?
    Il faudrait peut-être être un peu plus précis –*python doit bien se plaindre d’une manière ou d’une autre, renvoyer une exception (erreur), etc.*? Sinon, nous décrire exactement ce qui «*ne marche pas*»…

    À propos, il existe un module standard, subprocess (lien py3k, mais il existe aussi pour les py2 récents), qui se veut le remplaçant de os.system (entre autre)…

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Février 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 35
    Par défaut
    Bonjour,

    Mon script shell fonctionne parfaitement et je l'exécute en root (sudo ./script.sh),
    exemple de code :
    /sbin/iptables -t filter -P INPUT ACCEPT
    /sbin/iptables -t filter -P FORWARD ACCEPT


    dans mon script python :

    import os
    os.system("iptables -L")

    cette ligne marche et affiche à l'écran un iptables -L

    mais lorsque j'ajoute toutes mes autres commandes comme :

    os.system("iptables -t filter -P INPUT ACCEPT")
    os.system("iptables -t filter -P FORWARD ACCEPT")

    cela ne marche plus et j'ai comme erreur : (j'ai la même erreur en mettant /sbin/iptables)

    File "test.py", line 19
    os.system("iptables -t filter -F")
    ^
    IndentationError: unexpected indent



    j'exécute mon script avec : sudo python script.py


    merci

  7. #7
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Citation Envoyé par albertopisto Voir le message
    File "test.py", line 19
    os.system("iptables -t filter -F")
    ^
    IndentationError: unexpected indent
    Et bien la réponse est dans le texte.
    C'est une erreur d'indentation par rapport au code qui précède.

    @+

  8. #8
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Oui, je plussoie PauseKawa…

    Difficile d’être plus précis sans avoir l’intégralité du code sous les yeux (et dans une balise [code], de préférence), mais il y a fort à parier qu’il y a une ou plusieurs espaces indésirables devant la ligne en question… Python est très susceptible sur ce sujet

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Février 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 35
    Par défaut
    en fait quelque soit la regle iptabkles que je marque seul la 1er commande marche

    os.system("iptables -A INPUT -s 192.6.1.81 -j ACCEPT")
    os.system("iptables -L")

    j'aurai une erreur sur la 2eme ligne

    il faut que je mette quelque chose à la fin de chaque ligne ?

  10. #10
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Citation Envoyé par albertopisto Voir le message
    il faut que je mette quelque chose à la fin de chaque ligne ?
    Non, Python n’a pas besoin d’un terminateur quelconque en bout de ligne…

    Encore une fois, ce serait plus facile avec le code source copié/collé…

    [Edit] Et le problème ne vient a priori absolument pas de os.system, ni de l’utilisation de processus externes, c’est apparemment une simple faute de syntaxe pythonesque…

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Février 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 35
    Par défaut
    merci j'ai trouvé

    comme je suis débutant en python j'avais mis des tabulations a certaines lignes de codes

    il fallait que je mette toutes mes lignes à gauche sans faire d'espace

    désolé

  12. #12
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Oui, l’indentation est primordiale dans ce langage, c’est elle qui définit les blocs de code (pas d’accolades ou de BEGIN/END ici ). C’est une erreur extrêmement commune au début, et qui revient toujours régulièrement ensuite (faute d’inattention…)

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Février 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 35
    Par défaut
    j'ai une autre question à propos de python :

    peut-on exécuter une fonction python en prenant des paramètres (comme en shell), ex :

    sudo pyton test.py para1 par2



    dans mon code python, j'ai :
    base = ['orig','start','stop','status']
    print(base)
    resultat=raw_input("Entrez un parametre : ")

    est-ce que je peux faire
    if resultat = base :
    instruction
    elif resultat = start :
    instruction


    comme en c avec scanf

  14. #14
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Oui, et oui

    Pour les arguments passés en ligne de commande, il y a au moins quatre façons de faire, dont trois bibliothèques standard qui leur sont dédiées*: le module builtin sys, le module argparse, le module optparse, et le module getopt, qui imite la fonction C éponyme…

    En ce qui concerne raw_input, elle retourne une string… Le code serait donc plutôt celui-ci*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    resultat=raw_input("Entrez un parametre : ")
    if resultat == 'start' :
        # instruction… (ne pas oublier l’indentation*!)
    elif resultat == 'stop' :
        # instruction…
    Mais ici, une solution à base de dictionnaire serait bien plus élégante*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    # On définit une fonction pour chaque instruction…
    def do_start():
        # Instructions…
     
    def do_stop():
        # Instructions…
     
    # Etc.
     
    # On crée un dico mappant le nom de la commande à la fonction qui l’exécute.
    ops = {'start': do_start,
           'stop': do_stop,
           # etc.
          }
     
    op = raw_input("Entrez une commande : ") 
     
    if op in ops:
        ops[op]()
    else:
        print("Désolé, la commande %s est inconnue…"%op)

  15. #15
    Membre actif
    Profil pro
    Inscrit en
    Février 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 35
    Par défaut
    Merci !

Discussions similaires

  1. Réponses: 8
    Dernier message: 25/09/2008, 20h22
  2. Masquer une commande système dans python
    Par Mysti¢ dans le forum Général Python
    Réponses: 5
    Dernier message: 03/11/2006, 16h33
  3. commande shell dans programme C
    Par horkets dans le forum C
    Réponses: 1
    Dernier message: 01/11/2006, 14h55
  4. utilisation des commandes shell dans un programme C
    Par rasgueados dans le forum Linux
    Réponses: 15
    Dernier message: 03/08/2006, 17h25
  5. commande shell dans un programme
    Par diefo dans le forum C
    Réponses: 3
    Dernier message: 15/08/2003, 13h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo