2010-05-25 5 views
6

J'ai une application qui doit se comporter différemment si elle est exécutée directement à partir de la console Linux. Donc, si un utilisateur se connecte avec SSH pour exécuter FooBar, ou si l'utilisateur se dirige vers la console et se connecte directement pour exécuter FooBar, je veux qu'il fasse quelque chose de différent.Comment savoir si vous utilisez une console Linux par rapport à une session SSH?

Quelle API C dois-je appeler pour faire la différence entre ces deux scénarios? Je pensais que je devrais regarder les informations "tty/pts" (comme ce que je vois quand je lance "ps axf"), mais je ne suis pas certain si c'est la meilleure solution, ni quelle API appeler pour obtenir cette information.

Conseils appréciés. :)

+0

Il existe d'autres moyens d'obtenir une session shell non tty que de se connecter via SSH. Par exemple, maintenant sur mon bureau, j'utilise Konsole dans KDE ... Je suis physiquement sur l'ordinateur, mais il apparaît comme un pty quand je lance 'who'. Est-ce que cela compterait comme une console ou une session "ssh" pour vos buts? Peut-être devriez-vous modifier votre question pour être plus clair. – rmeador

+0

Je pense que vous posez deux questions différentes ... la vraie question semble être de savoir si vous utilisez un terminal X local ou via une session SSH. "Console Linux" signifie généralement la console matérielle accessible avec [Ctrl +] Alt + F2 etc. Ce dernier peut être détecté si $ TERM == "linux". –

Répondre

5

La vérification de la valeur de retour de ttyname (3) par rapport à votre stdin devrait vous donner le nom du terminal qui alimente l'entrée de votre processus.

Ce sera/dev/console si le programme est exécuté sur la console (et que son entrée n'est pas redirigée). Vous pouvez également vérifier stdout pour voir si elle est connectée à/dev/console - voir qui correspond le mieux à votre scénario d'utilisation.

+5

Ce n'est pas/dev/console, mais/dev/tty [0-9], alors que les sessions ssh et gnome-terminal apparaît avec des noms comme/dev/pts/[0-9] +. Combiné avec isatty(), votre indice pour utiliser ttyname() fonctionne très bien pour ce que je devais faire. –

6

Selon la quantité de données que vous craignez d'être usurpées, la présence/l'absence des variables d'environnement SSH_CLIENT et SSH_CONNECTION pourrait être facilement vérifiée, auquel cas vous voudriez utiliser la fonction getenv.

3

Je considérerais les variables d'environnement comme un signe raisonnable de ce qui se passe. Je ne suis pas sûr de ce que l'API C que vous voulez pour cela, mais je suis sûr qu'il existe.

Par exemple, les variables d'environnement SSH_CLIENT ou SSH_CONNECTION sont définies sur ma machine, quel que soit le client SSH utilisé.

Il peut être utile de vérifier si ces fonctions sont universelles en fonction du serveur SSH exécuté sur la machine.

+0

Putain, l'esprit de développement me bat dessus;) n'aurait pas dû prendre autant de temps à écrire ... – Darien

4

ttyname vous dira le nom du terminal connecté à un descripteur de fichier donné; Par exemple, ttyname(0) vous dira le terminal de stdin.

Cela échouera bien sûr si l'entrée ou la sortie est redirigée.

Sauf que, vous pouvez vérifier diverses variables d'environnement (SSH_CONNECTION, SSH_CLIENT, REMOTEHOST, DISPLAY, SESSIONNAME). Wireshark a une logique pour détecter si elle est exécutée à distance afin qu'elle ne capture pas le trafic réseau qu'elle génère; vous pourriez être intéressé par la logique que sa fonction get_conn_cfilter utilise pour l'implémenter.

+1

Belle prise dans les sources wireshark! – ivans

Questions connexes