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

Bibliothèques tierces Python Discussion :

Utilisation de paramiko pour envoyer des commandes ssh


Sujet :

Bibliothèques tierces Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2014
    Messages : 30
    Points : 18
    Points
    18
    Par défaut Utilisation de paramiko pour envoyer des commandes ssh
    Bonjour,

    Je souhaite faire un programme simple depuis windows pour envoyer des commandes sur une debian en ssh. Malheureusement je n'ai pas trouver comment faire dans le help(paramiko) ...

    Je suis sous windows 8.1 j ai installé :

    Python
    https://www.python.org/ftp/python/2....thon-2.6.6.msi
    Paramiko
    http://arquivos.victorjabur.com/pyth...in32-py2.7.exe
    PyCrypto
    http://www.voidspace.org.uk/download...in32-py2.6.exe


    J'utilise ceci pour la connexion et ça ne génère pas d'erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import paramiko
    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    client.connect('192.168.1.16', username='root', password='azerty')
    client.close()
    Je souhaiterai savoir comment transmettre une commande telle que :
    /usr/sbin/asterisk -rx "database show" ou ls -l

    Est il également possible de récupérer dans un fichier ou une variable le résultat de ls -l ?


    Par avance merci

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 241
    Points : 36 698
    Points
    36 698
    Par défaut
    Salut,
    çà devrait se faire via:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    client.exec_command('/usr/sbin/asterisk -rx "database show"')
    pour "ls -l", c'est un peu plus sportif:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    stdin, stdout, stderr = client.exec_command("ls -l")
    for line in stdout.read().splitlines():
         print (line)
    Ceci dit, vous avez plein d'exemples en cherchant un peu sur le net.
    Et la documentation n'est pas mal non plus.

    Et pour bien te former, les cours et tutoriels pour apprendre Python https://python.developpez.com/cours/


    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2014
    Messages : 30
    Points : 18
    Points
    18
    Par défaut remerciement
    Super merci beaucoup pour l'aide.

    Je n'arrivais pas à trouver et comprendre comment cela fonctionne.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2014
    Messages : 30
    Points : 18
    Points
    18
    Par défaut commande speciale
    Lorsque j'utilise cette commande j'ai un message d'erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    stdin, stdout, stderr = client.exec_command('/usr/sbin/asterisk -rx "database put test',numero,'maison"')
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Exception in Tkinter callback
    Traceback (most recent call last):
      File "C:\Python26\lib\lib-tk\Tkinter.py", line 1410, in __call__
        return self.func(*args)
      File "C:\Users\user\Desktop\programmation python\asterisk\projet avec ssh\La base\entry.py", line 45, in ajoutnumero
        stdin, stdout, stderr = client.exec_command('/usr/sbin/asterisk -rx "database put test',numero,'maison"')
    TypeError: exec_command() takes at most 3 arguments (4 given)
    Pourtant je suis en version python 2.6 et lorsque je fais un print cela fonctionne tres bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    numero=112
    print'/usr/sbin/asterisk -rx "database put test',numero,'maison"'
    Par avance encore merci


    Code en entier :
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    # -*- coding: cp1252 -*-
    #chargement du module graphique
    from Tkinter import *
    import Tkinter as tk
    #chargement des commandes de l os
    import os
    #chargement du module ssh
    import paramiko
    #chargement du module de fenetre secondaire
    import tkMessageBox
     
     
    #creation fenetre principal
    fenetre = Tk()
    fenetre.geometry("800x600+300+0")
     
    #placement du text sur l interface
    txt1 = Label(fenetre, text="Telephonie")
    txt1.pack()
    txt2 = Label(fenetre, text="Indiquer le numero de votre nouveau contact puis cliquer sur Ajouter:")
    txt2.place(x=45, y=40)
     
    #commande qui va ajouter le numero lors d un clic sur le bouton Ajouter
    def ajoutnumero():
     
        if le_numero_en_int.get() <= 1 or le_numero_en_int.get() >= 9999999999 :
            # si le numero et inferieur ou egale a 1 OU superieur ou egale a 9999999999
            tkMessageBox.showinfo("Erreur", "Le numéro de telephone est invalide")
            numero = le_numero_en_int.get()
            print("if",numero)
        else:
            # sinon le numero est ok on l enregistre sur asterisk
            numero = le_numero_en_int.get()
            client = paramiko.SSHClient()
            client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            client.connect('192.168.1.14', username='root', password='azerty')
            stdin, stdout, stderr = client.exec_command("mkdir test")
            stdin, stdout, stderr = client.exec_command("ls")
            for line in stdout.read().splitlines():
                print (line)
            stdin, stdout, stderr = client.exec_command("rm -r test")
            stdin, stdout, stderr = client.exec_command('/usr/sbin/asterisk -rx "database put test',numero,'maison"')
            client.close()
            tkMessageBox.showinfo("Erreur", "Ajout au carnet d adresse effectué pour le numero")
            print("else",numero)
            print'/usr/sbin/asterisk -rx "database put test',numero,'maison"'
     
     
     
    # Création d'un widget Entry (champ de saisie)
    le_numero_en_int = tk.IntVar()
    le_numero = Entry(fenetre, bg ='bisque', fg='maroon', textvariable=le_numero_en_int).place(x=45, y=120)
     
    #Bouton qui permet d ajouter le numero saisie dans le widget Entry
    bouton1=Button(fenetre, text="Ajouter", command=ajoutnumero).place(x=125, y=115)

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 241
    Points : 36 698
    Points
    36 698
    Par défaut
    Salut,

    En Python2.6, la commande print n'a pas besoin de parenthèses pour concaténer la liste d'arguments.
    Par contre, si le premier argument d'une fonction doit être une chaîne de caractère et que vous lui passez 3 arguments, çà restera 3 arguments. C'est à vous de concaténer "avant".

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2014
    Messages : 30
    Points : 18
    Points
    18
    Par défaut
    Merci beaucoup pour votre réponse.
    Je n'ai pas du tout le niveau pour comprendre celle-ci... Auriez vous un livre ou tuto (français) à me conseiller pour apprendre à programmer en python avec tkinter ?

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 241
    Points : 36 698
    Points
    36 698
    Par défaut
    Citation Envoyé par asmodaisda Voir le message
    Merci beaucoup pour votre réponse.
    Je n'ai pas du tout le niveau pour comprendre celle-ci...[/QUOTE]
    Désolé, essayez de comprendre ceci:
    Le print qui fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> numero=123
    >>> print '/usr/sbin/asterisk -rx "database put test',numero,'maison"'
    /usr/sbin/asterisk -rx "database put test 123 maison"
    Maintenant, on fabrique une fonction qui accepte un nombre d'arguments variable et se contente d'afficher chacun d'eux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> def foo(*args):
    ...     for s in args: print s
    ...
    >>> foo('/usr/sbin/asterisk -rx "database put test',numero,'maison"')
    /usr/sbin/asterisk -rx "database put test
    123
    maison"
    Dit autrement la chose est un tuple et non une chaîne de caractères.
    Et si vous passez cela comme argument à une fonction qui n'attend pas 3 paramètres, çà plante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> def bar(command):
    ...     pass
    ...
    >>> bar('/usr/sbin/asterisk -rx "database put test',numero,'maison"')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: bar() takes exactly 1 argument (3 given)
    >>>
    Citation Envoyé par asmodaisda Voir le message
    Auriez vous un livre ou tuto (français) à me conseiller pour apprendre à programmer en python avec tkinter ?
    Les ressources mentionnées dans ce post sont un bon point de départ.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2014
    Messages : 30
    Points : 18
    Points
    18
    Par défaut erreur et autre test
    Merci pour vos explications supplémentaires. J'ai essayé de mettre en place la façon que vous proposez avec foo.
    Une erreur malheureusement surviens mais je ne comprend pas pourquoi il parle de len :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Exception in Tkinter callback
    Traceback (most recent call last):
      File "C:\Python26\lib\lib-tk\Tkinter.py", line 1410, in __call__
        return self.func(*args)
      File "C:/Users/user/Desktop/programmation python/asterisk/projet avec ssh/foo en test.py", line 44, in ajoutnumero
        stdin, stdout, stderr = client.exec_command(foo('/usr/sbin/asterisk -rx "database put test',numero,'maison"'))
      File "C:\Python26\lib\site-packages\paramiko\client.py", line 364, in exec_command
        chan.exec_command(command)
      File "C:\Python26\lib\site-packages\paramiko\channel.py", line 210, in exec_command
        m.add_string(command)
      File "C:\Python26\lib\site-packages\paramiko\message.py", line 257, in add_string
        self.add_int(len(s))
    TypeError: object of type 'NoneType' has no len()

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    # -*- coding: cp1252 -*-
    #chargement du module graphique
    from Tkinter import *
    import Tkinter as tk
    #chargement des commandes de l os
    import os
    #chargement du module ssh
    import paramiko
    #chargement du module de fenetre secondaire
    import tkMessageBox
     
     
    #creation fenetre principal
    fenetre = Tk()
    fenetre.geometry("800x600+300+0")
     
    #placement du text sur l interface
    txt1 = Label(fenetre, text="Telephonie")
    txt1.pack()
    txt2 = Label(fenetre, text="Indiquer le numero de votre nouveau contact puis cliquer sur Ajouter:")
    txt2.place(x=45, y=40)
     
    #commande qui va ajouter le numero lors d un clic sur le bouton Ajouter
    def ajoutnumero():
     
        if le_numero_en_int.get() <= 1 or le_numero_en_int.get() >= 9999999999 :
            # si le numero et inferieur ou egale a 1 OU superieur ou egale a 9999999999
            tkMessageBox.showinfo("Erreur", "Le numéro de telephone est invalide")
            numero = le_numero_en_int.get()
            print("if",numero)
        else:
            def foo(*args):
                for s in args: print s
            # sinon le numero est ok on l enregistre sur asterisk
            numero = le_numero_en_int.get()
            client = paramiko.SSHClient()
            client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            client.connect('192.168.1.15', username='root', password='azerty')
            stdin, stdout, stderr = client.exec_command("mkdir test")
            stdin, stdout, stderr = client.exec_command("ls")
            for line in stdout.read().splitlines():
                print (line)
            stdin, stdout, stderr = client.exec_command("rm -r test")
            stdin, stdout, stderr = client.exec_command(foo('/usr/sbin/asterisk -rx "database put test',numero,'maison"'))
            client.close()
            tkMessageBox.showinfo("Erreur", "Ajout au carnet d adresse effectué pour le numero")
            print("else",numero)
            print'/usr/sbin/asterisk -rx "database put test',numero,'maison"'
     
     
     
    # Création d'un widget Entry (champ de saisie)
    le_numero_en_int = tk.IntVar()
    le_numero = Entry(fenetre, bg ='bisque', fg='maroon', textvariable=le_numero_en_int).place(x=45, y=120)
     
    #Bouton qui permet d ajouter le numero saisie dans le widget Entry
    bouton1=Button(fenetre, text="Ajouter", command=ajoutnumero).place(x=125, y=115)
    J'ai trouvé une autre solution mais celle-ci n'est pas du tout "propre". J'ai pour le coup rajouté une variable pour choisir le nom :

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    # -*- coding: cp1252 -*-
    #chargement du module graphique
    from Tkinter import *
    import Tkinter as tk
    #chargement des commandes de l os
    import os
    #chargement du module ssh
    import paramiko
    #chargement du module de fenetre secondaire
    import tkMessageBox
     
     
    #creation fenetre principal
    fenetre = Tk()
    fenetre.geometry("800x600+300+0")
     
    #placement du text sur l interface
    txt1 = Label(fenetre, text="Telephonie")
    txt1.pack()
    txt2 = Label(fenetre, text="Indiquer le numero de votre nouveau contact puis cliquer sur Ajouter:")
    txt2.place(x=45, y=40)
     
     
     
    #commande qui va ajouter le numero lors d un clic sur le bouton Ajouter
     
     
    def ajoutnumero():
     
        if le_numero_en_int.get() <= 1 or le_numero_en_int.get() >= 9999999999 :
            # si le numero et inferieur ou egale a 1 OU superieur ou egale a 9999999999
            tkMessageBox.showinfo("Erreur", "Le numéro de telephone est invalide")
            print("if",numero)
        else:
            numero = le_numero_en_int.get()
            numero = str(numero)
            nom = le_nom_en_int.get()
            number = '/usr/sbin/asterisk -rx "database put test '
            number1 = numero
            number2 = ' '
            number3 = nom
            number4 = '"'
            print(number + number1 + number2 + number3 + number4)
            # sinon le numero est ok on l enregistre sur asterisk
            client = paramiko.SSHClient()
            client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            client.connect('192.168.1.15', username='root', password='azerty')
            stdin, stdout, stderr = client.exec_command("mkdir test")
            stdin, stdout, stderr = client.exec_command("ls")
            for line in stdout.read().splitlines():
                print (line)
            stdin, stdout, stderr = client.exec_command("rm -r test")
            stdin, stdout, stderr = client.exec_command(number + number1 + number2 + number3 + number4)
            client.close()
            tkMessageBox.showinfo("Erreur", "Ajout au carnet d adresse effectué pour le numero")
            print("else",numero)
            print'/usr/sbin/asterisk -rx "database put test',numero,'maison"'
     
     
     
    # Création d'un widget Entry (champ de saisie)
    le_numero_en_int = tk.IntVar()
    le_numero = Entry(fenetre, bg ='bisque', fg='maroon', textvariable=le_numero_en_int).place(x=45, y=120)
     
    #Bouton qui permet d ajouter le numero saisie dans le widget Entry
    bouton1=Button(fenetre, text="Ajouter", command=ajoutnumero).place(x=125, y=115)
     
    le_nom_en_int = tk.StringVar()
    le_nom = Entry(fenetre, bg ='bisque', fg='maroon', textvariable=le_nom_en_int).place(x=45, y=150)

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 241
    Points : 36 698
    Points
    36 698
    Par défaut
    Salut,

    Citation Envoyé par asmodaisda Voir le message
    Merci pour vos explications supplémentaires. J'ai essayé de mettre en place la façon que vous proposez avec foo.
    "foo" n'était qu'un exemple pour illustrer la différence entre passage de paramètres pour print et pour une fonction.
    Si vous vous contentez de recopier bêtement des bouts de code sans essayer de les comprendre, çà va pas le faire.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2014
    Messages : 30
    Points : 18
    Points
    18
    Par défaut Utilisation d une liste
    Je n'avais pas compris que foo était un exemple pour différencier.

    J'ai lu un tutoriel sur les listes. J'ai donc fait en sorte que la liste lorsqu'elle est appelée affiche 4 arguments.
    Malheureusement une erreur est générée et je ne comprend pas ce qu'elle signifie... (je pense que la console linux n'attend qu'une seule commande sur une seule ligne.
    Ici dans notre exemple : /usr/sbin/asterisk -rx " database put test 0 none" mais je ne sais pas si il est possible avec une liste de lui faire écrire ceci.)


    Ici pour le test le resultat affiché contient bien 4 arguments :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /usr/sbin/asterisk -rx " database put
    test
    0
    none"
    #code de test pour la liste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # -*- coding: cp1252 -*-
    annuaire = 'test'
    numero = 0
    nom = 'none'
    asterisk_liste_ssh = ['/usr/sbin/asterisk -rx " database put', annuaire, numero, nom +'"']
     
    print(asterisk_liste_ssh[0])
     
    def liste():
        for elt in asterisk_liste_ssh: # elt va prendre les valeurs successives des éléments de ma_liste
            print(elt)
     
    liste()




    #Utilisation pour envoyer à linux via ssh
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    # -*- coding: cp1252 -*-
    #chargement du module graphique
    from Tkinter import *
    import Tkinter as tk
    #chargement des commandes de l os
    import os
    #chargement du module ssh
    import paramiko
    #chargement du module de fenetre secondaire
    import tkMessageBox
     
     
    #creation fenetre principal
    fenetre = Tk()
    fenetre.geometry("800x600+300+0")
     
    #placement du text sur l interface
    txt1 = Label(fenetre, text="Telephonie")
    txt1.pack()
    txt2 = Label(fenetre, text="Indiquer le numero de votre nouveau contact puis cliquer sur Ajouter:")
    txt2.place(x=45, y=40)
     
     
     
     
     
    #commande qui va ajouter le numero lors d un clic sur le bouton Ajouter
     
     
     
    def ajoutnumero():
     
        if le_numero_en_int.get() <= 1 or le_numero_en_int.get() >= 9999999999 :
            # si le numero et inferieur ou egale a 1 OU superieur ou egale a 9999999999
            tkMessageBox.showinfo("Erreur", "Le numéro de telephone est invalide")
            print("if",numero)
        else:
            annuaire = 'test'
            numero = le_numero_en_int.get()
            nom = le_nom_en_int.get()
            #Utilisation d'une liste
            asterisk_liste_ssh = ['/usr/sbin/asterisk -rx " database put', annuaire, numero, nom +'"']
            def liste_pour_ssh():
                for elt in asterisk_liste_ssh:
                    print(elt)
            print(liste_pour_ssh())
            # sinon le numero est ok on l enregistre sur asterisk
            client = paramiko.SSHClient()
            client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            client.connect('192.168.1.210', username='root', password='azerty')
            stdin, stdout, stderr = client.exec_command("mkdir test")
            stdin, stdout, stderr = client.exec_command("ls")
            for line in stdout.read().splitlines():
                print (line)
            stdin, stdout, stderr = client.exec_command("rm -r test")
            stdin, stdout, stderr = client.exec_command(liste_pour_ssh())
            client.close()
            tkMessageBox.showinfo("Erreur", "Ajout au carnet d adresse effectué pour le numero")
            print("else",numero)
            print'/usr/sbin/asterisk -rx "database put test',numero,'maison"'
     
     
     
     
    # Création d'un widget Entry (champ de saisie)
    le_numero_en_int = tk.IntVar()
    le_numero = Entry(fenetre, bg ='bisque', fg='maroon', textvariable=le_numero_en_int).place(x=45, y=120)
     
    #Bouton qui permet d ajouter le numero saisie dans le widget Entry
    bouton1=Button(fenetre, text="Ajouter", command=ajoutnumero).place(x=125, y=115)
     
    le_nom_en_int = tk.StringVar()
    le_nom = Entry(fenetre, bg ='bisque', fg='maroon', textvariable=le_nom_en_int).place(x=45, y=150)
    #code erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Exception in Tkinter callback
    Traceback (most recent call last):
      File "C:\Python26\lib\lib-tk\Tkinter.py", line 1410, in __call__
        return self.func(*args)
      File "C:/Users/user/Desktop/programmation python/asterisk/test liste/liste 4 arguments.py", line 56, in ajoutnumero
        stdin, stdout, stderr = client.exec_command(liste_pour_ssh())
      File "C:\Python26\lib\site-packages\paramiko\client.py", line 364, in exec_command
        chan.exec_command(command)
      File "C:\Python26\lib\site-packages\paramiko\channel.py", line 210, in exec_command
        m.add_string(command)
      File "C:\Python26\lib\site-packages\paramiko\message.py", line 257, in add_string
        self.add_int(len(s))
    TypeError: object of type 'NoneType' has no len()

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 241
    Points : 36 698
    Points
    36 698
    Par défaut
    Salut,

    Le principal soucis est que .exec_command attend la commande sous la forme d'une chaine de caractère et non une liste.

    Vous pourriez écrire une fonction genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def send_asterisk(client, annuaire, numero, nom):
          command = ... construire la chaine de caractères à partir de....
          print ("command: %s" % command) # histoire de voir ce que vous envoyez
          in, out, err = client.exec_command(command)
          ...
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  12. #12
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2014
    Messages : 30
    Points : 18
    Points
    18
    Par défaut Fini :)
    Merci pour toute votre aide maître Wiztricks :-D

    Code final qui fonctionne
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    # -*- coding: cp1252 -*-
    #chargement du module graphique
    from Tkinter import *
    import Tkinter as tk
    #chargement des commandes de l os
    import os
    #chargement du module ssh
    import paramiko
    #chargement du module de fenetre secondaire
    import tkMessageBox
     
     
    #creation fenetre principal
    fenetre = Tk()
    fenetre.geometry("800x600+300+0")
     
    #placement du text sur l interface
    txt1 = Label(fenetre, text="Telephonie")
    txt1.pack()
    txt2 = Label(fenetre, text="Indiquer le numero de votre nouveau contact puis cliquer sur Ajouter:")
    txt2.place(x=45, y=40)
     
     
     
     
     
    #commande qui va ajouter le numero lors d un clic sur le bouton Ajouter
    def ajoutnumero():
        if le_numero_en_int.get() <= 1 or le_numero_en_int.get() >= 9999999999 :
            # si le numero et inferieur ou egale a 1 OU superieur ou egale a 9999999999
            tkMessageBox.showinfo("Erreur", "Le numéro de telephone est invalide")
        else:
            numero = le_numero_en_int.get()
            numero = str(numero)
            nom = le_nom_en_int.get()
            number = '/usr/sbin/asterisk -rx "database put test '
            number1 = numero
            number2 = ' '
            number3 = nom
            number4 = '"'
            asterisk_annuaire = number + number1 + number2 + number3 + number4
            print(asterisk_annuaire)
            client = paramiko.SSHClient()
            client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            client.connect('192.168.1.210', username='root', password='azerty')
            stdin, stdout, stderr = client.exec_command(asterisk_annuaire)
            client.close()
            tkMessageBox.showinfo("Validation", "Ajout au carnet d adresse effectué pour le numero")
     
     
     
    # Création d'un widget Entry (champ de saisie)
    le_numero_en_int = tk.IntVar()
    le_numero = Entry(fenetre, bg ='bisque', fg='maroon', textvariable=le_numero_en_int).place(x=45, y=120)
     
    #Bouton qui permet d ajouter le numero saisie dans le widget Entry
    bouton1=Button(fenetre, text="Ajouter", command=ajoutnumero).place(x=125, y=115)
     
    le_nom_en_int = tk.StringVar()
    le_nom = Entry(fenetre, bg ='bisque', fg='maroon', textvariable=le_nom_en_int).place(x=45, y=150)
    A ce propos merci pour ces Cours et tutoriels Python , en particulier : Apprendre à programmer avec Python 3 par Gérard Swinnen

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. comment utiliser cURL dans php pour envoyer des données de php vers application android
    Par myaset dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 0
    Dernier message: 15/04/2013, 14h44
  2. [2.x] Commande pour envoyer des emails
    Par waxx59 dans le forum Symfony
    Réponses: 5
    Dernier message: 27/12/2012, 18h31
  3. Réponses: 31
    Dernier message: 01/10/2009, 15h21
  4. [Prototype] Utiliser Json pour envoyer des données au serveur
    Par GandalfZeGrey dans le forum Bibliothèques & Frameworks
    Réponses: 3
    Dernier message: 14/02/2008, 18h16
  5. Utiliser hylafax pour envoyer des fax
    Par ggnore dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 08/07/2004, 22h57

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