ttyname vous indiquera le nom du terminal connecté à un descripteur de fichier donné ; par exemple, ttyname(0)
vous indiquera le terminal de stdin.
Cela échouera bien sûr si l'entrée ou la sortie est redirigée.
Sauf cela, vous pouvez vérifier diverses variables d'environnement (SSH_CONNECTION
, SSH_CLIENT
, REMOTEHOST
, DISPLAY
, SESSIONNAME
). Wireshark a une logique pour détecter s'il est exécuté à distance afin qu'il ne capture pas le trafic réseau qu'il génère; vous pourriez être intéressé par la logique que sa fonction get_conn_cfilter utilise pour implémenter ceci.
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 n'a pas son entrée redirigée). Vous pouvez également vérifier stdout pour voir s'il est connecté à /dev/console - voir ce qui correspond le mieux à votre scénario d'utilisation.
Je considérerais les variables d'environnement comme un signe raisonnable de ce qui se passe. Je ne sais pas quelle API C vous voudriez pour cela, mais je suis sûr qu'il en existe une.
Par exemple, à la fois le SSH_CLIENT
ou SSH_CONNECTION
les variables d'environnement sont définies sur ma machine quel que soit le client SSH utilisé.
Il peut être utile de vérifier à quel point ceux-ci sont universels en fonction du serveur SSH exécuté sur la machine.
En fonction de votre inquiétude quant à l'usurpation d'identité, une vérification simple consisterait à vérifier la présence/l'absence des variables d'environnement SSH_CLIENT et SSH_CONNECTION, auquel cas vous voudriez le getenv
fonction.