用 QProcess 包装 SFTP

Wrap SFTP with 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);

我在插槽中有一个调试语句,但我从来没有看到它,所以信号没有发出。

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

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