
Respuesta1
Xterm tiene /dev/ptmx
abierto, pero no puedes verlo así. Este es el por qué.
Sus xterm
permisos ejecutables tienen el S_ISGID
bit (set-group-ID) establecido y son propiedad del grupo utmp
.
Está configurado de esa manera para que xterm
pueda agregar una entrada en /var/run/utmp
y /var/log/wtmp
(las rutas exactas pueden variar según su sistema) para que su sesión se muestre en la salida de who
o last
.
Con esos permisos, cuando xterm
se ejecute, el proceso que lo ejecuta verá sueficazLa identificación del grupo cambia a la del utmp
grupo (mientras elleerLa identificación del grupo seguirá siendo la misma), lo que le dará permiso para abrir los registros utmp
/ wtmp
inicio de sesión en modo de escritura.
En Linux, como medida de seguridad, solo root
se pueden enumerar los archivos abiertos de procesos que tengan una identificación de usuario efectiva diferente a la identificación de usuario real, o una identificación de grupo efectiva diferente a la identificación de grupo real. (notarás que para dichos procesos, /proc/<pid>fd
tiene dr-x------ root root
permisos, en comparación con dr-x------ you your-group
otros procesos).
Es por eso que lsof
, cuando se ejecuta como usuario normal, no se pueden enumerar los archivos abiertos de ese xterm
proceso. Necesitarías ejecutar lsof
como root
.
En cuanto a por qué funciona gnome-terminals
, hay varias posibilidades:
gnome-terminal
no agrega entradas en los registros de inicio de sesión (ese es el caso en mi sistema)gnome-terminal
utiliza elutempter
ayudante(que en ese caso es el que es sgidutmp
) para agregar los registros de inicio de sesión. Eso es loxterm
quekonsole
hago en mi sistema.gnome-terminal
restablece la identificación de usuario efectiva a la identificación de usuario real (renuncia temporalmente alutmp
acceso especial) después de haber actualizado los registros de inicio de sesión (lo cualxterm
no es así).
Respuesta2
Ese es el dispositivo maestro pseudo-terminal enlinux. Pero xterm usa la función POSIX para abrir el pseudoterminal, que oculta los detalles de apertura del dispositivo.
Existen diferentes configuraciones para pseudo-terminales, pero es probable que su sistema utiliceeste trozo:
#elif defined(HAVE_POSIX_OPENPT) && defined(HAVE_PTSNAME) && defined(HAVE_GRANTPT_PTY_ISATTY)
if ((*pty = posix_openpt(O_RDWR)) >= 0) {
char *name = ptsname(*pty);
if (name != 0) {
strcpy(ttydev, name);
result = 0;
}
}
VTE (el emulador de terminal real: "gnome-terminal" es unfachada) usa algo similar (versrc/pty.cc).
En la práctica no es necesario continuarusandoel descriptor de archivo para el dispositivo maestro. xterm se ejecuta como dos procesos, yusosese descriptor de archivo en su proceso "principal". Descarta el descriptor de archivo para el dispositivo maestro en suproceso "niño" (ver fuente).
Cuando ejecutas xterm, elproceso hijoes con el que habla tu shell, por ejemplo, si ejecutastty
para ver qué terminal está utilizando (es decir, utilizando elesclavolado del pseudo-terminal, y elmaestrolado está cerrado porque cada proceso solo necesita trabajar con un lado del pseudo-terminal).
Elproceso padre(que tiene /dev/ptmx
abierta) gestiona la visualización de la ventana X.
Dado todo eso, esperaría ver lsof
que xterm se haya /dev/ptmx
abierto. Excepto:
- en sus capturas de pantalla, el mensaje indica que no se está ejecutando comoraíz, y si hay un problema de permisos
lsof
que le impide ver todos los procesos, entonces eso podría explicar la información faltante. - su xterm en realidad no se está ejecutando en la máquina donde lo está ejecutando
lsof
, por ejemplo, si ha conectado ssh a la máquina (y resulta que estágnome-terminal
ejecutándose en una sesión diferente).