Come posso passare da ttys senza usare lo schermo?


17

Supponiamo quindi che avvii l'installazione Linux fino al desktop. Avvii un gnome-terminal / konsole / qualunque cosa in modo da avere un tty a cui inserire i comandi.

Ora diciamo che SSH nella stessa macchina. Mi vincolerà a un altro tty a cui inserire i comandi.

Ora diciamo che voglio "passare" il mio tty dal mio SSH originale a quello gnome-terminal iniziato prima.

Fondamentalmente sto chiedendo se c'è un modo di fare la stessa cosa screen -xma senza schermo?

So che puoi facilmente inviare output all'altro tty semplicemente facendo eco a qualcosa nel file / dev, ma non conosco un modo per "vedere" cosa c'è nel tty.

Qualche idea?



Risposte:


16

Forse questi schemi possono chiarire la situazione. Questa è la solita impostazione:

                               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 non c'è modo di collegare alcuni nuovi Process3come questo:

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

Ciò che lo schermo (e altri) fa è allocare alcuni pseudo terminali (come fa xterm) e reindirizzarli a uno o più terminali "reali" (fisici, virtuali o emulati):

             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 -xpuoi collegare un altro terminale, xterm, qualunque cosa (diciamo Terminal 3) alla sessione dello schermo.

Quindi no, non è possibile comunicare direttamente tramite stdin / stdout con processi collegati a un terminale diverso. Puoi farlo solo attraverso il processo che controlla questo terminale se si tratta di uno pseudo terminale e se questo processo è stato autorizzato a farlo (come lo schermo).


Questa è un'ottima spiegazione! Penso che non sia davvero una risposta qui, ma si adatterebbe bene a questa domanda . Un'osservazione: "non c'è modo" è vera solo se proibisci ptrace; grazie a ptrace, programmi come neercs, rettye così via possono farlo a volte.
Gilles 'SO- smetti di essere malvagio' il

@Gilles: bene fanno qualcos'altro: cambiano il valore dei descrittori di file ( stdin, stdouta destra dello schema) direttamente dirottando il processo. Pura malvagità!
Stéphane Gimenez,

1
Hmm, hai ragione, cambiano una freccia diversa. Male, ma conveniente!
Gilles 'SO- smetti di essere malvagio' il

8

Non è possibile ricollegare i processi sull'altro terminale al terminale corrente senza trucchi sporchi. È possibile forzando il processo ad eseguire determinate chiamate di sistema (con ptrace); questo provoca l'arresto anomalo di alcuni programmi. Ci sono diversi strumenti che fanno questo, come ad esempio neercs, retty, cryopid, reptyr, ...; vedi Come posso rinnegarlo come processo in esecuzione e associarlo a una nuova shell dello schermo? e domande collegate.

Ottenere l'output già visualizzato sull'altro terminale è un problema diverso. Non esiste una soluzione completamente generale: in linea di principio, una volta eseguito il rendering dell'output, il terminale potrebbe memorizzarlo solo come immagine. In pratica, tutti gli emulatori di terminali X mantengono il loro buffer di output in formato testo in modo da poterlo copiare e incollare. Il modo per catturare quell'uscita dipende dall'emulatore di terminale; l'idea di base è simulare la selezione dell'intero buffer di scorrimento. Per una console Linux come /dev/tty1, il buffer di scorrimento è facilmente disponibile come /dev/vcs1(e /dev/vcsa1con attributi di testo).

La semplice risposta è che se si desidera riconnettersi a un terminale da un luogo diverso, utilizzare screeno tmux.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.