ttyname ti dirà il nome del terminale connesso a un dato descrittore di file; ad esempio, ttyname(0)
ti dirà il terminale di stdin.
Questo ovviamente fallirà se l'input o l'output viene reindirizzato.
A parte questo, puoi controllare varie variabili d'ambiente (SSH_CONNECTION
, SSH_CLIENT
, REMOTEHOST
, DISPLAY
, SESSIONNAME
). Wireshark ha una logica per rilevare se viene eseguito in remoto in modo da non acquisire il traffico di rete che genera; potresti essere interessato alla logica che la sua funzione get_conn_cfilter usa per implementare questo.
Controllare il valore restituito di ttyname(3) rispetto al tuo stdin dovrebbe darti il nome del terminale che sta alimentando l'input del tuo processo.
Sarà /dev/console se il programma viene eseguito sulla console (e non ha il suo input reindirizzato). Puoi anche controllare stdout per vedere se è connesso a /dev/console - vedi quale si adatta meglio al tuo scenario di utilizzo.
Considererei le variabili d'ambiente come un segno ragionevole di quello che sta succedendo. Non sono sicuro di quale API C vorresti per questo, ma sono sicuro che ne esiste uno.
Ad esempio, sia il file SSH_CLIENT
o SSH_CONNECTION
le variabili di ambiente sono impostate sulla mia macchina indipendentemente dal client SSH utilizzato.
Potrebbe valere la pena verificare quanto siano universali in base al server SSH in esecuzione sulla macchina.
A seconda di quanto sei preoccupato che venga falsificato, un controllo facile sarebbe la presenza/assenza delle variabili d'ambiente SSH_CLIENT e SSH_CONNECTION, nel qual caso vorresti getenv
funzione.