Ekran kullanmadan tty'ler arasında nasıl geçiş yapabilirim?


17

Diyelim ki Linux kurulumunuzu masaüstüne kadar başlattınız. Komutları girmek için bir tty'niz olması için bir gnome-terminal / konsole / başlattınız.

Şimdi diyelim ki aynı makineye SSH. Komutları girmek beni başka bir tty'ye bağlayacak.

Şimdi diyelim ki tty'mi orijinal SSH'mdan daha önce başlatılan gnome-terminaline çevirmek istiyorum.

Temelde ben de aynı şeyi screen -xekran olmadan yapmak için herhangi bir yolu olup olmadığını soruyorum ?

Kolayca / dev dosyasına bir şey yankılanarak diğer tty çıktı kolayca gönderebilirsiniz biliyorum, ama tty ne 'görüntülemek' için bir yol bilmiyorum.

Herhangi bir fikir?



Yanıtlar:


16

Belki bu şema durumu açıklığa kavuşturabilir. Bu olağan ayardır:

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

Ve bunun gibi yeni bir fiş takmanın yolu yokProcess3 :

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

Ekranın (ve diğerlerinin) yaptığı, bazı sahte terminal cihazlarını (xterm gibi) tahsis etmek ve bir veya daha fazla "gerçek" terminale (fiziksel, sanal veya emüle edilmiş) yönlendirmektir:

             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)

Kullanarak screen -xbir terminal daha, xterm, her neyse ekleyebilirsinizTerminal 3 ekran oturumuna .

Yani hayır, farklı bir terminale bağlı süreçlerle doğrudan stdin / stdout üzerinden iletişim kuramazsınız. Bunu sadece bu terminali kontrol eden işlem yoluyla sözde bir terminal olduğunda ve bu işlemin yapılması gerektiği düşünülüyorsa (ekran gibi) yapabilirsiniz.


Bu harika bir açıklama! Bence bu gerçekten bir cevap değil ama bu soruya çok yakışacaktı . Bir gözlem: “hiçbir yolu yoktur” sadece yasakladıysanız doğrudur ptrace; sayesinde ptrace, programlar gibi neercs, rettyvb bazen yapabilirsiniz.
Gilles 'SO

@Gilles: iyi onlar başka bir şey yapmak: onlar (dosya tanımlayıcıları değerini değiştirmek stdin, stdoutdoğrudan sürecini kaçırma tarafından şemanın sağda). Saf kötülük!
Stéphane Gimenez

1
Hmm, haklısın, farklı bir oku değiştirdiler. Kötü, ama kullanışlı!
Gilles 'SO

8

Kirli numaralar olmadan diğer terminaldeki işlemleri mevcut terminalinize yeniden bağlamak mümkün değildir. İşlemi belirli sistem çağrılarını (ile ptrace) yapmaya zorlayarak mümkündür ; bu bazı programların çökmesine neden olur. Bunu yapmak çeşitli araçlar vardır gibi neercs, retty, cryopid, reptyr, ...; bkz. Çalışan bir işlemi nasıl reddedebilir ve yeni bir ekran kabuğuyla ilişkilendirebilirim? ve bağlantılı sorular.

Diğer terminalde zaten görüntülenen çıkışı elde etmek farklı bir sorundur. Tamamen genel bir çözüm yoktur: prensip olarak, çıktı verildikten sonra, terminal bunu sadece bir görüntü olarak saklayabilir. Pratikte, tüm X terminal emülatörleri çıktı tamponunu metin biçiminde tutar, böylece kopyalayıp yapıştırabilirsiniz. Bu çıktıyı yakalamanın yolu terminal emülatörüne bağlıdır; temel fikir tüm geri kaydırma arabelleğinin seçilmesini simüle etmektir. Gibi bir Linux konsolu için /dev/tty1, geri kaydırma arabelleği /dev/vcs1(ve /dev/vcsa1metin öznitelikleriyle) kolayca kullanılabilir .

Bunun basit cevabı, farklı bir yerden bir terminale yeniden bağlanmak istiyorsanız, screenveya tuşunu kullanın tmux.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.