Cómo saber si se está ejecutando en una consola de Linux frente a una sesión SSH?

StackOverflow https://stackoverflow.com/questions/2908044

  •  04-10-2019
  •  | 
  •  

Pregunta

Tengo una aplicación que necesita comportarse de manera diferente si se ejecuta directamente desde la consola de Linux. Así que si un usuario se conecta con SSH para ejecutar FooBar, o el usuario se acerca a la consola y los registros directamente a ejecutar FooBar, yo quiero que haga algo diferente.

¿Qué API C necesito para llamar a notar la diferencia entre estos dos escenarios? Estaba pensando que tendría que mirar el "/ pts TTY" información (como lo que veo cuando corro "axf PS"), pero no estoy seguro de si esa es la mejor solución, ni lo API de llamada para obtener esa información.

Hints apreciados. :)

¿Fue útil?

Solución

Comprobación del valor de retorno de ttyname (3) en contra de su entrada estándar debe darle el nombre del terminal que está alimentando la entrada de su proceso.

Será / dev / consola si el programa se está ejecutando en la consola (y no lo tiene de entrada redirigido). También puede comprobar la salida estándar para ver si está conectado a / dev / console -. Ver lo que se adapte a su mejor escenario de uso

Otros consejos

En función de la cantidad que está preocupado acerca de ser falsa, un registro fácil sería la presencia / ausencia de las variables de entorno SSH_CLIENT y SSH_CONNECTION, en cuyo caso te gustaría la función getenv.

ttyname le dirá el nombre del terminal conectado a un descriptor de archivo indicado ; por ejemplo, ttyname(0) le dirá del terminal de entrada estándar.

Esto, por supuesto fallar si se redirige entrada o 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 por lo que no es así capturar tráfico de red que genera; Quizás se encuentre interesado en la lógica de que sus get_conn_cfilter el uso de funciones para implementar esto.

me vería en las variables de entorno como una señal razonable de lo que está pasando. No estoy seguro de lo que la API de C te gustaría para eso, pero estoy seguro de que existe una.

Por ejemplo, tanto las variables de entorno o SSH_CLIENT SSH_CONNECTION se fijan en mi máquina independientemente del cliente de SSH se utiliza.

Puede ser vale la pena mirar lo universal que éstos se basan en el servidor SSH se ejecuta en la máquina.

feo, pero funciona:

// don't force scripts to pause!
if (_isatty(_fileno(stdout)))
{
    _tprintf(_T("\nPress enter to continue..."));
    _gettc(stdin);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top