Solved Weird behavior of QProcess and multiple qoutes
-
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? -
Use
QProcess::execute
overload with QStringList arguments -
Hi
In other words, do not append to one stringString 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 -
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?
-
@Manta-Ray
Then just doarguments << "set_network" << "0" << "psk" << "\"" + pwd + "\"";
-
@jsulm
Ok, addedarguments.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
-
@Manta-Ray Please read again what I wrote and compare it to what you did.
-
Wow!
It works! Thanks a lot!
Thanks!
Thanks!
Thanks!Can you, please, explain me, what's the magic is going here?
-
@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, "
-
@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 + "\"";
-
Ahaaaa, Thanks you guys a lot!!!!!!
I really appreciate you!!!! -
@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, thanksQString 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
-
@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.
-
@Christian-Ehrlicher
thank you for your swift replyactually 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? -
@Guanhong Please read once more what @Christian-Ehrlicher wrote. Your change is NOT what he wrote...
-
@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"' -
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? -
@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. -
@Guanhong Then add proper error handling and also read from std error of your process to see whether it prints any errors.
-
@jsulm
QString strResult4 = prcsWlan4.readAllStandardOutput();
strResult4 is FAIL