пренасочете stdin да идва от различен терминал с помощта на Bash

Чудя се как би се пренасочил stdin на скрипт от текущата xterm сесия, т.е. /dev/pts/0, към такава, която също се изпълнява, т.е. /dev/pts/1 с помощта на bash? Имам bash скрипт, който отваря 3 xterm прозореца и искам да получа информация само от един от тези прозорци и не мога да разбера как да го направя. Всяка помощ се оценява! Благодаря.



РЕДАКТИРАНЕ (Преместено отдолу -- OP изпрати това разяснение като отговор)

Предполагам, че трябваше да изясня какво искам да направя. Ще стартирам скрипт от pty, да кажем, че е /dev/pts/3. Този скрипт ще отвори 3 xterminals, да кажем: /dev/pts/0, /dev/pts/1 и /dev/pts/2. Тези 3 нови точки са това, което потребителят ще види. Скриптът иска от потребителя някакъв вход и аз искам въведеното от потребителя да бъде въведено в /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

Казусът в края е само малък контейнер, за да видите дали въведеното действително работи.


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


Отговори (4)


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

person rmeador    schedule 12.03.2009
comment
Не мисля, че това заслужава отрицателен вот, особено не без коментар, който да ми каже как греша. Сега, в светлината на отговора на Иън Келинг, може да съм разбрал погрешно намерението на OP, в който случай отговорът ми може да не е приложим, но все пак е вярно AFAIK. Моля, вижте коментара ми за този отговор. - person rmeador; 13.03.2009
comment
Добавено е отрицателно гласуване, защото след като следвам връзката @soeren към ttyecho, мога да изпращам символи към stdin на друг 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) за комуникация между различни ttys?

За повече информация вижте:

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

Трябва да chmod разрешенията за писане в /dev/pts/2, ако правите това между потребителите.

Не можете да заснемете отпечатаното по този начин на терминала за получаване. Няма вграден метод за пренасочване за улавяне на входа от друг терминал.

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

Ако искате да опитате и да насочите това от получателя вместо от подателя, отново имате проблем с междупроцесната комуникация, който може да бъде разрешен по няколко начина.

person Ian Kelling    schedule 13.03.2009
comment
Опитвал съм да правя това в миналото и това, което накрая получавате, е howdy doody, отпечатано в прозореца /dev/pts/2. Той не се изпраща, сякаш потребителят го е написал (stdin), той се изпраща, сякаш черупката го е отпечатала (stdout). Напълно ли погрешно разбрах въпроса на OP? - person rmeador; 13.03.2009

просто е, просто трябва да разберете

ls -ls /dev/pts ще видите

0 1 2 3 4 Да предположим, че отворите няколко

сега използвайте едно НЕ 4 и въведете cat ‹ /dev/pts/4 или exec ‹ cat /dev/pts/4

и напишете нещо в 4-то, сега знаете какво се случва

person tCheang    schedule 26.08.2011