2010-05-25 12 views
6

Ho un'applicazione che deve comportarsi diversamente se eseguita direttamente dalla console di linux. Quindi, se un utente si connette con SSH per eseguire FooBar, o se l'utente accede alla console e accede direttamente per eseguire FooBar, voglio che faccia qualcosa di diverso.Come sapere se è in esecuzione in una console linux rispetto a una sessione ssh?

Quale API C è necessario chiamare per indicare la differenza tra questi due scenari? Stavo pensando che dovrei dare un'occhiata alle informazioni "tty/pts" (come quello che vedo quando eseguo "ps axf"), ma non sono sicuro che sia la soluzione migliore, né quale API chiamare per ottenere quell'informazione

Suggerimenti apprezzati. :)

+0

Esistono altri modi per ottenere una sessione di shell non tty rispetto alla connessione su SSH. Per esempio, adesso sul mio desktop sto usando Konsole in KDE ... Sono fisicamente sul computer, ma si presenta come una pty quando eseguo 'who'. Conta come una console o una sessione "ssh" per i tuoi scopi? Forse dovresti modificare la tua domanda per essere più chiara. – rmeador

+0

Penso che tu stia chiedendo due cose diverse ... la vera domanda sembra essere come dire se stai correndo su un terminale X locale o tramite una sessione ssh. "Console Linux" significa in genere la console hardware a cui si accede con [Ctrl +] Alt + F2 ecc. La successiva può essere rilevata se $ TERM == "linux". –

risposta

5

Controllare il valore di ritorno 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 viene reindirizzato l'input). Puoi anche controllare lo stdout per vedere se è collegato a/dev/console - vedi quale si adatta meglio al tuo scenario d'uso.

+5

Non è/dev/console, ma/dev/tty [0-9], mentre le sessioni ssh e gnome-terminal apparire con nomi come/dev/pts/[0-9] +. Combinato con isatty(), il tuo suggerimento di usare ttyname() funziona alla grande per quello che dovevo fare. –

6

A seconda di quanto si è preoccupati di essere falsificato, un controllo semplice sarebbe per la presenza/assenza delle variabili di ambiente SSH_CLIENT e SSH_CONNECTION, nel qual caso si desidera la funzione getenv.

3

Guarderei le variabili ambientali come un segno ragionevole di ciò che sta accadendo. Non sono sicuro di quale API C vorresti per quello, ma sono sicuro che ne esiste uno.

Ad esempio, entrambe le variabili di ambiente SSH_CLIENT o SSH_CONNECTION sono impostate sulla mia macchina indipendentemente dal client SSH utilizzato.

Può valere la pena controllare come questi universali siano basati sul server SSH in esecuzione sulla macchina.

+0

Dannazione, l'amicizia di sviluppo mi ha battuto;) non avrebbe dovuto impiegare così tanto tempo a scrivere ... – Darien

4

ttyname indica il nome del terminale connesso a un determinato descrittore di file; ad esempio, ttyname(0) indicherà il terminale di stdin.

Questo naturalmente fallirà se l'input o l'output vengono reindirizzati.

A parte ciò, è possibile controllare diverse variabili d'ambiente (SSH_CONNECTION, SSH_CLIENT, REMOTEHOST, DISPLAY, SESSIONNAME). Wireshark ha la logica per rilevare se viene eseguito in remoto in modo che non acquisisca il traffico di rete che genera; potresti essere interessato alla logica che usa la sua funzione get_conn_cfilter per implementarla.

+1

Bella presa nelle fonti di cavi! – ivans

Problemi correlati