我试图在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
,对于其他命令,如ls
或pwd
(linux bash ls / pwd,而不是ftp ls / pwd),它可以工作。
答案 0 :(得分:0)
sftp不使用curses,你无法读取提示,因为它没有使用stdout作为密码,它打开“/ dev / tty”,其中strace显示为文件描述符5.同样的fd用于读取密码。
答案 1 :(得分:0)
使用“-b - ”命令行选项运行sftp。这使其进入批处理模式。在批处理模式下,它从指定文件中读取命令(如果使用“ - ”则从stdin读取)并将输出写入stdout。
但是,根据手册页,您必须使用非交互式身份验证方法。此外,在批处理模式下,stdout将不会出现提示。