Как определить, когда соединение 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";
Я надеюсь, что это поможет будущим людям найти этот вопрос;)