2010-05-25 17 views
6

Tengo una aplicación que necesita comportarse de manera diferente si se ejecuta directamente desde la consola de Linux. Entonces, si un usuario se conecta con SSH para ejecutar FooBar, o el usuario se acerca a la consola e inicia sesión directamente para ejecutar FooBar, quiero que haga algo diferente.¿Cómo saber si se ejecuta en una consola de linux frente a una sesión de ssh?

¿Qué API C debo llamar para saber la diferencia entre estos dos escenarios? Estaba pensando que tendría que mirar la información "tty/pts" (como la que veo cuando ejecuto "ps axf"), pero no estoy seguro si esa es la mejor solución, ni qué API llamar para obtener esa información.

Consejos apreciados. :)

+0

hay otras formas de obtener una sesión de shell no tty que conectando a través de SSH. Por ejemplo, ahora mismo en mi escritorio estoy usando Konsole dentro de KDE ... estoy físicamente en la computadora, pero aparece como pty cuando ejecuto 'who'. ¿Esto contaría como una sesión de consola o "ssh" para sus propósitos? Quizás debas editar tu pregunta para que sea más clara. – rmeador

+0

Creo que estás preguntando sobre dos cosas diferentes ... la pregunta real parece ser cómo saber si estás corriendo en una terminal X local o mediante una sesión ssh. "Consola Linux" normalmente significa la consola de hardware a la que se accede con [Ctrl +] Alt + F2, etc. La última se puede detectar si $ TERM == "linux". –

Respuesta

5

Verificar el valor de retorno de ttyname (3) contra su stdin debe darle el nombre del terminal que está alimentando la entrada de su proceso.

Será/dev/console si el programa se está ejecutando en la consola (y no tiene su entrada redirigida). También puede verificar stdout para ver si está conectado a/dev/console - vea cuál se ajusta mejor a su escenario de uso.

+5

No es/dev/console, pero/dev/tty [0-9], mientras que las sesiones ssh y gnome-terminal aparecen con nombres como/dev/pts/[0-9] +. Combinado con isatty(), tu sugerencia para usar ttyname() funciona muy bien para lo que necesitaba hacer. –

6

Dependiendo de lo mucho que te preocupe que se falsifique, una comprobación fácil sería la presencia/ausencia de las variables de entorno SSH_CLIENTE y SSH_CONEXIÓN, en cuyo caso querrías la función getenv.

3

Me gustaría ver las variables de entorno como un signo razonable de lo que está sucediendo. No estoy seguro de qué API C querrías para eso, pero estoy seguro de que existe.

Por ejemplo, las variables de entorno SSH_CLIENT o se configuran en mi máquina independientemente del cliente SSH que se esté utilizando.

Puede valer la pena verificar cuán universales se basan en el servidor SSH que se ejecuta en la máquina.

+0

Maldita sea, la agilidad del desarrollo me ganó;) no debería haber tomado tanto tiempo escribiendo ... – Darien

4

ttyname le dirá el nombre del terminal conectado a un descriptor de archivo dado; por ejemplo, ttyname(0) le dirá la terminal de stdin.

Esto, por supuesto, fallará si se redirige la entrada o la salida.

Aparte de eso, se puede comprobar varias variables de entorno (SSH_CONNECTION, SSH_CLIENT, REMOTEHOST, DISPLAY, SESSIONNAME). Wireshark tiene lógica para detectar si se está ejecutando de forma remota para que no capture el tráfico de red que genera; puede interesarle la lógica que su función get_conn_cfilter usa para implementar esto.

+1

¡Buena captura en las fuentes de wireshark! – ivans

Cuestiones relacionadas