Editar: A resposta curta era /dev/uinput , agora é TIOCSTI (veja o final da postagem)
Esta é a resposta até agora e para abordar os comentários:
man ioctl_tty Eu não tenho, mas uma pesquisa de TIOCSTI na fonte do kernel (via FreeElectrons mostrará tiocsti "caractere de entrada falso", que usa um contexto tty_struct .
O aplicativo em questão está sendo executado o tempo todo, de forma interativa, para que os canais e redirecionamentos não possam ser usados. Pode shell sair para o script, no entanto, ao contrário de um monte de outros aplicativos semelhantes, não permite, nem permite, capturar os resultados, permitindo apenas stdin & stdout para fazer suas coisas de acordo com o normal.
Para o futuro previsível, não há chance de mudar isso, não é minha aplicação. No entanto, consegui cortar os resultados de "3[6n" , que foram injetados no buffer de teclado pelo kernel através de tty_insert_flip_char & tty_schedule_flip in src/drivers/tty/tty_buffer.c , que usa um contexto tty_port .
Se a memória serve, antes da estrutura do arquivo FD ser alterada, quando havia apenas 4 descritores de arquivo, pode ter sido possível conseguir isso. Hoje em dia, embora você possa escrever para /dev/stdin ou /proc/self/fd/0 , eles estão conectados a /dev/tty# e qualquer coisa gravada em um dispositivo TTY terminará na tela ( /dev/stdout ). O kernel parece ignorar a rota do descritor de arquivo ao usar TTY's, observe que as funções flip se referem a ele como uma porta .
Qualquer aplicativo userland não tem acesso a nenhuma dessas funções do kernel. No X-Windows, é possível usar xvkbd e xdotool ou xte , mas este aplicativo está sendo usado no console do Linux (VT).
A resposta (quase) real:
Embora /dev/uinput não tenha privilégios de usuário (na maioria dos sistemas), sudo um script que printf all arguments funcionará.
Como alternativa, o teclado evento também funcionará, pois todos os usuários têm acesso a ele, mas ele muda por inicialização e por sistema (o meu normalmente é /dev/input/event0 , mas nem sempre).
Após mais pesquisas, nenhuma dessas abordagens é prática, especialmente para scripts. A coisa que precisamos entender sobre o que precisa ser feito é que apenas queremos apresentar texto no buffer de entrada, não "simular um pressionamento de tecla" (que é como os dispositivos acima funcionam).
A resposta real (mais prática):
Uma pergunta fora do local remetida a uma resposta no stackexchange, de 2011 ( aqui ). Usa TIOCSTI . Depois de rever o exemplo Perl novamente, também pode ser prático para o script, onde um aplicativo não é fornecido.
perl -le 'require "sys/ioctl.ph";
ioctl(STDIN, &TIOCSTI, $_) for split "", join " ", @ARGV
' '_cmds_'
No entanto, também faz eco na tela. Após muitas horas de pesquisa e experimentação, o seguinte é prático em um script ou na linha de comando:
stty -echo; perl -le 'require "sys/ioctl.ph"; ioctl(STDIN, &TIOCSTI, $_) for split "", join " ", @ARGV ' '_cmds_' ;stty echo
Observação: embora TIOCSTI tenha sido revogado no BSD (novembro de 2017), aparentemente, os desenvolvedores do Kernel do Linux estão na mente oposto, categoricamente recusando-se a revogá-lo