Wie kann ich den Ausgang eines Terminals von einem anderen Terminal aus verbinden?


45

Ich muss die Ausgabe des aktuell laufenden Terminals (tty1) vom virtuellen Terminal aus einbinden und erfassen (laufender X-Server).


5
Ich verstehe zwar, dass manchmal nach der Ausführung eines Befehls die Notwendigkeit besteht, Inhalte auf einem anderen Tty zu erfassen, eine Unze Prävention ist jedoch eine Heilung wert. Daher sollten Sie immer in Betracht ziehen, einen Befehl zu verwenden screenoder tmuxvor dem Starten eines Befehls, auf den Sie möglicherweise von einem anderen Terminal aus zugreifen möchten .
Depquid

Und wenn Sie es vorher vorbereiten können, wäre vielleicht auch tmate ein netter Kandidat, der sogar über das Internet funktioniert und nicht nur lokal. (und hat optionalen Schreibzugriff)
Rugk

Antworten:


23

Ich bin auf dieses Tool namens gestoßen ttylog. Es ist ein Perl-Programm, das auf CPAN hier verfügbar ist . Es hat ein paar Vorbehalte, einer davon ist, dass ich nur herausfinden konnte, wie ich an ein Terminal anschliessen soll, das als Teil von jemandem erstellt wurde, der sich in meine Box schiebt. Das andere ist, dass Sie es mit erhöhten Rechten ausführen müssen (zB root oder sudo).

Aber es funktioniert!

Zum Beispiel

Erste ssh in Ihre Box in TERM # 1:

TERM#1% ssh saml@grinchy

Beachten Sie die tty dieses neuen Terminals:

TERM#1% tty
/dev/pts/3

Führen Sie nun in einem anderen Terminal (TERM # 2) diesen Befehl aus:

TERM#2% ttylog pts/3
DEBUG: Scanning for psuedo terminal pts/3
DEBUG: Psuedo terminal [pts/3] found.
DEBUG: Found parent sshd pid [13789] for user [saml]

Kehren Sie nun zu TERM # 1 zurück und geben Sie Zeug ein. Es wird in TERM # 2 angezeigt.

ss von Terminals

Alle Befehle, die ich ausprobiert habe (top, ls usw.), funktionierten ohne Zwischenfälle ttylog.


Genau das, wonach ich gesucht habe (ich habe es in der Vergangenheit benutzt, aber den Namen vergessen und konnte mich nicht erinnern). Vielen Dank, ich habe vorübergehend die Dirty-Option (GDB- und Output-Replikation) verwendet.
Pruzinat

Ja, das gdbwar die erste Option, auf die ich gestoßen bin. Ich habe sie in der Vergangenheit selbst verwendet, aber für mich ist sie zumindest verrückt. Ich bin froh, dass dir das geholfen hat!
SLM

1
ttylog kann sich aber nicht an den richtigen Prozess anhängen - kann jemand meine Frage beantworten: serverfault.com/questions/560972/…
LittleBobbyTables

21

Tatsächlich ist es. Die Geräte / dev / vcs * und / dev / vcsa * entsprechen den Geräten / dev / tty * (den virtuellen Terminals). F1 = tty1 = vcs1 / vcsa1 und so weiter. Das vcs / vcsa entspricht tty für das "aktuelle" virtuelle Terminal.

Als Root können Sie diese Geräte einfach katzen (z. B. cat / dev / vcs2) und sehen, was sich auf der entsprechenden VT befindet (z. B. / dev / tty2, das an auf F2), wie ein Schnappschuss. vcsa * unterscheidet sich von vcs * darin, dass sie Informationen zu den Abmessungen des Terminals (des Bildschirms) enthalten. Wohlgemerkt, es handelt sich nur um eine Momentaufnahme der Charaktere, die auf dem Bildschirm angezeigt werden. Diese stammen aus dem dem Terminal zugewiesenen Speicher. Erwarten Sie also keine netten, leicht zu verarbeitenden Ausgaben.

Der Nachteil ist, dass die Erfassung möglicherweise schwierig ist, wenn die Informationen zu schnell vergehen. Vielleicht funktioniert Tail -f / dev / vcs1, wenn Sie mehreren Screenfulls folgen müssen (haben mich nicht ausprobiert)? Es kann am einfachsten sein, es zuerst in eine Datei umzuleiten. Es kann auch sinnvoll sein, einen Spannungswandler (F1-F6) zu verwenden, da die Klemmen die gleichen Abmessungen haben. Nach meiner Erfahrung ist es am besten, die vcs * - und nicht die vcsa * - Geräte zu verwenden.

Wenn dies nicht funktioniert, funktioniert möglicherweise eines der "großen Brüderchen" -Pakete, mit denen ein Administrator die Aktivität auf einem Terminal im Auge behalten kann.

PS: Ich habe vergessen zu fragen, welches Betriebssystem Sie verwenden. Dies gilt für Linux, obwohl ähnliche Geräte wahrscheinlich auch auf anderen Betriebssystemen vorhanden sind. Versuchen Sie, in den Manpages für Geräte nach "Virtual Console Memory" zu suchen.


Gibt es eine Möglichkeit, Eingaben von ssh in tty1 einzufügen? Zum Beispiel muss ich mit einem Himbeer-Pi arbeiten, auf dem Debian läuft, aber das Problem ist, dass es nur einen USB-Port hat, der vom WLAN-Adapter belegt wird und ich daher keine Tastatur anschließen kann, um tty1 damit zu verwenden. Da ich ein Skript ausführen muss, das während des Ausführungsprozesses heruntergefahren wird wlan0, habe ich tatsächlich eine Catch-22-Situation, in der versucht wird, ein Debugging durchzuführen, bei dem dieses Skript fehlschlägt. Angenommen, ich kann keinen USB-Hub verwenden. Gibt es eine Möglichkeit, Zeichen in / dev / tty1 zu leiten?
Steven Lu

2
Gut. Ich kann Sachen /dev/tty1als root weiterleiten, aber das alles ist, die Zeichen auf dem Bildschirm anzuzeigen, nicht sie einzugeben
Steven Lu

1
Entschuldigung, wenn das nur Lärm ist. es ist nicht wirklich 100% relevant. Aber ich beantwortete meine Frage im Kommentar oben mit diesem
Steven Lu

18

ansehen:

man 1 script

zum Beispiel:

script -f /dev/tty1

Ich habe danach gesucht. Der Versuch, daran festzuhalten, screenschlug kläglich fehl. Es klappt.
SDKKS

5

Verwenden Sie den ttyBefehl in jedem Terminal, um sie zu identifizieren:

$ tty
/dev/pts/0

$ tty
/dev/pts/1

Unter der Annahme, dass diese TTYs die Standardausgabe der ersten auf die zweite umleiten, führen Sie diese im ersten Terminal aus:

exec 1>/dev/pts/1

Hinweis: Jetzt wird jede Befehlsausgabe auf pts / 1 angezeigt

So stellen Sie das Standardverhalten stdout von pts / 0 wieder her:

exec 1>/dev/pts/0

In diesem Video sehen Sie eine Demonstration.


2

Das hat bei mir funktioniert:

  • Führen Sie unter Verwendung einer Tastatur auf Computer "A" (dh dem physischen Computer, der gesteuert werden soll) Folgendes aus: screen -q

  • Stellen Sie eine Verbindung sshvon Computer "B" zu Computer "A" her.

  • Geben Sie in der SSH-Sitzung Folgendes ein:, screen -lsum eine Sitzungs-ID zu erhalten, mit der eine Verbindung hergestellt werden soll (4 Ziffern in der Zeile, die tty enthält ).

  • Stellen Sie eine Verbindung zur obigen Sitzung her, screen -x <session id>indem Sie : ... die Sitzungs-ID verwenden, die Sie vom screen -lsobigen Befehl erhalten haben.

Alles, was in einer "Sitzung" eingegeben wird, passiert in beiden "Sitzungen". screen -dWenn Sie also zum Beispiel tippen, werden BEIDE Sitzungen beendet.


1

Ein weiterer Ansatz ist die Verwendung des Gnu- screenDienstprogramms auf Ihrem lokalen Computer. Rufen Sie es mit der -LOption auf oder starten Sie es ohne diese Option und verwenden Sie die ^aHBefehlssequenz. Bei beiden Vorgehensweisen werden alle Ein- und Ausgaben in einer Datei mit dem Namen protokolliert, screenlog.xwobei x die Bildschirmnummer ist.

Dies ist praktisch, da auf dem Remotecomputer nichts zusätzliches installiert werden muss.


1

Da ich tty1 nicht mit screen gestartet habe, hat dieses Skript geholfen:

Ich habe die Antwort von Baard Kopperud oben verwendet. "128" ist 1 Zeile meines tty1. Der Ruhezustand kann auf eine geeignete Anzahl eingestellt werden.

#!/bin/bash
while true
do
    sudo tail -c 128 /dev/vcs1 && echo ""
    sleep 10
done

Ich habe dies im Terminator verwendet und die Spalte so bemessen, dass die Schriftrolle eine Textzeile enthält.


Vielen Dank für die Idee, auf der Rasperry musste ich einfach '' 'cat / dev / vcs beobachten' ''. Und ich habe gerade mein Gnome-Terminal angepasst, ich habe es auf eine Breite von 80 Zeichen eingestellt.
Axkibe

0

Öffnen Sie zwei Terminals. Geben Sie ttyjeweils ein und Sie erhalten die ID als/dev/pts/nº

Dann tippst du in der ersten script -f /dev/pts/nºofSecondTerminalund in der zweiten das Gegenteil, script -f /dev/pts/nºofFirstTerminaldamit sie verbunden werden

Glückwunsch! Beide Terminals geben das gleiche Material aus und empfangen es. Benötigen Sie einen dritten? Hast du Kombinationen studiert? Sie benötigen 6 script -fBefehle. Noch mehr? Bald...

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.