QProcess -> 在 Linux 上从 sftp 读取标准输出

Posted

技术标签:

【中文标题】QProcess -> 在 Linux 上从 sftp 读取标准输出【英文标题】:QProcess -> read stdout from sftp on Linux 【发布时间】:2013-11-12 17:29:28 【问题描述】:

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

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

启动进程 (sftp user@host) 后,我在终端上从 sftp 收到密码提示,但在标准输出中没有。根据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)它可以工作。

【问题讨论】:

您能否显示您已连接到readyRead 的插槽的代码。您是否尝试过使用readAll() 而不是read() 【参考方案1】:

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

【讨论】:

有没有办法强制 sftp 使用标准输出? ncurses 只是一个猜测,因为 ldd 显示了对 libncurses.so 的依赖关系 我可以对该文件描述符执行 fdopen(),但这是一个糟糕的解决方法,我认为没有解决方案 我认为这行不通。如果你打开 fd 5,它只会打开 fd 6【参考方案2】:

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

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

【讨论】:

以上是关于QProcess -> 在 Linux 上从 sftp 读取标准输出的主要内容,如果未能解决你的问题,请参考以下文章

如何确定在 Linux 上使用 Qt4 终止 QProcess 的信号?

使用 qprocess 在 linux 中运行外部应用程序

如何在 Linux unsing QProcess 下执行 shell 命令?

Qt使用QProcess进程间双向通信(linux和win系统)

linux下QT中如何使用QProcess运行linux命令。

如何使用 QProcess 运行 vim 终端