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?

user488244
la source

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).

Stéphane Gimenez
la source
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.

Gilles 'SO- arrête d'être méchant'
la source