Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Weird behavior of QProcess and multiple qoutes
Forum Updated to NodeBB v4.3 + New Features

Weird behavior of QProcess and multiple qoutes

Scheduled Pinned Locked Moved Solved General and Desktop
36 Posts 7 Posters 6.5k Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • M Manta Ray

    I've tried to connect wi-fi using QProcess.
    I've used wpa_cli utility.
    To successfully connect to security network I should set password in multiple quotes:

    QProcess wpacli;
    wpacli.execute("wpa_cli set_network 0 psk '\"12345678\"'");
    

    When I execute my application, this command returns FAIL.
    When I execute this line in console, it returns OK.
    I've printed this line to see is it correct:

    qDebug() << cmd.toUtf8().constData();
    

    This shows me correct line.
    I don't know why this command does not executes using QProcess.
    Can anybody help me?

    K Offline
    K Offline
    Konstantin Tokarev
    wrote on last edited by
    #2

    Use QProcess::execute overload with QStringList arguments

    1 Reply Last reply
    4
    • mrjjM Offline
      mrjjM Offline
      mrjj
      Lifetime Qt Champion
      wrote on last edited by
      #3

      Hi
      In other words, do not append to one string

      String program = "wpa_cli";
      QStringList arguments;
      arguments <<"set_network"<< "0" << "psk" << "12345" ;
      
      QProcess *myProcess = new QProcess(parent);
      myProcess->start(program, arguments);
      

      Also to help yourself, at least hook up to
      http://doc.qt.io/qt-5/qprocess.html#errorOccurred

      1 Reply Last reply
      3
      • M Offline
        M Offline
        Manta Ray
        wrote on last edited by
        #4

        Hello,

        I tried to use execute with argument list and my results were the same as earlier.
        I've added connection to signal errorOccurred() but this signal was not emited.

        My code is here:

            QString program = "wpa_cli";
            QStringList arguments;
            QProcess * wpacli = new QProcess();
        
            connect(wpacli, SIGNAL(errorOccurred(QProcess::ProcessError )), this, SLOT(onError(QProcess::ProcessError)));
        
            arguments << "remove_network" << "all";
            qDebug() << arguments;
            wpacli->execute(program, arguments);
        
            arguments.clear();
            arguments << "add_network";
            qDebug() << arguments;
            wpacli->execute(program, arguments);
        
            arguments.clear();
            arguments << "set_network" << "0" << "ssid" << id.toUtf8().toHex();
            qDebug() << arguments;
            wpacli->execute(program, arguments);
        
            arguments.clear();
            arguments << "set_network" << "0" << "psk" << pwd;
            qDebug() << arguments;
            wpacli->execute(program, arguments);
        
            arguments.clear();
            arguments << "enable_network" << "0";
            qDebug() << arguments;
            wpacli->execute(program, arguments);
        
            arguments.clear();
            arguments << "select_network" << "0";
            qDebug() << arguments;
            wpacli->execute(program, arguments);
        
            arguments.clear();
            arguments << "save_config";
            qDebug() << arguments;
            wpacli->execute(program, arguments);
        

        In onError() slot I've printed some logs:

        qDebug() << Q_FUNC_INFO;
        
            QString errorStr;
        
            switch(error) {
            case QProcess::FailedToStart: errorStr = "QProcess::FailedToStart"; break;
            case QProcess::Crashed: errorStr = "QProcess::Crashed"; break;
            case QProcess::Timedout: errorStr = "QProcess::Timedout"; break;
            case QProcess::WriteError: errorStr = "QProcess::WriteError"; break;
            case QProcess::ReadError: errorStr = "QProcess::ReadError"; break;
            case QProcess::UnknownError: errorStr = "QProcess::UnknownError"; break;
            }
        
            qDebug() << errorStr;
        

        In console I can see the next results:

        ("remove_network", "all")
        Selected interface 'wlan0'
        OK
        ("add_network")
        Selected interface 'wlan0'
        0
        ("set_network", "0", "ssid", "416e64726f69644150")
        Selected interface 'wlan0'
        OK
        ("set_network", "0", "psk", "12345678")
        Selected interface 'wlan0'
        FAIL
        ("enable_network", "0")
        Selected interface 'wlan0'
        OK
        ("select_network", "0")
        Selected interface 'wlan0'
        OK
        ("save_config")
        Selected interface 'wlan0'
        OK
        

        I'm not sure that using of argument list is good idea, because wpa_cli required to get password in multiple quotes: '""'.

        Do you have other ideas?

        jsulmJ 1 Reply Last reply
        0
        • M Manta Ray

          Hello,

          I tried to use execute with argument list and my results were the same as earlier.
          I've added connection to signal errorOccurred() but this signal was not emited.

          My code is here:

              QString program = "wpa_cli";
              QStringList arguments;
              QProcess * wpacli = new QProcess();
          
              connect(wpacli, SIGNAL(errorOccurred(QProcess::ProcessError )), this, SLOT(onError(QProcess::ProcessError)));
          
              arguments << "remove_network" << "all";
              qDebug() << arguments;
              wpacli->execute(program, arguments);
          
              arguments.clear();
              arguments << "add_network";
              qDebug() << arguments;
              wpacli->execute(program, arguments);
          
              arguments.clear();
              arguments << "set_network" << "0" << "ssid" << id.toUtf8().toHex();
              qDebug() << arguments;
              wpacli->execute(program, arguments);
          
              arguments.clear();
              arguments << "set_network" << "0" << "psk" << pwd;
              qDebug() << arguments;
              wpacli->execute(program, arguments);
          
              arguments.clear();
              arguments << "enable_network" << "0";
              qDebug() << arguments;
              wpacli->execute(program, arguments);
          
              arguments.clear();
              arguments << "select_network" << "0";
              qDebug() << arguments;
              wpacli->execute(program, arguments);
          
              arguments.clear();
              arguments << "save_config";
              qDebug() << arguments;
              wpacli->execute(program, arguments);
          

          In onError() slot I've printed some logs:

          qDebug() << Q_FUNC_INFO;
          
              QString errorStr;
          
              switch(error) {
              case QProcess::FailedToStart: errorStr = "QProcess::FailedToStart"; break;
              case QProcess::Crashed: errorStr = "QProcess::Crashed"; break;
              case QProcess::Timedout: errorStr = "QProcess::Timedout"; break;
              case QProcess::WriteError: errorStr = "QProcess::WriteError"; break;
              case QProcess::ReadError: errorStr = "QProcess::ReadError"; break;
              case QProcess::UnknownError: errorStr = "QProcess::UnknownError"; break;
              }
          
              qDebug() << errorStr;
          

          In console I can see the next results:

          ("remove_network", "all")
          Selected interface 'wlan0'
          OK
          ("add_network")
          Selected interface 'wlan0'
          0
          ("set_network", "0", "ssid", "416e64726f69644150")
          Selected interface 'wlan0'
          OK
          ("set_network", "0", "psk", "12345678")
          Selected interface 'wlan0'
          FAIL
          ("enable_network", "0")
          Selected interface 'wlan0'
          OK
          ("select_network", "0")
          Selected interface 'wlan0'
          OK
          ("save_config")
          Selected interface 'wlan0'
          OK
          

          I'm not sure that using of argument list is good idea, because wpa_cli required to get password in multiple quotes: '""'.

          Do you have other ideas?

          jsulmJ Offline
          jsulmJ Offline
          jsulm
          Lifetime Qt Champion
          wrote on last edited by
          #5

          @Manta-Ray
          Then just do

          arguments << "set_network" << "0" << "psk" << "\"" + pwd + "\"";
          

          https://forum.qt.io/topic/113070/qt-code-of-conduct

          1 Reply Last reply
          3
          • M Offline
            M Offline
            Manta Ray
            wrote on last edited by Manta Ray
            #6

            @jsulm
            Ok, added

                arguments.clear();
                arguments << "set_network" << "0" << "psk" << "'\"" << pwd << "\"'";
                qDebug() << arguments;
                wpacli->execute(program, arguments);
            

            and got the same result:

            ("set_network", "0", "psk", "'\"", "12345678", "\"'")
            Selected interface 'wlan0'
            FAIL
            
            
            jsulmJ 1 Reply Last reply
            0
            • M Manta Ray

              @jsulm
              Ok, added

                  arguments.clear();
                  arguments << "set_network" << "0" << "psk" << "'\"" << pwd << "\"'";
                  qDebug() << arguments;
                  wpacli->execute(program, arguments);
              

              and got the same result:

              ("set_network", "0", "psk", "'\"", "12345678", "\"'")
              Selected interface 'wlan0'
              FAIL
              
              
              jsulmJ Offline
              jsulmJ Offline
              jsulm
              Lifetime Qt Champion
              wrote on last edited by
              #7

              @Manta-Ray Please read again what I wrote and compare it to what you did.

              https://forum.qt.io/topic/113070/qt-code-of-conduct

              1 Reply Last reply
              5
              • M Offline
                M Offline
                Manta Ray
                wrote on last edited by
                #8

                Wow!
                It works! Thanks a lot!
                Thanks!
                Thanks!
                Thanks!

                Can you, please, explain me, what's the magic is going here?

                K jsulmJ 2 Replies Last reply
                0
                • M Manta Ray

                  Wow!
                  It works! Thanks a lot!
                  Thanks!
                  Thanks!
                  Thanks!

                  Can you, please, explain me, what's the magic is going here?

                  K Offline
                  K Offline
                  Konstantin Tokarev
                  wrote on last edited by Konstantin Tokarev
                  #9

                  @Manta-Ray You need to pass 4 arguments to wpa_cli:

                  set_network, 0, psk, "12345678"

                  instead you passed 6

                  set_network, 0, psk, ", 12345678, "

                  1 Reply Last reply
                  1
                  • M Manta Ray

                    Wow!
                    It works! Thanks a lot!
                    Thanks!
                    Thanks!
                    Thanks!

                    Can you, please, explain me, what's the magic is going here?

                    jsulmJ Offline
                    jsulmJ Offline
                    jsulm
                    Lifetime Qt Champion
                    wrote on last edited by
                    #10

                    @Manta-Ray No magic. You simply put both " as own parameters:

                    arguments << "set_network" << "0" << "psk" << "'\"" << pwd << "\"'";
                    

                    see here:

                    ("set_network", "0", "psk", "'\"", "12345678", "\"'")
                    

                    Instead you need to put your password as one string with leading and trailing ", like here:

                    arguments << "set_network" << "0" << "psk" << "\"" + pwd + "\"";
                    

                    https://forum.qt.io/topic/113070/qt-code-of-conduct

                    1 Reply Last reply
                    4
                    • M Offline
                      M Offline
                      Manta Ray
                      wrote on last edited by
                      #11

                      Ahaaaa, Thanks you guys a lot!!!!!!
                      I really appreciate you!!!!

                      1 Reply Last reply
                      1
                      • G Offline
                        G Offline
                        Guanhong
                        wrote on last edited by
                        #12

                        @Manta-Ray
                        I met the same issue and it failed.
                        Could you show me your codes or tell me what's wrong with my codes following, thanks

                                    QString strSSID = "12345678"
                                    QString program = "wpa_cli";
                                    QStringList arguments;      
                                    arguments << "-i" << "wlan0" << "set_network" << "0"<< "ssid" << "'\"" << strSSID << "\"'";  
                                    QProcess prcsWlan4;
                                    prcsWlan4.start(program, arguments);
                                    prcsWlan4.waitForFinished(-1);  
                                    QString strResult4 = prcsWlan4.readAllStandardOutput();
                        

                        the result strResult4 is FAIL

                        1 Reply Last reply
                        0
                        • Christian EhrlicherC Online
                          Christian EhrlicherC Online
                          Christian Ehrlicher
                          Lifetime Qt Champion
                          wrote on last edited by
                          #13

                          @Guanhong said in Weird behavior of QProcess and multiple qoutes:

                          << "'"" << strSSID << ""'";

                          Why do you quote this? It's not needed at all - every value in the QStringList is passed as one parameter to your app. That's the reason why you should not use the other call - to avoid useless and wrong quotes.

                          Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                          Visit the Qt Academy at https://academy.qt.io/catalog

                          1 Reply Last reply
                          3
                          • G Offline
                            G Offline
                            Guanhong
                            wrote on last edited by
                            #14

                            @Christian-Ehrlicher
                            thank you for your swift reply

                            actually in my project, strSSID is a variable, it is delivered by other parameters, here I just made it a constant for convenience.

                            I changed
                            arguments << "-i" << "wlan0" << "set_network" << "0"<< "ssid" << "'"" << strSSID << ""'";
                            to
                            arguments << "-i" << "wlan0" << "set_network" << "0"<< "ssid" << "'"" + strSSID + ""'";

                            it still FAILed.
                            could you help me?

                            jsulmJ 1 Reply Last reply
                            0
                            • G Guanhong

                              @Christian-Ehrlicher
                              thank you for your swift reply

                              actually in my project, strSSID is a variable, it is delivered by other parameters, here I just made it a constant for convenience.

                              I changed
                              arguments << "-i" << "wlan0" << "set_network" << "0"<< "ssid" << "'"" << strSSID << ""'";
                              to
                              arguments << "-i" << "wlan0" << "set_network" << "0"<< "ssid" << "'"" + strSSID + ""'";

                              it still FAILed.
                              could you help me?

                              jsulmJ Offline
                              jsulmJ Offline
                              jsulm
                              Lifetime Qt Champion
                              wrote on last edited by
                              #15

                              @Guanhong Please read once more what @Christian-Ehrlicher wrote. Your change is NOT what he wrote...

                              https://forum.qt.io/topic/113070/qt-code-of-conduct

                              1 Reply Last reply
                              1
                              • G Offline
                                G Offline
                                Guanhong
                                wrote on last edited by
                                #16

                                @jsulm thank you.
                                I think quotes are necessary, because there is a single quote outside a double quote.
                                I need to process the following command by QProcess, could you show me how?
                                pa_cli -i wlan0 set_network 1 ssid '"hima24g"'

                                1 Reply Last reply
                                0
                                • Christian EhrlicherC Online
                                  Christian EhrlicherC Online
                                  Christian Ehrlicher
                                  Lifetime Qt Champion
                                  wrote on last edited by Christian Ehrlicher
                                  #17

                                  Again: there is no need to quote an argument when using QProcess::start() with QStringList - they are only needed on the command line so bash/cmd.exe/whatever knows what a single argument is! Your ssid is hima24g and not "hima24g" or 'hima24g' ... or?

                                  Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                                  Visit the Qt Academy at https://academy.qt.io/catalog

                                  1 Reply Last reply
                                  3
                                  • G Offline
                                    G Offline
                                    Guanhong
                                    wrote on last edited by
                                    #18

                                    @Christian-Ehrlicher
                                    Even if there are single quotes and double quotes in the command, is there no need to add quotes? I looked at earlier replies, it seems that quotes are need.

                                    I just removed quotes and changed my codes to
                                    arguments << "-i" << "wlan0" << "set_network" << "0"<< "ssid" << strSSID ;
                                    FAILed too.

                                    jsulmJ 1 Reply Last reply
                                    0
                                    • G Guanhong

                                      @Christian-Ehrlicher
                                      Even if there are single quotes and double quotes in the command, is there no need to add quotes? I looked at earlier replies, it seems that quotes are need.

                                      I just removed quotes and changed my codes to
                                      arguments << "-i" << "wlan0" << "set_network" << "0"<< "ssid" << strSSID ;
                                      FAILed too.

                                      jsulmJ Offline
                                      jsulmJ Offline
                                      jsulm
                                      Lifetime Qt Champion
                                      wrote on last edited by
                                      #19

                                      @Guanhong Then add proper error handling and also read from std error of your process to see whether it prints any errors.

                                      https://forum.qt.io/topic/113070/qt-code-of-conduct

                                      G 1 Reply Last reply
                                      2
                                      • jsulmJ jsulm

                                        @Guanhong Then add proper error handling and also read from std error of your process to see whether it prints any errors.

                                        G Offline
                                        G Offline
                                        Guanhong
                                        wrote on last edited by
                                        #20

                                        @jsulm
                                        QString strResult4 = prcsWlan4.readAllStandardOutput();
                                        strResult4 is FAIL

                                        jsulmJ 1 Reply Last reply
                                        0
                                        • G Guanhong

                                          @jsulm
                                          QString strResult4 = prcsWlan4.readAllStandardOutput();
                                          strResult4 is FAIL

                                          jsulmJ Offline
                                          jsulmJ Offline
                                          jsulm
                                          Lifetime Qt Champion
                                          wrote on last edited by
                                          #21

                                          @Guanhong said in Weird behavior of QProcess and multiple qoutes:

                                          readAllStandardOutput()

                                          I was talking about std ERROR (https://doc.qt.io/qt-5/qprocess.html#readAllStandardError)...

                                          https://forum.qt.io/topic/113070/qt-code-of-conduct

                                          1 Reply Last reply
                                          0

                                          • Login

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups
                                          • Search
                                          • Get Qt Extensions
                                          • Unsolved