QProcess - >在Linux上从sftp读取stdout

时间:2013-11-12 17:29:28

标签: c++ linux qt ncurses qprocess

我试图在Linux上读取sftp命令的输出。我用QProcess从Qt应用程序调用sftp。但我没有从read()方法获取任何数据,这应该是进程中的stdout。在开始此过程之前,我将一个插槽连接到readyRead信号,因此我不会错过该过程的任何输出。

使用PuTTY的psftp在Windows上使用相同的应用程序,工作正常,我得到了我需要的所有数据。我想在Linux上也一样。

在我启动Process(sftp user@host)之后,我从终端上的sftp获得了密码promt,但是没有在stdout中获得。根据ldd,sftp使用libncurses,我认为这是问题所在。有没有办法在不使用ncurses的情况下将sftp的所有输出重定向到stdout?

示例代码:

#include <QObject>
#include <QProcess>

class MyClass : public QObject {
Q_OBJECT
public:
   MyClass(QObject *parent = 0) : QObject(parent) {
      connect(&prc, SIGNAL(readyRead()), this, SLOT(read()));
      prc.start("sftp user@host"); // valid user and host in the actual project
   }

public slots:
  void read() {
     qDebug("bytes to read: %d", (int)prc.bytesAvailable());

     QString data = prc.readAll();
     qDebug("readAll: %s", qPrintable(data));

     data = prc.readAllStandardOutput();
     qDebug("readAllStandardOutput: %s", qPrintable(data));

     data = prc.readAllStandardError();
     qDebug("readAllStandardError: %s", qPrintable(data));
  }

protected:
  QProcess prc;
};

问题仅存在于sftp,对于其他命令,如lspwd(linux bash ls / pwd,而不是ftp ls / pwd),它可以工作。

2 个答案:

答案 0 :(得分:0)

sftp不使用curses,你无法读取提示,因为它没有使用stdout作为密码,它打开“/ dev / tty”,其中strace显示为文件描述符5.同样的fd用于读取密码。

答案 1 :(得分:0)

使用“-b - ”命令行选项运行sftp。这使其进入批处理模式。在批处理模式下,它从指定文件中读取命令(如果使用“ - ”则从stdin读取)并将输出写入stdout。

但是,根据手册页,您必须使用非交互式身份验证方法。此外,在批处理模式下,stdout将不会出现提示。