2

Linux で sftp コマンドからの出力を読み取ろうとしています。QProcess を使用して Qt アプリケーションから sftp を呼び出します。しかし、プロセスからの stdout である必要がある read() メソッドからデータを取得しません。プロセスを開始する前にスロットをreadyReadシグナルに接続したので、プロセスからの出力を見逃すことはありません。

PuTTY の psftp を使用する Windows 上の同じアプリケーションは正常に動作し、必要なすべてのデータを取得できます。Linuxでも同じことが必要です。

プロセス ( sftp user@host) を開始した後、端末の sftp からパスワード プロンプトを取得しますが、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;
};

この問題は にのみ存在し、 orsftpのような他のコマンド(ftp ls/pwd ではなく Linux bash ls/pwd) では機能します。lspwd

4

2 に答える 2

0

sftp は curses を使用しません。パスワードに stdout を使用しないため、プロンプトを読み取ることができません。strace がファイル記述子 5 であると表示する「/dev/tty」を開きます。パスワードの読み取りには同じ fd が使用されます。

于 2013-11-14T13:19:27.610 に答える
0

「-b -」コマンド ライン オプションを指定して sftp を実行します。これにより、バッチ モードになります。バッチ モードでは、指定されたファイル (または "-" を使用する場合は stdin) からコマンドを読み取り、出力を stdout に書き込みます。

ただし、man ページによると、非対話型の認証方法を使用する必要があります。また、バッチ モードでは stdout にプロンプ​​トが表示されません。

于 2013-11-14T20:12:05.170 に答える