如何使用 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 的代码应该是什么。任何建议都会有帮助。谢谢
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")
话虽如此,您将来可能希望考虑使用密钥而不是密码。这样会更安全一点,也方便你的应用。
我认为您可以将用户名/密码作为选项传递:
-l user
-pw passwd
所以你的论点应该是这样的:
QStringList arguments;
arguments << "-l" << "Mrigendra" << "-pw" << "Password" <<
"C:/Users/polaris8/Desktop/Test1GB.zip" <<
"192.168.26.142:/home/";
我可能来得太晚了,但我最近遇到了类似的问题,并为基于 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
信号。