Führen Sie den Befehl im aktiven Remote-Terminal aus

10

Angenommen, Sie haben einen Terminalemulator (T1) mit einer PID von 6350 geöffnet.

Geben Sie an einem anderen Terminal diesen Befehl ein (C1):

echo "ls\n" > /proc/6350/fd/0

Dies schreibt lsund die neue Zeile in T1 führt sie aber nicht aus. Warum?

Ich habe auch versucht, cat|bashmit zu verwenden, echo "ls\n" > /proc/catid/fd/0aber es wird immer noch nicht ausgeführt.

Wie kann ich den Befehl in ein anderes Terminal übertragen und ausführen lassen?

mögliche Antwort :

$ mkfifo toto;
$ bash < toto;
$ echo "ls" > toto;

In diesem Fall können Sie nicht mehr direkt in das Terminal schreiben (alles wird so angezeigt, wie der Befehl (C1) es in diesem Terminal angezeigt hat.

rvlander
quelle
Ich habe das gelesen, aber es ist nicht sehr hilfreich.
Rvlander
1
Es mag nicht "nützlich" sein, um Ihnen eine Möglichkeit zu geben, aber es beantwortet Ihre Frage: Sie können nicht. Sie könnten uns das Endziel mitteilen, das Sie erreichen möchten, und sehen, ob es einen anderen Weg gibt.
Kevin
Ok, Sie können nicht, aber warum wird der Text dann im anderen Terminal angezeigt?
Rvlander
weil Sie den Text an die Terminalschnittstelle senden, nicht an die Shell.
Eile

Antworten:

11

Es gibt ein Befehlszeilenprogramm ttyecho, das einen Befehl an ein anderes Terminal (tty / pts) senden und den Befehl ausführen lassen kann.

sudo ttyecho -n /dev/pts/5 ls

Siehe: Dienstprogramm zum Senden von Befehlen oder Daten an andere Terminals (tty / pts)

Siehe auch: ttyechoQuellcode auf Github .

Ein weiterer interessanter tty-Befehl ist selectorein interaktiver Echtzeit-Mustervergleich in der Konsole, der den tty-Eingabepuffer aktualisiert.

# selector examples
selector -v -x @ <(find . -maxdepth 2 -type d | awk '{print $0"@cd "$0}')
selector -v -x @ <(grep -E -o 'http[^ ]+' fileWithURLS)

Siehe: Selektor - DYNAMISCHE SUCHE IN KONSOLE

Tschad
quelle
Leider ttyechoscheint der Link zum Quellcode auf Github unterbrochen zu sein. Es scheint jedoch jetzt stattdessen unter github.com/osospeed/ttyecho verfügbar zu sein .
Wilson F
7

Wenn Sie eine Schreib auszustellen /dev/pts/X( /proc/6350/fd/0, 1und 2ist nur ein symbolischer Link auf das), was passiert ist , genau die gleiche Sache , die , wenn Prozess geschieht 6350(oder eines seiner Kinder, in geeigneter Weise gegabelt) gibt etwas: es an das Terminal schreibt.

Wenn Sie versuchen, von diesem Gerät ( ) zu lesen , cat < /dev/pts/Xpassieren funky Dinge. Sie sollten sehen, dass die Dinge, die Sie in die ursprüngliche Shell eingeben, angezeigt werden. (Möglicherweise erst nach der ersten neuen Zeile, die Sie eingegeben haben - ich vermute, das Terminalprogramm ( xtermoder was auch immer Sie verwenden) führt eine Zeilenpufferung durch, und die 6350Shell, auf der blockiert wurde, readerhält dieses Teil; dann kann entweder die Shell oder möglicherweise nicht, gewinne die nachfolgenden Lesungen, aber ich könnte sehr wohl völlig falsch liegen.)

Die Sache ist: Wenn Sie von diesem Gerät lesen oder darauf schreiben, sprechen Sie nicht mit der anderen Shell, die es verwendet. Sie sprechen zum xtermBeispiel mit dem Terminalemulator . Nur der Terminalemulator kann Daten in diesen Kanal einspeisen (was die Shell liest), und alles, was die Shell schreibt, geht an das Terminal. Das Anbringen einer zweiten Shell ändert daran nichts.

Wenn Sie Befehle in diesen 6530Prozess einfügen möchten, muss dies über das Terminal erfolgen (unabhängig davon, ob es sich um eine X11-App oder etwas anderes handelt).

Empfohlene Lektüre: Was ist der genaue Unterschied zwischen einem "Terminal", einer "Shell", einem "tty" und einer "Konsole"?

Matte
quelle
1
Interessanterweise bekomme ich beim Lesen von den Punkten (die cat /dev/pts/xSie nicht brauchen <) die Buchstaben streng abwechselnd zwischen den Terminals.
Kevin
Wenn Sie die Umleitung nicht verwenden, ändert sich wahrscheinlich nicht viel. Ich bekomme so oder so eine nicht vorhersehbare Ausgabe.
Mat
Interessant, danke für den Link. So /proc/6350/fd/0ist ein Simlink zu dem stdin-Elternteil, process 6350dessen Terminal ein Terminal ist. Ich denke, es ist das gleiche für Anwendungen mit Fenster?
Rvlander