Qt5 QProcess 处理带有“特殊”字符的参数

Posted

技术标签:

【中文标题】Qt5 QProcess 处理带有“特殊”字符的参数【英文标题】:Qt5 QProcess handling arguments with "special" characters 【发布时间】:2018-03-07 23:50:25 【问题描述】:

我正在维护一个Qt5 程序,它使用QProcessLinux 上执行ncftpget

我正在尝试执行的命令是:

ncftpget -E -Z -u username -p 'a#$b1379' 1.1.1.1 /x/y/temp/ update/file

这只是将文件从服务器传输到本地目录。如果我在 bash 命令行上执行上述命令,它可以正常工作。

但是,当我的Qt5 应用程序使用QProcess 执行相同的命令时,ftp 服务器回复说用户名/密码不正确。当密码不包含任何“特殊”字符时,它可以正常工作。

正如S.M. 所述,QProcess 没有在 shell 中执行命令。所以我假设fork()exec() 调用的某个版本。 如何让QProcess 在这里做正确的事情?

我假设问题与密码中的特殊字符有关。当我构建我的QProcess 参数列表时,我特别确保密码被' 包围,以便特殊字符被转义。

代码sn-p:

processFTP.setParent(this->parent());
processFTP.setProcessChannelMode(QProcess::MergedChannels);

// ncftpArgs is a QStringList
// snippet doesn't show complete argument list

ncftpArgs->push_back("-Z");
ncftpArgs->push_back("-u");//username
ncftpArgs->push_back(QString((*phashSettings)[FTPUSERNAME]));
ncftpArgs->push_back("-p");//pw
// password can have special characters when shell executes command.
QString password((*phashSettings)[FTPPASSWORD]);
password.prepend("'");
password.append("'");
ncftpArgs->push_back(password);

ncftpArgs->push_back(QString((*phashSettings)[FTPSERVERIP]));
ncftpArgs->push_back(QString((*phashSettings)[FTPTEMPDIR]));

//beging the ncftpget session
QString sExe = "ncftpget";  //process name

// processFTP is a QProcess object
processFTP.start(sExe, (*ncftpArgs));
bSuccess = processFTP.waitForStarted();

// .... more code to monitor process etc...

代码记录了将传递给processFTP 的命令和参数,一切看起来都正确。

如何正确设置参数并启动QProcess 对象,以便将包含特殊字符的密码参数正确传递给可执行文件ncftpget

和/或我该如何调试问题?

【问题讨论】:

为什么投反对票? 【参考方案1】:

当我构建我的 QProcess 参数列表时,我特别确保密码被 ' 包围,以便特殊字符被转义。

请勿在密码前添加或添加',删除这些行

password.prepend("'");
password.append("'");

QProcess::start 负责程序参数传递的正确方式。此外,您的代码中的此调用不会运行 bash 解释器。

【讨论】:

如果我保持密码参数不变,但它不起作用。我得到相同的结果 - 因为密码错误而无法登录到 ftp 服务器。如果没有调用 bash shell,那么我假设 QProcess 会执行某种 exec() 调用? 是的,它确实 fork() 和 execve()。 谢谢 S.M.那么我该怎么做才能让execve() 将带有“特殊字符”的参数传递给可执行文件? 不解释特殊字符,按原样传递。如果您的 Qt 是使用 QPROCESS_DEBUG 构建的,请尝试启用调试日志。 为什么不用QFtp类?

以上是关于Qt5 QProcess 处理带有“特殊”字符的参数的主要内容,如果未能解决你的问题,请参考以下文章

带重音符号的 QProcess 输入字符串

使用 lambda 函数了解 QProcess 信号的行为

使用带有特殊字符的批处理回显

如何在批处理文件中获取带有特殊字符的子字符串?

python3 插入 mysql 时内容带有特殊字符处理

Hibernate 和 Spring Data JPA 无法处理带有特殊字符的 Oracle 表名?