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
,对于其他命令,如ls
或pwd
(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 的信号?
如何在 Linux unsing QProcess 下执行 shell 命令?
Qt使用QProcess进程间双向通信(linux和win系统)