用QProcess包装SFTP

时间:2019-08-01 11:35:29

标签: c++ qt qprocess

我想尝试使用QProcess在我的代码中在Linux系统上启动sftp:

    QProcess* pProc = new QProcess(this);
    QString strHost = clsMainWnd::strGetHostName()
           ,strPort = clsMainWnd::strGetPort()
           ,strUsername = clsMainWnd::strGetUsername();
    QStringList slstCmdArgs;
    slstCmdArgs << (strUsername + QString("@") + strHost)
                << (QString("-P") + strPort);
    pProc->start("sftp", slstCmdArgs);
    while( pProc->waitForStarted() != true ) {
    }
    QByteArray bytaryIn = pProc->readAllStandardOutput();
    qDebug() << bytaryIn;

我想做的是等待“ Password:”提示,然后输入密码,但是bytaryIn始终为空。

我已验证命令行参数的格式正确,并输出到控制台。

然后我在终端中使用了它们进行测试,它们可以按预期工作。

该命令的格式为:

    sftp User@HostName -P22

[编辑]我已将此代码重写为以下内容:

    QString strHost = clsMainWnd::strGetHostName()
           ,strPort = clsMainWnd::strGetPort()
           ,strUsername = clsMainWnd::strGetUsername();
    QStringList slstCmdArgs;
    slstCmdArgs << (strUsername + QString("@") + strHost)
                << (QString("-P") + strPort);
    mpSFTP = new QProcess(this);
    connect(mpSFTP, SIGNAL(readyReadStandardOutput())
           ,this, SLOT(readSFTPoutput()));
    mpSFTP->start("sftp", slstCmdArgs);

我在插槽中有一条调试语句,但我从未看到过,因此不会发出信号。

1 个答案:

答案 0 :(得分:1)

快速测试表明sftp直接访问终端以询问密码。您将必须使用wrapper script输入您的密码。

另一种方法是创建一个伪tty对,并使用该对输入密码,但是您将无法使用任何QProcess机制。