Comment puis-je basculer entre ttys sans utiliser d'écran?


17

Supposons donc que vous démarriez votre installation Linux jusqu'au bureau. Vous démarrez un gnome-terminal / konsole / n'importe quoi donc vous avez un tty pour entrer des commandes.

Maintenant, disons que je SSH dans cette même machine. Il me liera à un autre terminal pour entrer des commandes.

Supposons maintenant que je veuille "commuter" mon tty de mon SSH d'origine à celui de gnome-terminal commencé plus tôt.

Fondamentalement, je demande s'il existe un moyen de faire la même chose screen -xmais sans écran?

Je sais que vous pouvez facilement envoyer la sortie à l'autre tty simplement en faisant écho à quelque chose dans le fichier / dev, mais je ne connais pas un moyen de «voir» ce qui est dans le tty.

Des idées?



S'agit-il d'un doublon de unix.stackexchange.com/questions/8469/… ?
mattdm

Réponses:


16

Peut-être que ce schéma peut clarifier la situation. C'est le réglage habituel:

                               Terminal  (/dev/ttyX or /dev/pts/x)
                                device
                                   |
                    (screen)<--[<output]----x-------(stdout) Process1
        Terminal  (keyboard)---[input >]---o-\----->(stdin)
                                            \ \
(hardware console or                         \ `----(stdout) Process2
 virtual console or terminal                  `---->(stdin)
 emulators like xterm, …)

Et il n'y a aucun moyen d'en brancher de nouveaux Process3comme celui-ci:

                             Terminal
                              device
                                 |
             (screen)<---o---[<output]--x------(stdout) Process1
  Terminal (keyboard)---/-x--[input >]-o-\---->(stdin)
                       | /              \ \
                       | |               \ `---(stdout) Process2
                       | |                `--->(stdin)
                       | |
                       \ `---------------------(stdout) Process3
                        `--------------------->(stdin)

Ce que fait l'écran (et d'autres), c'est d'allouer un pseudo-terminal (comme le fait xterm) et de le rediriger vers un ou plusieurs terminaux "réels" (physiques, virtuels ou émulés):

             Terminal                   pseudo
             devices              ,--> Terminal (/dev/pts/x)
                |         _______/      device
Terminal <--[<output]--- |       |        |
 1       ---[input >]--> |screen | <--[<output]---x-----(stdout) Process1
                         |Process| ---[input >]--o-\--->(stdin)
Terminal <--[<output]--- |       |                \ \
 2       ---[input >]--> |_______|                 \ `--(stdout) Process2
                                                    `-->(stdin)

En utilisant, screen -xvous pouvez attacher un terminal supplémentaire, xterm, quel que soit (par exemple Terminal 3) à la session d'écran.

Donc non, vous ne pouvez pas communiquer directement via stdin / stdout avec des processus attachés à un autre terminal. Vous ne pouvez le faire via le processus contrôlant ce terminal que s'il s'agit d'un pseudo-terminal, et si ce processus a été conçu pour le faire (comme l'écran l'est).


Voilà une excellente explication! Je pense que ce n'est pas vraiment une réponse ici, mais conviendrait bien à cette question . Une observation: «il n'y a aucun moyen» n'est vraie que si vous interdisez ptrace; grâce à ptrace, des programmes comme neercs, rettyet ainsi de suite peuvent le faire parfois.
Gilles 'SO- arrête d'être méchant'

@Gilles: eh bien ils font autre chose: ils modifient directement la valeur des descripteurs de fichiers ( stdin, stdoutà droite du schéma) en détournant le processus. Mal absolu!
Stéphane Gimenez

1
Hmm, tu as raison, ils changent une flèche différente. Mal, mais pratique!
Gilles 'SO- arrête d'être méchant'

8

Reconnecter les processus de l'autre terminal à votre terminal actuel n'est pas possible sans trucs sales. Cela est possible en forçant le processus à effectuer certains appels système (avec ptrace); cela provoque le blocage de certains programmes. Il existe plusieurs outils qui font cela, comme neercs, retty, cryopid, reptyr, ...; voir Comment puis-je supprimer un processus en cours et l'associer à un nouveau shell d'écran? et questions liées.

L'obtention de la sortie déjà affichée sur l'autre terminal est un problème différent. Il n'y a pas de solution entièrement générale: en principe, une fois la sortie rendue, le terminal ne peut la stocker que sous forme d'image. En pratique, tous les émulateurs de terminaux X conservent leur tampon de sortie sous forme de texte afin que vous puissiez le copier-coller. La façon de récupérer cette sortie dépend de l'émulateur de terminal; l'idée de base est de simuler la sélection de la totalité du tampon de défilement. Pour une console Linux telle que /dev/tty1, le tampon de défilement est facilement disponible en tant que /dev/vcs1(et /dev/vcsa1avec des attributs de texte).

La réponse simple est que si vous souhaitez vous reconnecter à un terminal depuis un autre endroit, utilisez screenou tmux.

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.