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

Qt Discussion :

Qt et exécution des commandes système


Sujet :

Qt

  1. #1
    Membre du Club
    Inscrit en
    Mai 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 117
    Points : 58
    Points
    58
    Par défaut Qt et exécution des commandes système
    En fait, je suis entrain de travailler avec Puffy et particulièrement avec SFTP pour établir une connexion sécurisée SSH entre un serveur et des clients. Et, je dois mettre les commandes d'ouverture de connexion (open user@adresse IP) et de upload d'un fichier depuis le serveur (put) et download d'un fichier (get).
    Ces commandes doivent être mises dans le serveur à base de Qt.
    Comment dois je procéder?
    Je penche vers l'usage des threads. Est-il possible? Et, si c'est vrai, proposez moi des exemples simples et des liens avec QThread. Sinon, qu'elle est la solution optimale pour que le serveur exécute ses commande sans l'initiation de l'utilisateur?

  2. #2
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Points : 1 672
    Points
    1 672
    Par défaut
    Lien de base sur les Thread avec Qt ici.
    Tu as aussi la FAQ . Sinon tu as encore des exemple dans le SDK.

  3. #3
    Membre du Club
    Inscrit en
    Mai 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 117
    Points : 58
    Points
    58
    Par défaut
    Est ce la classe QProcess peut être une solution ?
    Est ce la commande ShellExecute peut être une solution ?

  4. #4
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Points : 1 672
    Points
    1 672
    Par défaut
    A ma connaissance ShellExecute() et QProcess lancent des process et pas des Threads. C'est pas la même chose cela dépend de ce que tu veux faire. Si tu veux utiliser les Thread ce n'est pas la bonne solutions, mais peut etre que tu n'est pas obliger d'utiliser les thread pour ton probleme. Peux tu préciser ce que tu appelles commandes d'ouverture pour toi ?

  5. #5
    Membre du Club
    Inscrit en
    Mai 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 117
    Points : 58
    Points
    58
    Par défaut
    open user@adresseIP
    après avoir exécuté sftp.exe (écrit en ligne de commande)

  6. #6
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Points : 1 672
    Points
    1 672
    Par défaut
    Si en gros tu veux écrire l'équivalent d'une commande dans un terminal (cmd.exe sous win) oui c'est bien QProcess ou ShellExecute qu'il faut utiliser.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 223
    Points : 193
    Points
    193
    Par défaut
    Bonjour.

    D'après ce que j'ai compris, tu souhaites simplement utiliser des commandes SSH.
    Un déroulement séquentiel est logiquement suffisant, je ne pense pas que les Threads soient indispensables. Aprés, je me trompe peut etre quant a l'objectif de ce projet.

    Cordialement,
    PKO

  8. #8
    Membre du Club
    Inscrit en
    Mai 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 117
    Points : 58
    Points
    58
    Par défaut
    oui j'ai réussi à exécuter psftp
    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
    #include <QtGui>
    #include <QApplication>
     
    void function()
    {
    	QProcess *proc; // pointer definition
    	proc = new QProcess(); // memory allocation from heap, created with parent
    	proc->start("psftp.exe"); // start program
     
    }
     
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        function();
        return a.exec();
    }
    Mon problème réside maintenant sur la fait d'écrire les commandes telle que open user@adresseIP. Comment dois je procéder?
    Est-il possible de voir psftp et non d'être en arrière plan pour que je puisse voir le bon fonctionnement de mes commandes?

  9. #9
    Membre du Club
    Inscrit en
    Mai 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 117
    Points : 58
    Points
    58
    Par défaut
    J'ai trouvé la solution pour afficher l'invite de commande de psftp le voilà le code
    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
    #include <QtGui>
     
    class MyQPushButton : public QPushButton
    {
        public :
        //createur.
        //text : text du bouton
        //exe  : commande à exécuter lors de l'appui.
        MyQPushButton(const QString & text,const QString & exe, QWidget * parent = 0)
        : QPushButton (text,parent),
        m_exe(exe)
        {
            resize(75, 30);
            setFont(QFont("Times", 18, QFont::Bold));
        };
        virtual void mouseReleaseEvent ( QMouseEvent * event )
        {
            //lance la commande dans un process indépendant
            QProcess::startDetached (m_exe);
        }
     
        private :
            QString m_exe;
     
    };
     
    int main(int argc, char* argv[])
    {
        QApplication app(argc, argv);
        QWidget w;
        QVBoxLayout vl(&w);
     
        //boutton : ouvre grâce au CMD la page vers DVP/Qt
        MyQPushButton bouton1("Ouvrir PSFTP","cmd /c start psftp",&w);
     
        vl.addWidget(&bouton1);
        w.show();
        return app.exec();
    }
    Maic comment maintenant je peux afficher les commandes directement de psftp sur son invite de commande sans avoir recourir à les taper sur l'invite de commande psftp?

  10. #10
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 695
    Points : 188 895
    Points
    188 895
    Par défaut
    Si j'ai bien compris ce que tu as dit, tu veux que ton programme utilise la CLI comme un utilisateur.
    La doc nous fournit cet exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
         QProcess gzip;
         gzip.start("gzip", QStringList() << "-c");
         if (!gzip.waitForStarted())
             return false;
     
         gzip.write("Qt rocks!");
         gzip.closeWriteChannel();
     
         if (!gzip.waitForFinished())
             return false;
     
         QByteArray result = gzip.readAll();
    La fonction write() permet de faire ce que tu veux.

    write : http://qt.developpez.com/doc/4.5/qiodevice/#write
    closeWriteChannel : http://qt.developpez.com/doc/4.5/qpr...sewritechannel

  11. #11
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968

  12. #12
    Membre du Club
    Inscrit en
    Mai 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 117
    Points : 58
    Points
    58
    Par défaut
    ça ne marchait pas avec write.
    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
    #include <QtGui>
    #include <QApplication>
     
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
     
        QString l_command1 = "cmd /c start psftp" ;
        QProcess psftp;
        psftp.setStandardOutputFile("temp.txt");
        psftp.start(l_command1);
        QString l_command2 = "open user@vghvghf" ;
        psftp.write(l_command2);
        psftp.waitForFinished();
     
        return a.exec();
    }
    Est ce que je peux pencher sur la méthode setStandardInputFile et dans laquelle je fais appel à un fichier contenant les ligne de commandes à éxécuter?
    Si c'est possible quelqu'un pourra m'aider!
    Merci

  13. #13
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    pourquoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     QString l_command1 = "cmd /c start psftp" ;
    ca ca suffit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     QString l_command1 = "psftp" ;

  14. #14
    Membre du Club
    Inscrit en
    Mai 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 117
    Points : 58
    Points
    58
    Par défaut
    ça ne marchait pas avec cette modification.
    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
    #include <QtGui>
    #include <QApplication>
     
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
     
        QString l_command1 = "psftp" ;
        QProcess psftp;
        psftp.setStandardOutputFile("temp.txt");
        psftp.startDetached(l_command1);
        QString l_command2 = "open user@vghvghf" ;
        psftp.write(l_command2);
        psftp.waitForFinished();
     
        return a.exec();
    }

Discussions similaires

  1. [Système] Exécuter des commandes shell
    Par Invité dans le forum Langage
    Réponses: 2
    Dernier message: 18/10/2008, 22h06
  2. Réponses: 1
    Dernier message: 14/03/2007, 16h56
  3. [Systeme] Exécuter des commandes unix en java
    Par kenny49 dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 12/02/2007, 12h37
  4. exécuter une commande système à partir de sqlplus?
    Par c_moi_c_moi dans le forum Oracle
    Réponses: 24
    Dernier message: 08/11/2005, 16h11
  5. Réponses: 2
    Dernier message: 02/11/2004, 07h52

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