Como posso alternar entre ttys sem usar a tela?

16

Então, digamos que você inicialize sua instalação do Linux até a área de trabalho. Você inicia um gnome-terminal / konsole / whatever, então você tem um tty para digitar comandos.

Agora digamos que eu SSH na mesma máquina. Isso me ligará a outro tty para digitar comandos para.

Agora, digamos que eu queira "mudar" o meu tty do meu SSH original para o do gnome-terminal, iniciado anteriormente.

Basicamente, estou perguntando se existe alguma maneira de fazer a mesma coisa que screen -x faz, mas sem tela?

Eu sei que você pode facilmente enviar a saída para o outro tty simplesmente fazendo um eco no arquivo / dev, mas eu não sei como "ver" o que está no tty.

Alguma idéia?

    
por user488244 01.08.2011 / 21:42

2 respostas

16

Talvez esse esquema possa esclarecer a situação. Essa é a configuração usual:

                               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, …)

E não há nenhuma maneira de conectar alguns novos Process3 assim:

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

O que a tela (e outros) faz é alocar algum dispositivo pseudo-terminal (como o xterm) e redirecioná-lo para um ou mais terminais "reais" (físicos, virtuais ou emulados):

             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)

Usando screen -x , você pode anexar mais um terminal, xterm, o que quiser (digamos, Terminal 3 ) à sessão de tela.

Portanto, não é possível se comunicar diretamente por stdin / stdout com processos anexados a um terminal diferente. Você só pode fazê-lo através do processo que está controlando este terminal se ele for um pseudo-terminal, e se este processo foi feito (como a tela é).

    
por 02.08.2011 / 17:34
7

A reconexão dos processos no outro terminal ao seu terminal atual não é possível sem truques sujos. É possível forçar o processo a executar determinadas chamadas do sistema (com ptrace ); isso faz com que alguns programas travem. Existem várias ferramentas que fazem isso, como neercs , retty , cryopid , reptyr ,…; veja Como posso deserdar um processo em execução e associá-lo a um novo shell de tela? e perguntas vinculadas.

Obter a saída já exibida no outro terminal é um problema diferente. Não existe uma solução totalmente genérica: em princípio, uma vez que a saída tenha sido processada, o terminal pode armazená-la apenas como uma imagem. Na prática, todos os emuladores de terminal X mantêm seu buffer de saída em forma de texto para que você possa copiá-lo e colá-lo. A maneira de pegar essa saída depende do emulador de terminal; A idéia básica é simular a seleção de todo o buffer de rolagem. Para um console Linux como /dev/tty1 , o buffer de rolagem é facilmente disponibilizado como /dev/vcs1 (e /dev/vcsa1 com atributos de texto).

A resposta simples é que, se você quiser se reconectar a um terminal de um local diferente, use screen ou tmux .

    
por 02.08.2011 / 00:57