Как определить, работает ли консоль linux по сравнению с сессией ssh? - PullRequest
7 голосов
/ 25 мая 2010

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

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

Подсказки приветствуются. :)

Ответы [ 5 ]

6 голосов
/ 26 мая 2010

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

5 голосов
/ 26 мая 2010

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

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

4 голосов
/ 26 мая 2010

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

Это, конечно, завершится ошибкой, если ввод или вывод будут перенаправлены.

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

3 голосов
/ 26 мая 2010

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

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

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

0 голосов
/ 30 января 2019

некрасиво, но работает:

// don't force scripts to pause!
if (_isatty(_fileno(stdout)))
{
    _tprintf(_T("\nPress enter to continue..."));
    _gettc(stdin);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...