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 机制。
- 我正在编写的代码背后的想法是通过执行与链接中的脚本相同的操作来自动化登录,但使用 QProcess 并管理数据而不是使用期望。
- 然后,您需要说服 QProcess 在伪 tty 中运行 sftp,根据 API,这是不可能的。如果您的应用程序与 GPL 兼容,请查看 KPty。
- 或者,直接使用 libssh2 并跳过所有人机界面的东西。
- 我会这样做,但由于问题,这就是我走这条路的原因。
- 哪种方法有问题?我希望我已经让你相信,在没有任何package脚本或伪 TTY 的情况下使用 QProcess 是一条死胡同。
- 像 KPtyProcess 一样:子类 QProcess。在初始化时,用 openpty 构造一个 pty。然后覆盖 setupChildProcess 并使用从文件描述符调用 login_tty。最后将您的 QProcess 与主文件描述符相关联。如果这听起来太多,请注意 KPty 显然是 LGPL,所以我认为您可以将其用作动态库,即使在商业产品中也是如此。
- 谢谢,我试试看。
来源:https://www.codenong.com/57308129/