Jak mogę przełączać się między urządzeniami tty bez korzystania z ekranu?

17

Powiedzmy, że uruchamiasz instalację Linuksa aż do pulpitu. Uruchamiasz gnome-terminal / konsole / cokolwiek, więc masz tty do wprowadzania poleceń.

Powiedzmy teraz, że przesyłam SSH na tę samą maszynę. Powiąże mnie z innym tty, do którego mogę wprowadzać polecenia.

Powiedzmy teraz, że chcę „przełączyć” mój tty z mojego oryginalnego SSH na terminal gnome, który zaczął się wcześniej.

Zasadniczo pytam, czy jest jakiś sposób, aby zrobić to samo, screen -xale bez ekranu?

Wiem, że możesz łatwo wysyłać dane wyjściowe do drugiego tty, po prostu powtarzając coś w pliku / dev, ale nie znam sposobu na „wyświetlenie” tego, co jest w tty.

Jakieś pomysły?

użytkownik488244
źródło

Odpowiedzi:

16

Być może ten schemat może wyjaśnić sytuację. To jest zwykłe ustawienie:

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

I nie ma sposobu, aby podłączyć takie nowe Process3:

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

To, co robi ekran (i inne), to przydzielenie jakiegoś pseudo terminala (tak jak robi to Xterm) i przekierowanie go do jednego lub więcej „prawdziwych” terminali (fizycznych, wirtualnych lub emulowanych):

             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)

Za pomocą screen -xmożesz dołączyć jeszcze jeden terminal, xterm, cokolwiek (powiedzmy Terminal 3) do sesji ekranowej.

Więc nie, nie możesz komunikować się bezpośrednio przez stdin / stdout z procesami podłączonymi do innego terminala. Możesz to zrobić tylko poprzez proces kontrolujący ten terminal, jeśli zdarzy się, że jest to pseudo-terminal, i jeśli ten proces został do tego stworzony (tak jak screen).

Stéphane Gimenez
źródło
To świetne wytłumaczenie! Myślę, że tak naprawdę nie jest to odpowiedź, ale dobrze pasowałaby do tego pytania . Jedno spostrzeżenie: „nie ma mowy” jest prawdziwe tylko wtedy, gdy zabraniasz ptrace; dzięki ptrace, programy podoba neercs, rettyi tak dalej, może to zrobić czasem.
Gilles 'SO - przestań być zły'
@Gilles: dobrze robią coś innego: że zmiany wartości deskryptorów plików ( stdin, stdoutpo prawej stronie schematu) bezpośrednio przez porwanie proces. Czyste zło!
Stéphane Gimenez
1
Hmm, masz rację, zmieniają inną strzałkę. Zło, ale wygodne!
Gilles 'SO - przestań być zły'
8

Ponowne podłączenie procesów z drugiego terminala do bieżącego terminala nie jest możliwe bez brudnych sztuczek. Jest to możliwe, zmuszając proces do wykonywania określonych wywołań systemowych (z ptrace); powoduje to awarię niektórych programów. Istnieje kilka narzędzi, które to zrobić, takie jak neercs, retty, cryopid, reptyr, ...; zobacz Jak mogę odrzucić działający proces i powiązać go z nową powłoką ekranu? i powiązane pytania.

Innym problemem jest uzyskanie danych wyjściowych wyświetlanych już na drugim terminalu. Nie ma w pełni ogólnego rozwiązania: w zasadzie po renderowaniu danych wyjściowych terminal może przechowywać je tylko jako obraz. W praktyce wszystkie emulatory terminali X przechowują bufor wyjściowy w formie tekstowej, aby można go było skopiować i wkleić. Sposób pobrania tego wyjścia zależy od emulatora terminala; podstawową ideą jest symulacja wyboru całego bufora przewijania. W przypadku konsoli Linux, takiej jak /dev/tty1bufor przewijania, jest łatwo dostępny jako /dev/vcs1( /dev/vcsa1z atrybutami tekstowymi).

Prosta odpowiedź brzmi: jeśli chcesz ponownie połączyć się z terminalem z innego miejsca, użyj screenlub tmux.

Gilles „SO- przestań być zły”
źródło