Wykonaj polecenie w zdalnym aktywnym terminalu

10

Załóżmy, że masz otwarty emulator terminala (T1) z PID 6350.

Z innego terminala wpisz polecenie (C1):

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

To zapisuje lsi nowy wiersz w T1, ale go nie wykonuje. Dlaczego?

Próbowałem również używać cat|bashz, echo "ls\n" > /proc/catid/fd/0ale nadal nie jest wykonywany.

Jak mogę powtórzyć polecenie w innym terminalu i wykonać polecenie?

możliwa odpowiedź :

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

W takim przypadku nie można już pisać bezpośrednio w terminalu (wszystko jest wyświetlane w ten sam sposób, co polecenie (C1) wyświetlało w tym terminalu.

Rlandlander
źródło
Przeczytałem to, ale nie jest to bardzo pomocne.
rvlander
1
Może to nie być „przydatne”, ponieważ pozwala ci to zrobić, ale odpowiada na twoje pytanie: nie możesz. Możesz powiedzieć nam cel końcowy, który próbujesz osiągnąć, i sprawdzić, czy istnieje inny sposób.
Kevin
Ok, nie możesz, ale dlaczego tekst jest wyświetlany w drugim terminalu?
rvlander
ponieważ wysyłasz tekst do interfejsu terminala, a nie do powłoki.
pędzi

Odpowiedzi:

11

Istnieje narzędzie wiersza polecenia, ttyechoktóre może wysłać polecenie do innego terminala (tty / pts) i wykonać polecenie.

sudo ttyecho -n /dev/pts/5 ls

Zobacz: Narzędzie do wysyłania poleceń lub danych do innych terminali (tty / pts)

Zobacz także: ttyechokod źródłowy na github .

Innym interesującym poleceniem tty jest selectorinteraktywny dopasowywanie wzorców w czasie rzeczywistym w konsoli, które aktualizuje bufor wejściowy tty.

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

Patrz: selektor - WYSZUKIWANIE DYNAMICZNE W KONSOLI

Czad
źródło
Niestety, link do ttyechokodu źródłowego na github wydaje się być zepsuty. Jednak wydaje się , że teraz jest dostępny na github.com/osospeed/ttyecho .
Wilson F
7

Po wydaniu zapisu do /dev/pts/X( /proc/6350/fd/0, 1i 2jest po prostu dowiązaniem do tego), co się dzieje, jest dokładnie to samo, co się dzieje, gdy proces 6350(lub jednego z jego dzieci, odpowiednio rozwidlony) Wyjścia coś: to pisze do terminalu.

Jeśli spróbujesz czytać z tego urządzenia ( cat < /dev/pts/X), wydarzy się coś dziwnego. Powinieneś zobaczyć rzeczy, które wpisujesz w oryginalnej powłoce. (Całkiem możliwe, że dopiero po wpisaniu pierwszego nowego wiersza - Zgaduję, że program terminalowy ( xtermlub cokolwiek, którego używasz) wykonuje buforowanie linii, a 6350powłoka, która została zablokowana, readpobiera ten kawałek; wtedy albo powłoka może, albo może nie, wygrywaj kolejne odczyty, ale równie dobrze mogę się mylić.)

Chodzi o to, że kiedy czytasz lub piszesz na tym urządzeniu, nie rozmawiasz z inną powłoką, która go używa. Rozmawiasz z emulatorem terminala ( xtermna przykład). Tylko emulator terminala może wstrzykiwać dane do tego kanału (co odczytuje powłoka), a wszystko, co powłoka zapisuje, trafia do terminala. Dołączenie drugiej powłoki tego nie zmienia.

Jeśli chcesz wprowadzić polecenia do tego 6530procesu, będzie musiał to zrobić za pośrednictwem terminala (niezależnie od tego, czy jest to aplikacja X11, czy coś innego).

Zalecana lektura: Jaka jest dokładna różnica między „terminalem”, „powłoką”, „tty” i „konsolą”?

Mata
źródło
1
Co ciekawe, czytając z pts ( cat /dev/pts/xnie potrzebujesz <) otrzymuję litery ściśle na przemian między terminalami.
Kevin
Nieużywanie przekierowania prawdopodobnie niewiele się zmieni. Tak czy inaczej otrzymuję nieprzewidywalne wyjście.
Mat
Ciekawe, dzięki za link. Podobnie /proc/6350/fd/0jest z prostym linkiem do standardowego elementu nadrzędnego, process 6350którego terminalem jest. Myślę, że to samo dotyczy aplikacji okienkowych?
rvlander