Wie kann ich zwischen ttys wechseln, ohne den Bildschirm zu verwenden?

17

Nehmen wir also an, Sie starten Ihre Linux-Installation bis zum Desktop. Sie starten ein Gnome-Terminal / konsole / whatever, damit Sie ein tty haben, zu dem Sie Befehle eingeben können.

Nehmen wir nun an, ich stelle SSH in dieselbe Maschine. Es wird mich an eine andere Nummer binden, an die ich Befehle eingeben kann.

Angenommen, ich möchte mein tty von meinem ursprünglichen SSH auf das zuvor gestartete gnome-terminal "umstellen".

Grundsätzlich frage ich, ob es eine Möglichkeit gibt, dasselbe zu tun, screen -xaber ohne Bildschirm?

Ich weiß, dass Sie einfach eine Ausgabe an das andere Tty senden können, indem Sie etwas in die / dev-Datei zurückschreiben, aber ich kenne keine Möglichkeit, die Inhalte des Tty anzuzeigen.

Irgendwelche Ideen?

user488244
quelle

Antworten:

16

Vielleicht kann dieses Schema die Situation klären. Dies ist die übliche Einstellung:

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

Und es gibt keine Möglichkeit, neue Process3wie diese einzustecken :

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

Der Bildschirm (und andere) weist ein Pseudo-Endgerät (wie xterm) zu und leitet es zu einem oder mehreren "realen" Endgeräten (physisch, virtuell oder emuliert) um:

             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)

Mit können screen -xSie ein weiteres Terminal (xterm Terminal 3) an die Bildschirmsitzung anschließen.

Nein, Sie können nicht direkt über stdin / stdout mit Prozessen kommunizieren, die an ein anderes Terminal angeschlossen sind. Sie können dies über den Prozess, der dieses Terminal steuert, nur dann tun, wenn es sich zufällig um ein Pseudoterminal handelt und wenn dieser Prozess dafür vorgesehen ist (wie dies bei screen der Fall ist).

Stéphane Gimenez
quelle
Das ist eine großartige Erklärung! Ich denke, das ist hier keine wirkliche Antwort, würde aber gut zu dieser Frage passen . Eine Bemerkung: „Es gibt keinen Weg“ ist nur wahr, wenn Sie es verbieten ptrace. Dank ptrace, Programmen wie neercs, rettyund so weiter kann es manchmal sein.
Gilles 'SO - hör auf, böse zu sein'
@Gilles: gut tun sie etwas anderes: sie den Wert der Dateideskriptoren ändern ( stdin, stdoutauf der rechten Seite des Schemas) direkt durch den Prozess Hijacking. Das Pure Böse!
Stéphane Gimenez
1
Hmm, du hast recht, sie ändern einen anderen Pfeil. Böse, aber bequem!
Gilles 'SO - hör auf, böse zu sein'
8

Das erneute Verbinden der Prozesse auf dem anderen Terminal mit Ihrem aktuellen Terminal ist ohne schmutzige Tricks nicht möglich. Es ist möglich, indem der Prozess gezwungen wird, bestimmte Systemaufrufe (mit ptrace) auszuführen . Dies führt dazu, dass einige Programme abstürzen. Es gibt verschiedene Tools , die dies tun, wie neercs, retty, cryopid, reptyr, ...; Siehe Wie kann ich einen laufenden Prozess deaktivieren und ihn einer neuen Bildschirmshell zuordnen? und verknüpfte Fragen.

Ein anderes Problem besteht darin, die bereits auf dem anderen Terminal angezeigte Ausgabe abzurufen. Es gibt keine allgemein gültige Lösung: Sobald die Ausgabe gerendert wurde, speichert das Terminal sie möglicherweise nur als Bild. In der Praxis behalten alle X-Terminal-Emulatoren ihren Ausgabepuffer in Textform bei, damit Sie ihn kopieren und einfügen können. Wie diese Ausgabe abgerufen wird, hängt vom Terminalemulator ab. Die Grundidee besteht darin, die Auswahl des gesamten Scrollback-Puffers zu simulieren. Für eine Linux-Konsole wie z. B. /dev/tty1ist der Scrollback-Puffer leicht verfügbar als /dev/vcs1(und /dev/vcsa1mit Textattributen).

Die einfache Antwort lautet: Wenn Sie die Verbindung zu einem Terminal von einem anderen Ort aus wiederherstellen möchten, verwenden Sie screenoder tmux.

Gilles 'SO - hör auf böse zu sein'
quelle