关于 c :Wrap SFTP with QProcess

Wrap SFTP with QProcess

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

1
2
3
4
5
6
7
8
9
10
11
12
    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总是空的。

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

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

命令将被格式化为:

1
    sftp User@HostName -P22

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

1
2
3
4
5
6
7
8
9
10
    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直接访问终端询问密码。您必须使用为您输入密码的package脚本。

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