Перенаправление ввода Linux через proc fd0, dev / pts

#linux #shell #proc #pts

#linux #оболочка #proc #pts

Вопрос:

В Ubuntu 13.04 с использованием VMware у меня есть два терминала (PID 1000 — / dev / pts0, PID 2000 — / dev / pts2) Если я сделаю это с терминала 2 (/ dev /pts2)…

 echo 'ls -al' > /proc/1000/fd/0
 

Я вижу, что ‘ls -al’ запрашивает в терминале 0 (/ dev /pts0)
однако это всего лишь визуальный результат, а не реальный ввод команды для терминала 0.

введите описание изображения здесь

Я хочу перенаправить фактический ввод команды с терминала 2 на терминал 0 через /proc/pid (terminal 0’s)/ fd/0 и выполнить команду с терминала 0.

Возможно ли это ??, если да, то как я могу это сделать?

заранее благодарю вас.

Ответ №1:

Это невозможно, потому что bash выполняет две вещи, когда <ENTER> происходит событие клавиатуры.

  1. Печать новой строки.
  2. Выполнение введенной команды, если команда завершена.

Логика, когда команда завершена, не проста. Это зависит от условных выражений, обратной косой черты и т. Д.

Перенаправление символа ‘ n’ на стандартный интерфейс будет выполнять только первый шаг. Я думаю, это невозможно по замыслу, потому что оболочка, которая может управляться другой оболочкой, ужасна для каждого инженера по безопасности.

В многопользовательском linux вы сможете писать и выполнять команды в оболочках, которые выполняются разными пользователями (например, root). Вы можете делать неприятные вещи (например, обвинять других пользователей в совершении запрещенных действий).

Если вам все еще нужно решение:

Вы могли бы написать скрипт, который считывает команды из канала и выполняет их под другим пользователем, но будьте осторожны: это небезопасно.

Ответ №2:

Существует разница между терминалом и оболочкой. Когда вы видите окно pts, там работают как эмулятор терминала (pts), так и оболочка (bash). Bash считывает строки с устройства pts и выполняет команды. Bash записывает свой стандартный вывод / stderr обратно в устройство pts, и программы, запущенные bash, делают то же самое. Но сам pts — это просто прославленный последовательный терминал. Он отображает символы, записанные в нем, и вы (bash) можете читать введенные в него символы. Обычно он также отображает (отображает) введенные символы.

Когда вы записываете в устройство pts с другого терминала, оно отображает символы, но эти символы не могут быть прочитаны с устройства pts. Вы (bash) можете читать из pts только то, что вводит пользователь.

Сбивает с толку то, что отображение символов, записанных в устройство pts (это то, что вы пробовали), и повторение введенных символов выглядят точно так же.