Si je fais un:
echo foo > /dev/pts/12
Certains processus liront cela foo\n
de son descripteur de fichier vers le côté maître.
Existe-t-il un moyen de savoir ce que ce (ces) processus est (sont)?
Ou en d'autres termes, comment pourrais-je savoir quel xterm / sshd / script / screen / tmux / expect / socat ... est à l'autre bout de /dev/pts/12
?
lsof /dev/ptmx
me dira les processus qui ont des descripteurs de fichiers du côté maître de tout pty. Un processus lui-même peut utiliser ptsname()
( TIOCGPTN
ioctl) pour trouver le périphérique esclave sur la base de son propre fd côté maître, donc je pourrais utiliser:
gdb --batch --pid "$the_pid" -ex "print ptsname($the_fd)"
pour chacun des pid / fd retournés par lsof
pour créer ce mappage, mais existe-t-il un moyen plus direct, fiable et moins intrusif d'obtenir ces informations?
terminal-emulator
open-files
pty
Stéphane Chazelas
la source
la source
sudo find /proc/*/fd/0 -ls | grep '/dev/pts/4'
, fournirait la liste des PID (/proc/PID
) en sortie./dev/pts/4
. Habituellement, ce sera un ancêtre commun de ces processus/dev/pts/4
ouverts, mais pas nécessairement.screen
, c'estscreen
qu'il alloue et gère activement l'esclave pty pendant la durée de vie de l'appareil, mais - comme, je pense - le shell devient le leader du processus pour ce tty et ainsi, comme votre montre la sortie, vous obtenezbash
ou quoi que ce soit deps
nonscreen
. J'en ai retracé quelques-unsxterms
jusqu'auxterm
pid basé sur/proc/locks
mais il était lâche.Réponses:
Au début, j'ai essayé de remonter quelques secondes
xterm
auxterm
pid en fonction des informations que j'ai trouvées,/proc/locks
mais c'était lâche. Je veux dire, cela a fonctionné, je pense, mais c'était au mieux circonstanciel - je ne comprends pas complètement toutes les informations que le fichier fournit et ne correspondait qu'à ce qui semblait correspondre entre son contenu et les processus terminaux connus.Ensuite, j'ai essayé de regarder
lsof/strace
unwrite/talk
processus actif entre ptys. Je n'avais jamais utilisé aucun des deux programmes auparavant, mais ils semblent s'appuyer sur euxutmp
. Si mon pty ciblé n'avait pas d'utmp
entrée pour une raison quelconque, ils refusaient tous les deux d'admettre qu'elle existait. Peut-être qu'il y a un moyen de contourner cela, mais j'étais assez confus pour l'abandonner.J'ai essayé une
udevadm
découverte avec 136 et 128 nœuds de périphérique de nombre majeur comme annoncépts
etptm
respectivement/proc/tty/drivers
, mais je manque également d'expérience très utile avec cet outil et encore une fois rien de substantiel. Fait intéressant, cependant, j'ai remarqué que la:min
plage des deux types d'appareils était répertoriée de manière stupéfiante0-1048575
.Ce n'est que lorsque j'ai revu ce document sur le noyau que j'ai commencé à penser au problème en termes de
mount
s. J'avais lu cela plusieurs fois auparavant, mais lorsque des recherches continues dans ce domaine m'ont amené à ce patchset 2012,/dev/pts
j'ai eu une idée:J'ai pensé à ce que j'utilise habituellement pour associer des processus à un
mount
? Et bien sûr:Donc, avec ces informations, je peux faire, par exemple à partir de
terminology
:Comme vous pouvez le voir, avec un peu de test explicite, un tel processus pourrait être fait pour produire de manière assez fiable le processus maître d'un pty arbitraire. En ce qui concerne les sockets, je suis assez certain que l'on pourrait l'approcher dans cette direction en utilisant
socat
plutôt qu'un débogueur, mais je n'ai pas encore expliqué comment. Pourtant, je pense que celass
pourrait aider si vous le connaissez mieux que moi:Je l'ai donc configuré avec des tests un peu plus explicites, en fait:
Il imprime
$$
num\0
octets nuls à chaque pty et vérifie l'io de chaque processus maître par rapport à une vérification précédente. Si la différence est$$
alors il associe le pid au pty. Cela fonctionne principalement . Je veux dire, pour moi, ça revient:Ce qui est correct, mais, évidemment, c'est un peu racé. Je veux dire, si l'un de ces autres lisait un tas de données à l'époque, il manquerait probablement. J'essaie de comprendre comment changer les
stty
modes sur un autre pty afin d'envoyer le bit d'arrêt en premier ou quelque chose comme ça pour que je puisse résoudre ce problème.la source
Si vous cherchez simplement à qui appartient la connexion et d'où ils sont connectés, la commande who fonctionnera bien.
Si vous voulez aussi savoir ce qui est à l' écoute sur cette connexion, w montrera à la fin.
Et pour obtenir les pids, limitez un ps à la session tty que vous regardez. Complètement discret pour démarrer.
Notez que cela peut conduire à des harengs rouges, selon le moment. Mais c'est un bon point de départ.
la source
/dev/pts/4
, où vous avez exécuté cettew
commande.J'ai eu le même problème avec qemu, et j'ai finalement trouvé une très mauvaise solution (mais toujours une solution): analyser la mémoire du processus.
Cela fonctionne ici parce que je sais que qemu stocke les pts distants dans une chaîne avec un format spécifique et alloués sur le tas. Peut-être que cela peut également fonctionner dans d'autres situations avec quelques modifications et en réutilisant le pid de la sortie de l'unité de fusion (vérifiez l'autre réponse).
Le code est adapté d' ici .
la source