So senden Sie Ausgaben von einem Terminal zu einem anderen, ohne eine neue Pipe oder Datei zu erstellen

26

Ich mache nur ein bisschen rum auf meinem Terminal (Gnome-Terminal). Ich habe mich gefragt, ob es eine Möglichkeit gibt, die Ausgabe eines Terminals an ein anderes zu senden, ohne eine neue Datei oder Pipe erstellen zu müssen.

Beispiel: Auf dem ersten Terminal starte ich lsund möchte, dass seine Ausgabe auf dem zweiten Terminal angezeigt wird (mit oder ohne Verwendung eines Befehls auf dem zweiten Terminal).

Edward Torvalds
quelle
was hast du? Hast du etwas ausprobiert? Können Sie einige Beispiele nennen?
Tachomi
@ Tachomi auf dem ersten Terminal Ich starte lsund möchte, dass seine Ausgabe auf dem zweiten Terminal angezeigt wird (mit oder ohne Verwendung eines Befehls auf der zweiten)
Edward Torvalds

Antworten:

30

Wenn beide Terminals demselben Benutzer gehören, können Sie Ihre Ausgabe an das virtuelle Gerät senden, das als Tty des jeweiligen Terminals verwendet wird.

Sie können also die Ausgabe von verwenden w, die die TTY-Informationen enthält, und direkt auf dieses Gerät schreiben.

ls > /dev/pts/7

(Wenn das von erwähnte Gerät wpts / 7 war)

Eine andere Möglichkeit besteht darin, die Nummer eines Prozesses zu verwenden, der mit diesem Gerät verbunden ist. Senden Sie Ihre Ausgabe an /proc/<process number>/fd/1.

ls > /proc/5555/fd/1

Angenommen, Sie haben die Prozessnummer gefunden, die in diesem Terminal ausgeführt wird.

Beachten Sie, dass dieses direkte Schreiben nur zulässig ist, wenn der Benutzer, der versucht zu schreiben, derselbe Benutzer ist, dem das andere Terminal gehört .

RealSkeptic
quelle
Ich bekomme nicht /dev/pts/7oder ähnlich mit wBefehl, aber der zweite Weg funktioniert für mich
Edward Torvalds
2
@edwardtorvalds Das /proc/XXX/fd/1ist im Allgemeinen eine weiche Verbindung zum Basisgerät. Versuchen Sie es mit ls -l /proc/XXXX/fd/1und sehen Sie, worauf es zeigt. Hat es etwas mit dem zu tun, was im wBefehl steht?
RealSkeptic
Ich beziehe mich nicht auf wBefehl mit /proc/XXX/fd/0Ich beziehe mich auf wBefehl mit/dev/pts/7
Edward Torvalds
4
@ edwardtorvalds Ich sage, dass sie verbunden sind, da /proc/XXX/fd/1dies eine weiche Verbindung zu dem Gerät sein soll, das der wBefehl anzeigt. Was ist die Ausgabe ls -ldavon?
RealSkeptic
TTY-Informationen können auch in der Ausgabe von tty(nur aktuell) oder who(alle) gefunden werden.
Nick Volynkin
14

Sie können den writeBefehl verwenden.

Führen Sie, wie @MelBurslan kommentierte, Folgendes aus, wenn die Schreibberechtigung deaktiviert ist:

 $ mesg y

Von man mesg

OPTIONEN

y Erlauben Sie den Schreibzugriff auf Ihr Terminal.

Verwendung von write:

$ write username tty

zB lsAusgabe an anderes Terminal senden .

$ w
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
user     :0       :0               08:15   ?xdm?   7:37   0.25s init --user
user     pts/0    :0               08:19    1.00s  0.09s  0.01s w
user     pts/12   :0               08:50   54.00s  0.03s  0.03s bash

$ ls | write username pts/12
Tachomi
quelle
Unter Arch Linux wird im Gnome-Terminal der wBefehl ausgegeben, edward tty2 19:53 6:05 2:48 23.12s firefoxund wenn ich schreibe, ls | write edward tty2erhalte ich keine Ausgabe, sondern einen Piepton
Edward Torvalds
@edwardtorvalds Du hast veröffentlicht, dass du edwarddanstatt getippt hast edward?
Tachomi
auch wenn ich es auf tty5 versuche (Strg + Alt + 5) bekomme ich eine Fehlermeldungyou have turned write permission off
Edward Torvalds
Das war ein Tippfehler auf dieser Seite
Edward Torvalds
Versuchen Sie den mesg yBefehl auf dem Zielterminal, bevor Sie den Befehl
ausführen
7

Ich habe eine ähnliche Methode gefunden.

Am ersten Terminal :

 $ tty
 /dev/pts/0
 $ <no need to run any command here, just see the output>

Am zweiten Terminal :

$ ls > /dev/pts/0

Jetzt erhalten Sie die Ausgabe am ersten Terminal

Edward Torvalds
quelle
1
tail -fstatt catkönnte nützlich sein
Tachomi
3
@ Tachomi tatsächlich gibt es keine Notwendigkeit für einen Befehl, um die Ausgabe zu lesen
Edward Torvalds
4

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.

Vitalie Ghelbert
quelle
Diese Antwort ist auch gut
Edward Torvalds
0

Sie können an das TTY des Terminals schreiben. beispielsweise:

in terminal 1:

$ tty 
ttys000

in terminal 2:

$ tty
ttys029

$ exec &> >(tee >(cat >&/dev/ttys000))
ls 

Die Ausgabe wird in beiden Terminals auch während der Eingabe in Echtzeit angezeigt.

Funktioniert unter Linux und MacOS. Der macOS TTY-Pfad lautet, /dev/{number}während er unter Linux ausgeführt wird/dev/pts/{number}

Miguel Mota
quelle
Die Ausführung exec &> >(tee >(cat >&/dev/ttys000))ist nicht vorhanden, so dass keine Eingabe möglich ist.
Edward Torvalds
@ EdwardTorvalds auf Linux ttywird so etwas wie/dev/pts/0
Miguel Mota
Ja,
Edward Torvalds,
@EdwardTorvalds Welcher Befehl existiert nicht?
Miguel Mota
Ihr Befehl exec &> >(tee >(cat >&/dev/pts/1)). Es funktioniert keine Steuertastenkombination (Strg + C). Ich muss das Terminal töten, um auszusteigen
Edward Torvalds
-3

Sie können wallauch verwenden:

$ wall "Message here"
Mahesh Morankar
quelle
Vielleicht möchten Sie es im Detail beschreiben. Ich verstehe nichts davon
Edward Torvalds
3
Sie möchten es definitiv nicht verwenden wall(kurz für "Write All"), da es in jede angemeldete Sitzung schreibt, einschließlich der Sitzung, von der Sie senden. Stattdessen writeermöglicht using die Deklaration einer bestimmten tty.
Monty Harder