Como posso alternar entre ttys sem usar a tela?

17

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

Agora, digamos que eu SSH nessa mesma máquina. Isso me ligará a outro tty no qual inserir comandos.

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

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

Eu sei que você pode facilmente enviar saída para o outro tty simplesmente ecoando algo no arquivo / dev, mas não conheço uma maneira de 'visualizar' o que está no tty.

Alguma ideia?

user488244
fonte
Isso é uma duplicata do unix.stackexchange.com/questions/8469/… ?
precisa saber é o seguinte

Respostas:

16

Talvez esse esquema possa esclarecer a situação. Esta é 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 como conectar novidades Process3como esta:

                             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 outras) 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 -xvocê pode conectar mais um terminal, xterm, o que quer que seja (digamos Terminal 3) à sessão da tela.

Portanto, não, você não pode se comunicar diretamente através do stdin / stdout com processos conectados a um terminal diferente. Você só pode fazer isso através do processo que está controlando este terminal se for um pseudo terminal e se esse processo foi permitido (como a tela é).

Stéphane Gimenez
fonte
Essa é uma ótima explicação! Eu acho que não é realmente uma resposta aqui, mas atenderia bem a essa pergunta . Uma observação: "não há como" só é verdade se você proíbe ptrace; graças a ptrace, programas como o neercs, rettyetc., podem fazê-lo às vezes.
Gilles 'SO- stop being evil' em
@ Gilles: bem, eles fazem outra coisa: eles alteram o valor dos descritores de arquivo ( stdin, stdoutà direita do esquema) diretamente, seqüestrando o processo. Pura maldade!
Stéphane Gimenez
1
Hmm, você está certo, eles mudam uma flecha diferente. Mal, mas conveniente!
Gilles 'SO- stop being evil' em
8

Reconectar os processos do outro terminal ao 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 falhem. Existem várias ferramentas que fazem isso, como neercs, retty, cryopid, reptyr, ...; consulte Como posso negar 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 geral: em princípio, uma vez que a saída tenha sido renderizada, o terminal poderá 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 copiá-lo. A maneira de obter 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 está facilmente disponível como /dev/vcs1(e /dev/vcsa1com atributos de texto).

A resposta simples é que, se você deseja reconectar-se a um terminal de um local diferente, use screenou tmux.

Gilles 'SO- parar de ser mau'
fonte