Как сказать при выполнении в консоли Linux по сравнению с ssh сессией?

У меня есть приложение, которое должно вести себя по-другому, если выполнено непосредственно от консоли Linux. Таким образом, если пользователь соединяется с SSH для выполнения FooBar или пользовательских обходов к консоли и входит в систему непосредственно для выполнения FooBar, я хочу, чтобы это сделало что-то другое.

Что API C я должен назвать для сообщения различия между этими двумя сценариями? Я думал, что должен буду посмотреть на "tty/pts" информацию (такой как, что я вижу, когда я выполняю "PS axf"), но я не уверен - ли это лучшее решение, ни что API звонить для получения той информации.

Подсказки ценятся.:)

8
задан Stéphane 25 May 2010 в 19:55
поделиться

4 ответа

Проверка возвращаемого значения ttyname (3) по вашему стандартному вводу должна дать вам имя терминала, который обрабатывает входные данные вашего процесса.

Это будет / dev / console, если программа запускается на консоли (без перенаправления ввода). Вы также можете проверить stdout, чтобы узнать, подключен ли он к / dev / console - посмотрите, какой из них лучше подходит для вашего сценария использования.

5
ответ дан 5 December 2019 в 08:50
поделиться

ttyname сообщит вам имя терминала, подключенного к данному файловому дескриптору; например, ttyname(0) сообщит вам терминал stdin.

Это, конечно, не сработает, если ввод или вывод перенаправлен.

Кроме того, вы можете проверить различные переменные окружения (SSH_CONNECTION, SSH_CLIENT, REMOTEHOST, DISPLAY, SESSIONNAME). Wireshark имеет логику для обнаружения удаленного запуска, чтобы не перехватывать генерируемый им сетевой трафик; вас может заинтересовать логика, которую использует его функция get_conn_cfilter для реализации этого.

4
ответ дан 5 December 2019 в 08:50
поделиться

Я бы посмотрел на переменные окружения как на разумный признак того, что происходит. Я не уверен, какой C API вам нужен для этого, но я уверен, что такой существует.

Например, обе переменные окружения SSH_CLIENT или SSH_CONNECTION установлены на моей машине независимо от используемого клиента SSH.

Возможно, стоит проверить, насколько они универсальны в зависимости от сервера SSH, запущенного на машине.

3
ответ дан 5 December 2019 в 08:50
поделиться

В зависимости от того, насколько вас беспокоит его подделка, простой проверкой будет наличие / отсутствие переменных среды SSH_CLIENT и SSH_CONNECTION, и в этом случае вам понадобится getenv функция.

7
ответ дан 5 December 2019 в 08:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: