Как определить, когда соединение ssh (через QProcess) завершено?

Я запускаю ssh-туннель из приложения, использующего QProcess:

QProcess* process = new QProcess();
process->start("ssh", QStringList()<<"-L"<<"27017:localhost:27017"<<"example.com");

Пока все работает отлично, единственная проблема в том, что у меня нет возможности увидеть, когда порт был фактически создан.

Когда я запускаю команду в оболочке, подключение к удаленному хосту занимает около 10 секунд, после чего перенаправленный порт готов к использованию. Как я могу обнаружить это из моего приложения?

РЕДАКТИРОВАТЬ:

Как предположил vahancho, я использовал тот факт, что после подключения на терминале есть некоторый выход, который можно использовать для обнаружения успешного подключения. Тем не менее, есть линия, которая запускается сразу после запуска Pseudo-terminal will not be allocated because stdin is not a terminalчто, вероятно, даст ложную тревогу. Правильный вывод доступен во втором сигнале, излучаемом чуть позже (что является истинным показателем открытия порта). Чтобы избавиться от первого сообщения, я сейчас запускаю ssh, используя ssh -t -t форсировать распределение stdin.

Итак, остается только один вопрос: может ли кто-нибудь помочь мне, не беспокоясь о таком подходе?

2 ответа

Решение

Итак, остается только один вопрос: может ли кто-нибудь помочь мне, не беспокоясь о таком подходе?

Это не стабильное и надежное решение, к сожалению. Аналогично, это неправильная концепция для обработки выходных данных git, а не для использования реальной библиотеки. Основная проблема заключается в том, что эти программы не имеют никаких гарантий для совместимости вывода, по праву.

Просто представьте, что произойдет, если у них будет неясный текст, опечатка и все такое, незамеченным. Им по своей сути необходимо исправить выход, соответственно, и все приложения, зависящие от вывода, будут внезапно сломаны.

Это также является причиной работы над выделенными библиотеками, предоставляющими доступ к функциональности для повторного использования, а не непосредственно с выходом пользователя. В случае git это означает, например, библиотеку libgit2.

Qt по умолчанию не имеет механизма ssh, как у вас могут быть такие библиотеки в python, например, paramiko.

Я бы предложил установить путь в вашем коде с помощью libssh или же libssh2 как вы также отметили себя в комментарии. Я могу понять неудобство, которое на данный момент не является истинно Qt'ish, но на данный момент Qt не может обеспечить что-либо более надежное без сторонних разработчиков.

При этом было бы неплохо увидеть подобную библиотеку дополнений в Qt Project в будущем, но это может произойти не скоро. Если вы пишете свое программное обеспечение с должным дизайном, вы сможете переключиться на такую ​​библиотеку с нашими основными проблемами, как только кто-то встанет, чтобы поддержать такую ​​дополнительную библиотеку в Qt или где-либо еще.

У меня была такая же проблема, но в моем случае ssh ничего не выводил - поэтому я не мог просто ждать вывода. Я также использую ssh для настройки туннеля, поэтому я использовал QTcpSocket:

program = "ssh";
arguments << m_host << "-N" << "-L" << QString("3306:%1:3306").arg(m_host);
connect(tunnelProcess, &QProcess::started, this, &Database::waitForTunnel);
tunnelProcess->start(program, arguments);

слот waitForTunnel():

QTcpSocket sock;
sock.connectToHost("127.0.0.1", 3306);
if(sock.waitForConnected(100000))
{
     sock.disconnectFromHost();
     openDatabaseConnection();
}
else
    qDebug() << "timeout";

Я надеюсь, что это поможет будущим людям найти этот вопрос;)

Другие вопросы по тегам