перенаправить стандартный ввод с другого терминала с помощью Bash

Мне интересно, как можно было бы перенаправить стандартный ввод сценария из текущего сеанса xterm, то есть /dev/pts/0, на тот, который также работает, то есть /dev/pts/1, используя bash? У меня есть сценарий bash, который открывает 3 окна xterm, и я хочу получить данные только из одного из этих окон, и я не могу понять, как это сделать. Любая помощь приветствуется! Спасибо.



РЕДАКТИРОВАТЬ (перемещено снизу — OP отправил это разъяснение в качестве ответа)

Я думаю, я должен был уточнить, что я хотел сделать. Я запущу скрипт из pty, допустим, это /dev/pts/3. Этот скрипт откроет 3 x-терминала, скажем: /dev/pts/0, /dev/pts/1 и /dev/pts/2. Эти 3 новых pty — это то, что увидит пользователь. Сценарий запрашивает у пользователя некоторый ввод, и я хочу, чтобы ввод пользователя был введен в /dev/pty/1, и программа должна получить оттуда информацию. Однако я пытался сделать это, и это не работает. Вот фрагмент моего кода.

exec</dev/pts/1

echo
echo "Would you like to search for more info?" 1>/dev/pts/1
read answer

case $answer in
    y) echo "YES" ;;
    n) echo "NO"  ;;
    *) echo "y/n only!";;
esac

Оператор case в конце — это всего лишь небольшой заполнитель, чтобы увидеть, действительно ли ввод сработал.


person scorpio    schedule 12.03.2009    source источник


Ответы (4)


Я подозреваю, что это невозможно. Насколько я знаю, без изменения чего-либо в пространстве ядра невозможно прочитать ввод с tty (или pty), который не является текущим tty. Даже root не может этого сделать. Я потратил некоторое время на изучение этого и не смог узнать, как это сделать, но я нашел множество источников, утверждающих, что это невозможно. Судя по всему, это дизайнерское решение для повышения безопасности/конфиденциальности пользователей.

person rmeador    schedule 12.03.2009
comment
Я не думаю, что это заслуживает отрицательного голоса, особенно без комментария, говорящего мне, как я ошибаюсь. Теперь, в свете ответа Яна Келлинга, я, возможно, неправильно понял намерение ОП, и в этом случае мой ответ может не применяться, но он по-прежнему верен, насколько я знаю. Пожалуйста, смотрите мой комментарий к этому ответу. - person rmeador; 13.03.2009
comment
Добавлен отрицательный голос, потому что после перехода по ссылке @soeren на ttyecho я могу отправлять символы на стандартный ввод другого tty (после chmoding tty и запуска от имени пользователя root). Если бы постер не пометил это как Linux, я думаю, что ваш комментарий мог бы остаться в силе, и это то, что я слышал во многих других местах. - person rob; 04.11.2013

Может быть, вы могли бы настроить ttyecho для ваших нужд?

# /dev/ttysXXX is the result of the tty command in another Terminal window
sudo ttyecho -n /dev/ttysXXX pwd

И, может быть, ttyecho можно было бы объединить с netcat (или nc) или ncat (который является частью nmap) для связи между разными tty?

Для получения дополнительной информации см.:

person soeren    schedule 28.08.2011

Чтобы ответить на ваш уточненный вопрос, простой способ - использовать FIFO (именованный канал) для задания. На отправляющем терминале:

mkfifo ./myfifo
read var
echo "var" > myfifo

На приемном терминале:

read line < ./myfifo

Чтобы просто распечатать другой xterm из своего, при получении xterm:

$ tty
/dev/pts/2

При отправке xterm:

$ echo howdy doody > /dev/pts/2

Или из скрипта в отправке xterm, перенаправляя stdin как вы просили:

$ cat > /dev/pts/2

Вы должны изменить разрешения на запись в /dev/pts/2, если вы делаете это для разных пользователей.

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

Если вам нужен автоматический способ для отправляющего xterm узнать символьное устройство принимающего, на это можно ответить несколькими способами в зависимости от того, какой тип межпроцессного взаимодействия вы хотите использовать. Простой хак заключается в том, чтобы получатель делал tty > file1, а отправитель делал echo что угодно > $(cat file1).

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

person Ian Kelling    schedule 13.03.2009
comment
Я пытался сделать это в прошлом, и в итоге вы получили приветствие, напечатанное в окне /dev/pts/2. Он не отправляется так, как если бы его набрал пользователь (stdin), он отправляется так, как если бы его напечатала оболочка (stdout). Я полностью неправильно понял вопрос ОП? - person rmeador; 13.03.2009

это просто, вам просто нужно понять

ls -ls /dev/pts вы увидите

0 1 2 3 4 Предположим, вы открываете несколько

теперь используйте один NOT 4 и введите cat ‹ /dev/pts/4 или exec ‹ cat /dev/pts/4

и введите что-нибудь в 4-й, теперь вы знаете, что происходит

person tCheang    schedule 26.08.2011