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.4k 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 Offline
    M Offline
    Manta Ray
    wrote on last edited by
    #1

    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 1 Reply Last reply
    0
    • 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 Offline
                            Christian EhrlicherC Offline
                            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 Offline
                                    Christian EhrlicherC Offline
                                    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

                                          • Login

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