Si hago un:
echo foo > /dev/pts/12
Algún proceso leerá eso foo\ndesde su descriptor de archivo al lado maestro.
¿Hay alguna manera de averiguar cuáles son esos (esos) procesos?
O en otras palabras, ¿cómo podría averiguar qué xterm / sshd / script / screen / tmux / expect / socat ... está en el otro extremo de /dev/pts/12?
lsof /dev/ptmxme dirá los procesos que tienen descriptores de archivo en el lado maestro de cualquier pty. Un proceso en sí mismo puede usar ptsname()( TIOCGPTNioctl) para encontrar el dispositivo esclavo basado en su propia fd en el lado maestro, por lo que podría usar:
gdb --batch --pid "$the_pid" -ex "print ptsname($the_fd)"
para cada uno de los pid / fd devueltos por lsofconstruir esa asignación, pero ¿hay una forma más directa, confiable y menos intrusiva de obtener esa información?
terminal-emulator
open-files
pty
Stéphane Chazelas
fuente
fuente

sudo find /proc/*/fd/0 -ls | grep '/dev/pts/4', proporcionaría la lista de PID (/proc/PID) como salida./dev/pts/4. Por lo general, ese será un ancestro común de aquellos procesos que se han/dev/pts/4abierto, pero no necesariamente.screen, esscreenque asigna y gestiona activamente el esclavo pty durante la vida útil del dispositivo, pero, como creo, el shell se convierte en el líder del proceso para ese tty y así, como su salida muestra, obtienesbasho lo que sea depsnoscreen. Remonté algunosxtermshasta elxtermpid basado en/proc/lockspero estaba suelto.Respuestas:
Al principio intenté rastrear unos pocos
xtermsegundos hasta elxtermpid basado en la información que encontré/proc/lockspero estaba flojo. Quiero decir, funcionó, creo, pero fue en el mejor de los casos: no entiendo completamente toda la información que proporciona el archivo y solo coincidía con lo que parecía corresponder entre su contenido y los procesos terminales conocidos.Luego intenté ver
lsof/straceunwrite/talkproceso activo entre ptys. Nunca antes había usado ninguno de los dos programas, pero parecen confiar en ellosutmp. Si mi pty objetivo no tenía unautmpentrada por alguna razón, ambos se negaron a admitir que existía. Tal vez hay una forma de evitar eso, pero estaba lo suficientemente confundido como para abandonarlo.Intenté algún
udevadmdescubrimiento con 136 y 128 nodos de dispositivos de mayor número como se anunciabaptsyptmrespectivamente/proc/tty/drivers, pero también me falta una experiencia muy útil con esa herramienta y una vez más no encontré nada sustancial. Curiosamente, sin embargo, noté que el:minrango para ambos tipos de dispositivos figuraba de manera asombrosa0-1048575.Sin embargo, no fue hasta que volví a visitar este documento del kernel que comencé a pensar en el problema en términos de
mounts. Lo había leído varias veces antes, pero cuando la investigación continua en esa línea me llevó a este parche de 2012/dev/ptstuve una idea:Pensé, ¿qué suelo usar para asociar procesos con un
mount? Y efectivamente:Entonces, con esa información que puedo hacer, por ejemplo de
terminology:Como puede ver, con un poco de prueba explícita, se podría hacer un proceso para generar de manera bastante confiable el proceso maestro de una empanada arbitraria. Con respecto a los sockets, estoy bastante seguro de que uno podría abordarlo desde esa dirección y usarlo
socaten lugar de un depurador, pero todavía tengo que aclarar cómo. Aún así, sospecho quesspodría ayudar si está más familiarizado con eso que yo:Así que lo configuré con un poco más de pruebas explícitas, en realidad:
Imprime bytes
$$numéricos\0nulos en cada pty y comprueba el io de cada proceso maestro contra una comprobación previa. Si la diferencia es,$$entonces asocia el pid con el pty. Esto funciona principalmente . Quiero decir, para mí, devuelve:Lo cual es correcto, pero, obviamente, es un poco picante. Quiero decir, si uno de esos otros estuviera leyendo un montón de datos en ese momento, probablemente fallaría. Estoy tratando de descubrir cómo cambiar los
sttymodos en otra pty para enviar el bit de parada primero o algo así para poder solucionarlo.fuente
Si solo está buscando quién posee la conexión y desde dónde están conectados, el comando who funcionará bien.
Si también desea saber qué está escuchando en esa conexión, w lo mostrará al final.
Y para obtener los pids, limite un ps a la sesión tty que está viendo. Completamente discreto para arrancar.
Tenga en cuenta que esto puede conducir a pistas falsas, dependiendo del momento. Pero es un buen lugar para comenzar.
fuente
/dev/pts/4, donde ejecutó esewcomando.Tuve el mismo problema con qemu, y finalmente encontré una solución muy mala (pero aún así una solución): analizar la memoria del proceso.
Esto funciona aquí porque sé que qemu está almacenando los puntos remotos en una cadena con un formato específico y asignado en el montón. Es posible que también funcione en otras situaciones con algunos cambios y reutilizando el pid de la salida del fusor (verifique otra respuesta).
El código está adaptado desde aquí .
fuente