用 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 机制。
我想尝试使用 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 机制。