перенаправить стандартный ввод с другого терминала, используя Bash - PullRequest
4 голосов
/ 13 марта 2009

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


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

Полагаю, мне следовало уточнить, что я хотел сделать. Я начну скрипт с pty, скажем, это / dev / pts / 3. Этот скрипт откроет 3 xterminals, скажем: / dev / pts / 0, / dev / pts / 1 и / dev / pts / 2. Эти 3 новые ptys - это то, что пользователь увидит. Скрипт запрашивает у пользователя ввод данных, и я хочу, чтобы ввод пользователя вводился в / 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 в конце - это просто небольшая метка-заполнитель, чтобы увидеть, работает ли ввод.

Ответы [ 4 ]

8 голосов
/ 28 августа 2011

Может быть, вы могли бы настроить 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) для связи между разными ttys?

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

5 голосов
/ 13 марта 2009

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

4 голосов
/ 13 марта 2009

Чтобы ответить на ваш уточненный вопрос, простой способ - использовать 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, а отправителю сделать эхо-запрос что угодно> $ (cat file1).

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

1 голос
/ 26 августа 2011

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

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

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

теперь используйте один НЕ 4 и введите кошка </ dev / pts / 4 или же exec <cat / dev / pts / 4 </p>

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...