Я пробовал использовать каналы и перенаправления, чтобы вывод (программы на языке C или скриптов) попадал во входной буфер, printf "\033[6n"
но это не дало положительных результатов.
Кто-нибудь знает, как это возможно, поскольку:
- командная строка
- в скрипте оболочки
- код С
Выход трубопровода _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_flip
in 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
не имеет привилегий пользователя (в большинстве систем), все аргументы будут работать.sudo
printf
В качестве альтернативы клавиатурасобытиетакже будет работать, так как все пользователи имеют к нему доступ, но он меняется при каждой загрузке и для каждой системы (у меня обычно /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 (где я изначально проверял содержимое), даже обратные порты.
Оригинальный проект пакета находится здесь:
Никаких патчей не требуется. 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/
Пакет console-tools
из проекта "Linux Console Tools" по-прежнему доступен в RPiOS. Он не то же самое, что linuxconsoletools
пакет из проекта "Linux Console Project", который также есть на SourceForge.