2010-05-25 2 views
6

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

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

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

+0

Есть и другие способы получения сеанса оболочки без подключения к сети, чем подключение через SSH. Например, прямо сейчас на моем рабочем столе я использую Konsole в KDE ... Я физически на компьютере, но он отображается как pty, когда я запускаю 'who'. Будет ли это считать консоль или сеанс «ssh» для ваших целей? Возможно, вы должны изменить свой вопрос, чтобы быть более ясным. – rmeador

+0

Я думаю, вы спрашиваете о двух разных вещах ... Фактический вопрос заключается в том, как определить, работаете ли вы в локальном терминале X или через сеанс ssh. «Консоль Linux» обычно означает, что аппаратная консоль доступна с помощью [Ctrl +] Alt + F2 и т. Д. Более поздняя версия может быть обнаружена, если $ TERM == «linux». –

ответ

5

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

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

+5

Это не/dev/console, но/dev/tty [0-9], а сеансы ssh и gnome-terminal отображаются с именами, такими как/dev/pts/[0-9] +. В сочетании с isatty() ваш намек на использование ttyname() отлично подходит для того, что мне нужно делать. –

6

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

3

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

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

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

+0

Черт, developmentalinsanity избили меня до этого;) не должен был так долго писать ... – Darien

4

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

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

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

+1

Хороший улов в источниках проводов! – ivans

Смежные вопросы