7

Я вызываю ssh (OpenSSH) из OSX/Linux-C++- приложения через fork/exec для создания динамической переадресации портов. Это делается с помощью пакетного режима (-o BatchMode = yes) и закрытого ключа, который предоставляется ssh (-i Option). Сам вызов SSH не открывает оболочку (опция -N).

Это мой полный SSH-вызов:

ssh -N -D 9000 -o BatchMode=yes -i /path/to/private-key user@host

Я хотел бы приступить к своему заявлению, как только смогу, и поэтому я должен выяснить, удалось ли ssh создать канал. Сам SSH возвращается только в случае возникновения проблем.

Есть ли возможность, как я могу определить успешную переадресацию портов?

Конечно, я могу подождать, пока SSH не откроет порт, но я ищу более элегантное решение. Другим решением является проверка журнала SSH (-v), ожидающего "Вход в интерактивную сессию", но это звучит не очень переносимо для меня.

2 ответа2

4

Используйте опцию -f и ssh перейдет в фоновый режим (то есть, fork и завершится в родительском процессе), так что вы можете просто waitpid пока исходный ssh завершит работу, и тогда вы узнаете (в зависимости от состояния выхода), что соединение не удалось или переадресация портов уже настроена.

1

Я думаю, что нашел другое (тоже хакерское) решение. При запуске SSH с

ssh -S /some/domain/socket -M ...args... host

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

Интересно, что это может также использоваться, чтобы узнать PID Мастера (см. Ответ R). С помощью

$ ssh -S /some/domain/socket -O check host
Master running (pid=25503)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .