ttyname vám řekne jméno terminálu připojeného k danému deskriptoru souboru; například ttyname(0)
vám sdělí terminál stdin.
To samozřejmě selže, pokud je přesměrován vstup nebo výstup.
Kromě toho můžete zkontrolovat různé proměnné prostředí (SSH_CONNECTION
, SSH_CLIENT
, REMOTEHOST
, DISPLAY
, SESSIONNAME
). Wireshark má logiku, aby zjistil, zda je spuštěn vzdáleně, takže nezachycuje síťový provoz, který generuje; možná vás bude zajímat logika, kterou jeho funkce get_conn_cfilter používá k implementaci.
Kontrola návratové hodnoty ttyname(3) proti vašemu stdin by vám měla poskytnout jméno terminálu, který přivádí vstup vašeho procesu.
Bude to /dev/console, pokud je program spuštěn na konzole (a nemá přesměrován vstup). Můžete také zkontrolovat stdout a zjistit, zda je připojen k /dev/console – podívejte se, který scénář lépe vyhovuje vašemu scénáři použití.
Díval bych se na proměnné prostředí jako na rozumné znamení toho, co se děje. Nejsem si jistý, jaké C API byste pro to chtěli, ale jsem si jistý, že nějaké existuje.
Například SSH_CLIENT
nebo SSH_CONNECTION
proměnné prostředí jsou na mém počítači nastaveny bez ohledu na používaného klienta SSH.
Možná by stálo za to zkontrolovat, jak univerzální jsou tyto založeny na serveru SSH běžícím na počítači.
V závislosti na tom, jak moc se obáváte, že bude falešný, bude snadná kontrola přítomnosti/nepřítomnosti proměnných prostředí SSH_CLIENT a SSH_CONNECTION, v takovém případě budete chtít getenv
funkce.