【问题标题】:Using QProcess for CLI使用 QProcess 进行 CLI
【发布时间】:2014-01-14 07:39:50
【问题描述】:

如何将 QProcess 用于命令行交互式参数,我正在尝试传输文件 usimg scp 提示输入密码

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

在此之后,命令行询问 Password 如何使用 QProcess 来满足它,我是否可以通过在我的参数中仅针对 scp 提供一些选项来克服它,或者我的插槽 readOutput 中的代码应该是什么,它将密码抛出到命令行.任何的意见都将会有帮助。谢谢

【问题讨论】:

  • 将用户名/密码作为参数传递给 scp
  • @LaszloPapp 对。所以他需要选择另一个程序来复制
  • 我不会乱用密码,而是使用基于密钥的身份验证。
  • @BЈовић:啊,嗯。 pscp 也是一个 sftp 客户端,与 scp 不同,它确实具有用户名和密码选项。
  • @LaszloPapp ...我正在使用 bash 一些细节会有所帮助....谢谢

标签: c++ qt qprocess qtcore pscp


【解决方案1】:

好像scp没有这样的选项,但是pscp(sftp客户端有)。所以,我会写这样的东西来扩展你的初始参数,基于following man page

QString program = "c:/temp/pscp.exe";
QStringList arguments;
arguments << "-pw" << "password" << "C:/Users/polaris8/Desktop/Test1GB.zip" << "Mrigendra@192.168.26.142:/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")

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

【讨论】:

  • 订购很重要,因为您所说的顺序提示输入密码,甚至 QProcess 失败..arguments
  • 正确的顺序是参数
  • @user3110438:另外,根据我关于 QStandardPaths 的回答和提示,请不要在代码中使用硬编码路径。
  • 将继续关注 QStandardPaths..感谢您指出...Laszlo 有没有办法摆脱用户名和密码,只需使用 pscp 使用密钥?
  • @user3110438: dafis.ucdavis.edu/install/sftp/PuttyPSCPKey.cfm 有帮助吗?
【解决方案2】:

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

-l user
-pw passwd

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

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

【讨论】:

  • Fwiw,QProcess 文档更喜欢QStringList arguments; arguments &lt;&lt; "-style" &lt;&lt; "fusion"; 样式。我认为,在 Qt 世界中,“-pw Password”是两个参数而不是一个参数。至少在术语和逻辑上,但您的代码可能有效。
  • @ThorKhan ,谢谢,但它不能与 QProcess 一起使用,但在 Windows 命令提示符中运行良好......
  • @user3110438:我提到了原因。您需要根据我的回答将“-pw 密码”拆分为单独的参数。
  • 严格来说还是有提升空间的,因为没有StringList这样的类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2016-12-10
  • 2021-12-31
  • 2021-07-27
相关资源
最近更新 更多