Est-il possible d'ouvrir un terminal avec un tty / pty spécifié

9

(J'utilise Ubuntu.) À ma connaissance, tty est juste une sorte de port. Vous entrez quelque chose et cela devrait sortir quelque chose. Et un terminal (émulateur) est un logiciel qui gère ces entrées et sorties. Le terminal peut littéralement choisir le port auquel se connecter.

J'ai vu beaucoup de fichiers tty dans / dev et beaucoup de fichiers pts dans / dev / pts / Je ne sais pas pourquoi il y en a tellement. Sont-ils tous utilisés?

Sinon, puis-je démarrer un terminal avec le pty spécifié?

par exemple gnome-terminal /dev/pts/47

Mise à jour

La raison pour laquelle je fais cela est que je veux avoir un terminal distant. Je sais que l'approche appropriée consiste à utiliser ssh ou telnet.

Mais pour un accès temporaire, ce n'est pas très pratique. Je veux utiliser socat pour transmettre un tty ou pty au client. Le client peut alors démarrer un terminal avec ce pty ou tty.

Le code suivant fonctionne correctement. Il est exécuté sur le client et côté serveur, je reçois "bonjour".

echo "hello" > /home/myhomefoler/pty_created_by_socat
worldterminator
la source

Réponses:

9

Sous UNIX, un tty (comme beaucoup d'autres choses) apparaît sous forme de fichier. Les données écrites sur le périphérique tty vont au terminal et les données provenant du terminal sont disponibles pour lecture sur le tty.

Si le tty est un port série matériel, les données qui y sont écrites sont envoyées sur le fil et les données provenant du fil apparaissent sur le tty.

Si le tty est la console vidéo d'une machine, les données qui y sont écrites s'affichent à l'écran et les données provenant du clavier apparaissent sur le tty.

Si le tty est un pseudo-tty (terminal virtuel) connecté à un émulateur de terminal X tel que les gnome-terminaldonnées qui y sont écrites sont livrées au logiciel d'émulation de terminal X et sont à leur tour affichées dans une fenêtre, tandis que les données saisies dans cette fenêtre sont disponibles pour lire sur le terminal virtuel. Le logiciel serait connecté à l'extrémité "maître" du pseudo-terminal. Les vrais terminaux n'ont pas de fin "maître" car il y a un vrai périphérique derrière eux (comme le port série), pas un périphérique virtuel implémenté par un logiciel.

Vous pouvez donc déjà voir qu'il ne serait pas logique de demander à un émulateur de terminal X de fonctionner sur un périphérique tty arbitraire tel que /dev/ttyS0(un vrai port série, sous Linux). Ce doit être un pseudo-tty.

Mais l'émulateur de terminal peut-il choisir l'ID numérique du pseudo-terminal qu'il utilise? En principe, il serait possible pour un noyau de permettre cela, mais en fait l'interface du noyau pour allouer un nouveau pseudo-terminal ne le supporte pas: le noyau fait son propre choix. (Dans le modèle SysV, les terminaux de pesudo sont créés en ouvrant un périphérique spécial appelé /dev/ptmxet le pseudo-terminal disponible au numéro le plus bas est automatiquement attribué.)

Mais: pourquoi auriez-vous besoin de choisir le numéro du pseudo-terminal alloué? Le noyau choisit un noyau inutilisé qui est garanti d'être disponible et utilisable. Avez-vous une raison pour laquelle vous préféreriez en choisir une autre?

Quant à vous autre question:

J'ai vu beaucoup de fichiers tty dans / dev et beaucoup de fichiers pts dans / dev / pts / Je ne sais pas pourquoi il y en a tellement. Sont-ils tous utilisés?

Cela dépend du système. Sur certains systèmes, tous les périphériques pseudo-terminaux possibles sont pré-créés dans /dev/ptsou /dev, qu'ils soient utilisés ou non. Sur d'autres, les nœuds de périphérique n'existent que si le pseudo-terminal est en cours d'utilisation. Vous dites que vous utilisez Ununbu, qui utilise Linux, qui est le dernier type. Donc, oui, tous les nœuds de périphériques que vous voyez /dev/ptssont actuellement utilisés.

Mais pour un accès temporaire, ce n'est pas très pratique. Je veux utiliser socat pour transmettre un tty ou pty au client. Le client peut alors démarrer un terminal avec ce pty ou tty.

Si vous souhaitez que socattout autre logiciel se connecte à l'extrémité principale d'un pseudo-terminal, vous devez que ce logiciel prenne spécifiquement en charge cette opération. Mais vous avez de la chance, car c'est le socatcas. Par exemple, si je lance:

socat PTY,link=/tmp/socat.pty TCP-LISTEN:2222 &
sleep 1 && ( setsid bash ) </tmp/socat.pty >/tmp/socat.pty 2>&1

Je peux obtenir un shell en me connectant au port 2222 ailleurs. Très dangereux du point de vue de la sécurité !!!

Celada
la source