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).


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 .


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

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


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.


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}


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


@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"

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
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.