Que contient les fichiers / dev / pts et pouvons-nous les ouvrir?


73

À ma connaissance, les /dev/ptsfichiers sont créés pour des sessions ssh ou telnet.


6
echo Hello > /dev/pts/1... Voyez ce qui se passe, c'est votre terminal.
Sepahrad Salour


1
@SepahradSalour il faut adapter le nombre de pts à son contexte. sshd a utilisé / dev / pts / 30 pour ma session.
Gab

2
@Gab 好人 Pour obtenir l'emplacement de votre terminal actuel, vous pouvez utiliser la commande tty.
JeromeJ

Réponses:


110

Rien n'est stocké dans /dev/pts. Ce système de fichiers vit uniquement en mémoire.

Les entrées en /dev/ptssont des pseudo-terminaux (pty en abrégé). Les noyaux Unix ont une notion générique de terminaux . Un terminal offre aux applications un moyen d’afficher une sortie et de recevoir une entrée via un terminal . Un processus peut avoir un terminal de contrôle - pour une application en mode texte, il interagit avec l'utilisateur.

Les terminaux peuvent être des terminaux matériels («tty», ou «télétype») ou des pseudo-terminaux («pty»). Les terminaux matériels sont connectés via une interface, telle qu'un port série ( ttyS0,…) ou USB ( ttyUSB0,…) ou via un écran et un clavier d'ordinateur ( tty1,…). Les pseudo-terminaux sont fournis par un émulateur de terminal, qui est une application. Certains types de pseudo-terminaux sont:

  • Les applications graphiques telles que xterm, gnome-terminal, konsole,… transforment les événements du clavier et de la souris en saisie de texte et affichent la sortie graphiquement dans certaines polices.
  • Les applications de multiplexage, telles que les entrées et les sorties de relais d'écran et tmux, en provenance et à destination d'un autre terminal, permettent de découpler les applications en mode texte du terminal réel.
  • Les applications shell distantes telles que sshd, telnetd, rlogind,… relaient l'entrée et la sortie entre un terminal distant sur le client et un terminal serveur sur le serveur.

Si un programme ouvre un terminal en écriture, la sortie de ce programme apparaît sur le terminal. Il est courant d’avoir plusieurs programmes qui sortent simultanément sur un terminal, bien que cela puisse être parfois déroutant, car il n’ya aucun moyen de savoir quelle partie de la sortie provient de quel programme. Les processus en arrière-plan qui essaient d'écrire sur leur terminal de contrôle peuvent être automatiquement suspendus par un signal SIGTTOU .

Si un programme ouvre un terminal en lecture, l'entrée de l'utilisateur est transmise à ce programme. Si plusieurs programmes lisent depuis le même terminal, chaque caractère est acheminé indépendamment vers l’un des programmes; ce n'est pas recommandé. Normalement, un seul programme lit activement le terminal à un moment donné. les programmes qui essaient de lire depuis leur terminal de contrôle alors qu’ils ne sont pas au premier plan sont automatiquement suspendus par un signal SIGTTIN .

Pour expérimenter, exécutez ttydans un terminal pour voir ce que le terminal est. Disons que c'est /dev/pts/42. Dans un shell d'un autre terminal, exécutez echo hello >/dev/pts/42: la chaîne hellosera affichée sur l'autre terminal. Maintenant, lancez cat /dev/pts/42et tapez dans l'autre terminal. Pour supprimer cette catcommande (ce qui rendra l’autre terminal difficile à utiliser), appuyez sur Ctrl+ C.

L'écriture sur un autre terminal est parfois utile pour afficher une notification. par exemple, la writecommande le fait. La lecture à partir d'un autre terminal n'est normalement pas effectuée.


Soit je ne comprends pas ce que vous essayez de dire, ou vos informations sont fausses. Les processus en arrière-plan écrivant sur le terminal n'entraîneront pas de SIGTTIN. De même, plusieurs programmes ne peuvent pas lire simultanément sur le terminal (votre déclaration indiquant que "chaque caractère est acheminé indépendamment"). Un seul programme peut lire à partir du terminal à tout moment, et une tentative d'un programme en arrière-plan de lire à partir de ce terminal se traduira par un SIGTTIN. C’est le seul cas où SIGTTIN est automatiquement envoyé.
Patrick

De plus, vous ne pouvez pas non plus lire depuis un autre terminal. Cela constituerait une vulnérabilité importante en matière de sécurité, car vous seriez en mesure d'intercepter des données. Vous pouvez straceentrer une lecture de programme, mais c'est tout.
Patrick

4
@Patrick Les processus d'arrière-plan écrivant sur le terminal obtiennent SIGTTOU, c'était une faute de frappe. Plusieurs programmes peuvent lire simultanément sur le terminal (essayez-le et voyez, comme je le décris dans le paragraphe suivant, vous devez le faire à partir d'un processus dont le terminal de contrôle n'est pas ce terminal). Oui, vous pouvez lire depuis un autre terminal, tant qu'il vous appartient. Pourquoi pensez-vous que cela serait impossible?
Gilles 'SO- arrête d'être méchant'

Les processus en arrière-plan écrivant sur le terminal n'obtiennent SIGTTOU que si l' tostopindicateur tty est défini. Cet indicateur n'est pas défini par défaut. Et je suis corrigé sur la lecture d'un autre ATS. Je l'ai essayé et cela fonctionne, mais c'est lecture par lecture, pas par caractère (si vous êtes assis à l'invite du shell, ils sont identiques à ceux qui lisent un shell à la fois). Il serait peut-être bon de clarifier ce point car c'est ainsi que j'ai interprété votre réponse.
Patrick

2
@ Patrick Certes, un readappel ne renverra que des caractères consécutifs (ou plutôt des octets, devrais-je dire), mais l'application n'a aucun contrôle sur le nombre d'octets renvoyés par un readappel. Ce n'est donc pas mieux.
Gilles, arrête d'être méchant

18

Les fichiers /dev/ptssont "pseudo-ttys". Ils ressemblent dans une certaine mesure aux canaux nommés, mais ils imitent également les anciens terminaux à connexion série, comme les VT-100. Les pseudo-ttys effectuent le transfert d'octets d'un clavier à un programme et d'un programme à un périphérique de sortie, ce qui semble simple. Mais cela répond à votre question d’explicité: le noyau ne stocke rien /dev/pts/0par exemple. Seuls les flux d'octets provenant de la sortie standard d'un programme connecté au pseudo-terminal entrent, et les programmes dont le stdin est connecté au même pseudo-terminal lisent ces octets.

Les pseudo-ttys mettent également une couche d'indirection dans ces flux d'octets. Le noyau peut inspecter des octets pour rechercher des valeurs spéciales telles que "Control-C" ou "Control-D" ou "Control-U" (tous configurables, voir man stty) et envoyer un SIGINT, définir la fin de fichier sur stdin ou effacer une ligne sur l'entrée. Il y a aussi une fonction de mise en mémoire tampon quelque part, donc mon "rien ne stocke" est un peu faux, mais seulement de quelques kilo-octets.

Le noyau peut inspecter les valeurs d'octets à la sortie et effectuer des opérations telles que transformer une nouvelle ligne (saut de ligne ASCII, LF ou "\n") en deux octets, retour-chariot et saut de ligne (CRLF ou "\r\n"), ou tous les octets nécessaires au matériel d'un terminal série. L'indirection d'un pseudo-terminal permet l'indépendance du matériel.

Les pseudo-terminaux autorisent également tous les ioctl()appels système "à la vitesse de transmission", "à la parité définie", etc. , et ne font probablement rien avec eux. Cela permet aux programmes qui ont été écrits le jour des VT-100, ADM-3 et Wyse whatevers de continuer à fonctionner sans erreur. Le logiciel, le pilote de périphérique pseudo-ttys, agit comme un matériel.

Les pseudo-ttys peuvent être utilisés par sshdet telnet, mais ils sont également utilisés entre un émulateur de terminal (comme xtermou rxvt) et le shell qui s'exécute généralement à l'intérieur du xterm.

Linux et beaucoup d'Unix ont des pseudo-ttys. Le plan 9 ne le fait pas. Les pseudo-ttys sont un peu une relique, laissés de l’époque des terminaux matériels connectés par câble série.


13

/dev/est un répertoire spécial pour les fichiers de périphérique. Ce sont des abstractions, ce ne sont pas de vrais fichiers sur le disque. Le répertoire est rempli au démarrage et peut être modifié pour refléter les interfaces de périphériques existantes, créées et détruites par le noyau et un démon d’espace utilisateur udevd.

La plupart des périphériques ainsi représentés sont virtuels. Cela inclut les entrées dans /dev/pts, qui sont des périphériques de console. C'est pourquoi on en crée une pour les sessions à distance. ils sont également créés lorsque vous ouvrez un terminal à interface graphique locale.

Vous pouvez les ouvrir sous forme de fichiers, même si leur valeur d’utilisation n’est pas très grande. Pour obtenir le /dev/ptsnœud auquel votre shell est connecté, utilisez tty:

> tty
/dev/pts/4

Maintenant, passez à une autre console et essayez:

> echo "duck!" > /dev/pts/4

Intelligent. Maintenant essaye:

> cat /dev/pts/4

Ensuite, essayez d’utiliser le shell dans / dev / pts / 4. Vous êtes bloqué jusqu'à ce que vous quittiez le catcôté opposé, mais la plupart de ce que vous tapez sur les pts / 4 passera (par exemple, en essayant "hello world" je me suis retrouvé avec hlsur les pts / 4 et ello wordsur la catconsole).

Mon hypothèse est que le périphérique reçoit les entrées du shell et les transmet via le système, ce qui explique comment les choses se retrouvent à l'écran - le shell ne traite pas de matériel, mais du système. Essayez strace bash(et regardez man stracesi vous ne savez pas ce que c'est); vous recevez une série d'appels au démarrage de bash. Maintenant, commencez à frapper les touches:

read(0, "h", 1)                         = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "h", 1h)                        = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
read(0, "e", 1)                         = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "e", 1e)                        = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
read(0, "y", 1)                         = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "y", 1y)                        = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0

Pour chaque lettre saisie, il existe une lecture à partir d'une entrée standard et une écriture vers une sortie standard. Mais quel est le standard de la coquille connecté à? Maintenant, essayez stracesur votre terminal graphique - vous devrez trouver le nom si vous ne le connaissez pas, par exemple sur KDE, c’est konsole, et GNOME a le gnome-terminal, je crois. La sortie de cela straceest probablement plus cryptique - la mienne a beaucoup de poll()et recvfrom(). Je ne vois aucune écriture, mais si vous tirez maintenant l' catastuce d'un autre terminal, vous remarquerez que lorsque vous tapez, les touches qui sont lues par cat ne provoquent aucune réponse du tout dans la sortie strace - le terminal n'est pas. t les recevoir. Ainsi, l'application de terminal graphique GUI et le chat sont en concurrence pour lire à partir du même périphérique, dans lequel le shell est sortie.


Quelle est l'utilisation de 'cat / dev / pts / 4' lorsque nous sommes bloqués et pourquoi nous bloquons lors de l'exécution de cette commande.
utilisateur2720323

J'ai ajouté quelques paragraphes pour essayer d'expliquer cela.
goldilocks
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.