принудительно перевести вывод на ввод (буфер), например "\033[6n" в скрипте

принудительно перевести вывод на ввод (буфер), например "\033[6n" в скрипте

Я пробовал использовать каналы и перенаправления, чтобы вывод (программы на языке C или скриптов) попадал во входной буфер, printf "\033[6n"но это не дало положительных результатов.

Кто-нибудь знает, как это возможно, поскольку:

  1. командная строка
  2. в скрипте оболочки
  3. код С

Выход трубопровода _cmd_ > /dev/stdinи код C fprintf(stdin, "blah\n");не оказывают измеримого эффекта.

Примечание:Я не хочу «передавать» ввод другой команде, я хочу «внедрить» символы в «буфер клавиатуры» (так сказать).

РЕДАКТИРОВАТЬ:Первоначальным вариантом использования было изолированное приложение CLI, которое допускало shellвнешниеsystemкомандыдля взаимодействия с ОС (например, Bas), но ненетобрабатывать файловые дескрипторы.

решение1

Редактировать:Короткий ответбыл /dev/uinput, теперь его TIOCSTI(см. конец поста)


Вот ответ на данный момент, и в ответ на комментарии:

ioctl_tty(2)У меня нет, но поиск TIOCSTIв исходном коде ядра (черезСвободныеЭлектроны) покажет tiocsti«поддельный символ ввода», который использует tty_structконтекст.

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

В обозримом будущем нет никаких шансов изменить это, это не мое приложение. Однако мне удалось вырезать результаты "\033[6n", которые были введены в буфер клавиатуры ядром через tty_insert_flip_char& tty_schedule_flipin src/drivers/tty/tty_buffer.c, который использует tty_portконтекст.

Если память не изменяет, до того, как структура файла FD была изменена, когда былтолько4 файловых дескриптора, возможно, этого можно было достичь. В настоящее время, хотя вы можете писать в /dev/stdinили /proc/self/fd/0, они подключены к /dev/tty#и все, что записано на устройство TTY, в конечном итоге будет на экране ( /dev/stdout). Ядро, похоже, обходит маршрут файлового дескриптора при использовании TTY, обратите внимание, что flipфункции ссылаются на него как напорт.

Любое пользовательское приложение не имеет доступа ни к одной из этих функций ядра. В X-Windows можно использовать xvkbdи xdotoolили xte, но это приложение используется на консоли Linux (VT).


(Почти) Реальный Ответ:

Хотя скрипт /dev/uinputне имеет привилегий пользователя (в большинстве систем), все аргументы будут работать.sudoprintf

В качестве альтернативы клавиатурасобытиетакже будет работать, так как все пользователи имеют к нему доступ, но он меняется при каждой загрузке и для каждой системы (у меня обычно /dev/input/event0, но не всегда).

После дальнейшего исследования ни один из этих подходов не является практичным, особенно для сценариев. То, что нам нужно понять о том, что нужно сделать, это то, что мы просто хотим представитьтекстна входном буфере, а не «имитировать нажатие клавиши» (именно так работают вышеуказанные устройства).


(Самый практичный) реальный ответ:

Вопрос, заданный вне сайта, ссылается на ответ на stackexchange от 2011 года (здесь). Он использует TIOCSTI. После повторного рассмотрения примера Perl, он также может быть практичным для сценариев, где приложение не предоставляется.

perl -le 'require "sys/ioctl.ph";
      ioctl(STDIN, &TIOCSTI, $_) for split "", join " ", @ARGV
     ' `_cmds_`

Однако он также выводит его на экран. После многих часов дальнейших исследований и экспериментов следующее оказывается практичным в скрипте или в командной строке:

stty -echo; perl -le 'require "sys/ioctl.ph"; ioctl(STDIN, &TIOCSTI, $_) for split "", join " ", @ARGV ' `_cmds_` ;stty echo

Примечание:хотя TIOCSTIбыл отозван вOpenBSD 6.2(октябрь 2017 г.), по-видимому, разработчики ядра Linux являются одними изпротивоположныйвозражаю, категорически отказываясь его отменять (подробнее об этом можно прочитать вЖурнал OpenBSD).

решение2

Что касается Debian Bullseye, то console-toolsон был поглощен, в kbdкоторый writevtбылнетвключено. Если хотите, ссылки на источники приведены в обновлении в конце этого поста.


writevt /dev/tty# text, по крайней мере на Linux, возможно BSD и Unix, в настоящее время это часть пакета console-tools. Пользователь должен иметьписатьпривилегии для VT. В частности, (EDIT: если это доступно в вашей ОС) полный и правильный ответ на OP:

writevt `tty` "`_cmds_`"

Этот вопрос показывает отсутствие глубоких знаний о базовых операционных системах у сообщества StackExchange в целом. writevtочень старая, это базовая команда, установленная на 99% (EDIT: Debian Linux) систем. До июня 2002 года в Debian не было страницы руководства или сопровождающего для нее, что может объяснять, почему многие люди не знают о ней, хотя это было 15 лет назад. Однако даже в Kali Linux (где естьвсе) чаще всего он не указан поддоступный команды, хотя он там был с самого начала.


Начиная с Debian Buster writevtбольше не устанавливается по умолчанию и, по некоторым данным, может даже отсутствовать в каком-либо пакете (из-за отсутствия Maintainer? или изменения в console-toolsпакете?)

ОБНОВЛЕНИЕ: на самом деле я больше не могу найти ничего console-toolsв поиске пакетов Debian (где я изначально проверял содержимое), даже обратные порты.

Оригинальный проект пакета находится здесь:

http://lct.sourceforge.net/

Никаких патчей не требуется. Raspbian/RPiOS имеет сборку Debian (Wheezy to Buster) здесь:

http://raspbian.raspberrypi.org/raspbian/pool/main/c/console-tools/

Цитата Яна Дирсона:

Текущие (публичные) программные проекты Я работаю над проектом Debian GNU/Linux, участником которого я являюсь с 1997 года.

http://ydirson.free.fr/en/software/

ожидание kbdпоглощения - 2001

Пакет console-toolsиз проекта "Linux Console Tools" по-прежнему доступен в RPiOS. Он не то же самое, что linuxconsoletoolsпакет из проекта "Linux Console Project", который также есть на SourceForge.

Связанный контент