Выполнить команду в удаленном активном терминале

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
источник
Я читал это, но это не очень полезно.
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 .
Уилсон Ф,
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же как и ссылка на родителя стандартного ввода, process 6350терминалом которого является. Я думаю, это то же самое для оконных приложений?
rvlander