Виконати команду у віддаленому активному терміналі


10

Припустимо, у вас відкритий термінальний емулятор (T1) з PID 6350.

З іншого терміналу введіть цю команду (C1):

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

Це пише lsі новий рядок у T1, але не виконує його. Чому?

Я також спробував використовувати cat|bashз , echo "ls\n" > /proc/catid/fd/0але вона до цих пір не виконується.

Як я можу повторити команду в інший термінал і виконати команду?

можлива відповідь:

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

У цьому випадку ви більше не можете писати безпосередньо в термінал (все відображається так само, як команда (C1) відображала річ у цьому терміналі.



Я це читав, але це не дуже допомагає.
rvlander

1
Це може бути не "корисним", як у наданні вам способу зробити це, але це відповідає на ваше запитання: ви не можете. Ви можете сказати нам кінцеву мету, яку ви намагаєтеся досягти, і побачити, чи є інший спосіб.
Кевін

Гаразд, ви не можете, але чому тоді текст відображається в іншому терміналі?
rvlander

тому що ви надсилаєте текст до термінального інтерфейсу, а не до оболонки.
пік

Відповіді:


11

Викликається утиліта командного рядка, ttyechoяка може надіслати команду до іншого терміналу (tty / pts) і виконати команду.

sudo ttyecho -n /dev/pts/5 ls

Див.: Утиліта для надсилання команд або даних на інші термінали (tty / pts)

Також дивіться: ttyechoвихідний код на github .

Ще одна цікава команда tty - selectorце інтерактивна відповідна схема малюнків у консолі, яка оновлює вхідний буфер tty.

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

Див.: Селектор - ДИНАМІЧНИЙ ПОШУК У КОНСОЛІ


На жаль, посилання на ttyechoвихідний код на Github, здається, порушено. Однак, здається, зараз це доступно на веб- сайті github.com/osospeed/ttyecho .
Вілсон F

7

Коли ви видаєте записи в /dev/pts/X( /proc/6350/fd/0, 1і 2це просто символічна до цього), що відбувається в точності те ж саме , що відбувається , коли процес 6350(або один з його дітей, відповідно роздвоєний) Виходи що - то: він пише термінал.

Якщо ви спробуєте прочитати з цього пристрою ( cat < /dev/pts/X), трапляться неприємні речі. Ви повинні побачити те, що ви вводите в оригінальній оболонці. (Цілком можливо, тільки після першого нового рядка, який ви ввели - я здогадуюсь, що програма терміналу ( xtermабо все, що ви використовуєте) робить деяку буферизацію рядків, і 6350оболонка, яка була заблокована, readотримує цей фрагмент; тоді або оболонка може, або може ні, не виграйте наступні читання, але я, можливо, цілком помиляюся з цього приводу.)

Річ у тім: ви читаєте з цього пристрою чи записуєте його на цей пристрій, ви не розмовляєте з іншою оболонкою, яка ним користується. Ви розмовляєте з емулятором терміналу ( xtermнаприклад). Лише емулятор терміналу може вводити дані в цей канал (те, що читає оболонка), і все, що пише оболонка, йде в термінал. Приєднання другої оболонки цього не змінює.

Якщо ви хочете ввести команди в цей 6530процес, доведеться це зробити через термінал (будь то додаток X11 або щось інше).

Рекомендоване читання: Яка точна різниця між 'терміналом', 'оболонкою', 'tty' та 'консоллю'?


1
Цікаво, що читаючи з пунктів ( cat /dev/pts/xвам не потрібно <), я отримую букви суворо чергуючись між терміналами.
Кевін

Невикористання перенаправлення, ймовірно, не сильно зміниться. У будь-якому випадку я отримую непередбачуваний вихід.
Мат

Цікаво, дякую за посилання. Таким чином, /proc/6350/fd/0є посиланням на батьківський елемент stdin, process 6350який є терміналом. Я думаю, що це те саме для віконних програм?
rvlander
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.