Почему инъекция TIOCSTI отключает stty echo в bash при использовании с bind? - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь привязать ключ в bash для ввода команд в терминал, используя TIOCSTI (пример здесь ). Это работает очень хорошо, пока я не введу определенные команды. Конечной целью является замена bash reverse search (ctrl-r), но это служит примером для демонстрации моей проблемы.

# Test using a clean environment
env -i bash --noprofile --norc

# Define TIOCSTI helper
function inject() {   perl -e 'ioctl(STDIN, 0x5412, $_) for split "", join " ", @ARGV' "$@"; }

# Bind ctrl-b to inject 'yes | less' as a test
bind -x '"\C-b":"inject yes \| less"'

<press ctrl-b>yes | less<press enter>
WARNING: terminal is not fully functional
y  (press RETURN)
y
...
<press q to exit less>

# Terminal is now foobared. In particular I can't see what I type. Why?

# Enable echo
stty echo

Если я просто введу inject yes \| less и нажму Enter, то с терминалом все в порядке. Я думаю, что это как-то связано с тем, что TIOCSTI запускается в bash bind. Инъекция yes | less, просто yes и длинный git log вызывают это, но многие другие, такие как echo и vi, не делают этого. Интересно, что я могу ctrl-b ввести команду, удалить все в строке, перепечатать ее самостоятельно, и я все еще теряю эхо. Как будто readline отравлен каким-то невидимым символом, который я не могу удалить.

Почему я теряю эхо?

Как я могу это исправить? Например. возможно, для обеспечения безопасности необходимо отправить еще несколько кодов вместе с TIOCSTI.

GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu)

1 Ответ

0 голосов
/ 22 мая 2019

Если вам просто нужен какой-то клавиатурный макрос, вы можете поместить что-то вроде этого (как пример) в ваш ~ / .inputrc:

# F12 has a keyboard macro:
"\e[24~": "cls; (date; make 2>&1 || flash 1 >/dev/console 2>&1; date) | tee make.res^M"

Примечание 1: ^ M является действительным символом control-M (то есть a \ r, CR, возврат каретки).

Примечание 2: я думаю, что .inputrc требователен к пробелам; Кажется, я помню, что между ключом и макроопределением должен быть ровно один пробел.

Примечание 3. Чтобы увидеть, что выводит ваш F12 (например), наберите cat, нажмите клавишу F12 и запишите строку, которую он печатает.

Раньше я имел это в течение многих лет, когда были популярны колокольчики и свистки, и я сам компилировал каждый последний чертов пакет, и просто сохранял все make журналы (cls - это скрипт, который в основном делает tput clear, flash был доморощенным скрипт для прошивки терминала и звонка:)

Конечное примечание: макросы, подобные приведенным выше, которые содержат CR в конце, заставляют меня нервничать, и я (сейчас) считаю опасным. Просто макрос, помещающий команду после приглашения в ожидании вашего интерактивного CR (или ^ C), выглядит для меня более безопасным способом.

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