使用 QProcess 进行 CLI

问题描述 投票:0回答:3

如何使用 QProcess 进行命令行交互参数,我正在尝试使用提示输入密码的 img scp 传输文件

QString program = "c:/temp/pscp.exe";
QStringList arguments;
arguments << "C:/Users/polaris8/Desktop/Test1GB.zip" <<   "[email protected]:/home/";
QPointer<QProcess> myProcess;
myProcess = new QProcess;
connect(myProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(readOutput()));
myProcess->start(program , arguments);

在此之后,commnad Line 询问密码如何使用 QProcess 来满足它,我可以通过在参数中仅提供 scp 的一些选项来克服它,或者我的槽 readOutput 中将密码抛出到 Command Line 的代码应该是什么。任何建议都会有帮助。谢谢

c++ qt qprocess qtcore pscp
3个回答
1
投票

scp好像没有这样的选项,但是pscp(sftp客户端有)。因此,我将编写类似的内容,以基于以下手册页

使用该选项来扩展您的初始参数
QString program = "c:/temp/pscp.exe";
QStringList arguments;
arguments << "-pw" << "password" << "C:/Users/polaris8/Desktop/Test1GB.zip" << "[email protected]:/home/";
             ^^^^^^^^^^^^^^^^^^^
QPointer<QProcess> myProcess;
myProcess = new QProcess;
connect(myProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(readOutput()));
myProcess->start(program , arguments);

另外,我鼓励您使用 QStandardPaths 作为像您这样的路径。详细信息请参阅文档:

QStandardPaths::DesktopLocation 0   Returns the user's desktop directory.

所以,你最终可以替换这个字符串:

"C:/Users/polaris8/Desktop/Test1GB.zip"

具有以下内容:

QStandardPaths::locate(QStandardPaths::DesktopLocation, "Test1GB.zip")

话虽如此,您将来可能希望考虑使用密钥而不是密码。这样会更安全一点,也方便你的应用。


0
投票

我认为您可以将用户名/密码作为选项传递:

-l user
-pw passwd

所以你的论点应该是这样的:

QStringList arguments;
arguments << "-l" << "Mrigendra" << "-pw" << "Password" <<
             "C:/Users/polaris8/Desktop/Test1GB.zip" <<
             "192.168.26.142:/home/";

0
投票

我可能来得太晚了,但我最近遇到了类似的问题,并为基于 X11 的系统找到了一个简单的解决方案。 来自 ssh 文档:

SSH_ASKPASS

如果 ssh 需要密码,它会从 当前终端(如果是从终端运行的话)。如果 ssh 没有 与其关联的终端,但设置了 DISPLAY 和 SSH_ASKPASS,它 将执行SSH_ASKPASS指定的程序并打开一个X11 窗口读取密码。 [...]

如果您设置了这些环境变量,您可以使用

scp
在分离模式下启动
QProcess::startDetached()
进程,即使您从命令行启动 Qt 应用程序,也会为您提供基于 X11 的密码对话框。缺点是使用
startDetached
您无法连接到
QProcess::finished
信号或获得任何反馈。

或者,如果您需要了解

scp
进程的退出状态,可以直接将
setsid -w scp [...]
QProcess::start()
一起使用,以等待进程完成并连接到
finished
信号。

© www.soinside.com 2019 - 2024. All rights reserved.