Por curiosidade maliciosa, abri 2 terminais, cada um executando o shell bash. Na primeira eu digito:
$ echo $$
11458
e na segunda:
$ echo -n "echo this command" >> /proc/11458/fd/0
Então este texto echo this command
é realmente canalizado para o prompt no primeiro terminal. Mas ao entrar nesse primeiro terminal, esse texto não é executado como um comando, apenas recebo um novo prompt.
Em uma segunda tentativa, executei este comando no primeiro terminal:
$ read line;echo $line
e enquanto a leitura está aguardando entrada, eu novamente ecoo algum texto /proc/11458/fd/0
no segundo terminal. Esse texto aparece no primeiro terminal, mas ao pressionar <enter>
no primeiro terminal, o read
termina e echo $line
mostra que nenhuma entrada foi lida.
Então eu ainda não encontrei uma maneira de fazer mal; tudo o que posso fazer é modificar o texto no primeiro terminal, do segundo terminal. Leitores de tela nesse primeiro terminal, é claro, peguem isso. Por leitores de tela, estou pensando em seleção de mouse ou funções de terminal como Save Contents ...
; Eu tentei ambos.
Mas se eu soubesse como também ecoar, por exemplo, um final de arquivo ou outros caracteres de controle para o primeiro terminal stdin
, não poderia estragar as coisas terrivelmente para os processos no primeiro terminal?
Parte 1 - isso responde sua pergunta? Escrevendo para stdin de um processo
Parte 2 - você pode escrever (e ler) em um terminal pertencente a qualquer processo que você possua. Mas as permissões padrão do UNIX impedirão que você grave (ou leia) em qualquer dispositivo associado a um login de usuário diferente.
Eu posso escrever neste dispositivo:
Esta pode ser uma explicação fácil:
Se um processo de terminal gravar no terminal (
stdin
,stdout
, estderr
todos apontarem para o mesmo dispositivo/pty), essa saída não se tornará sua próxima entrada. Obviamente.eco foo
não tem o mesmo efeito que digitar fooenter.
Então, por que um processo diferente de gravação no terminal se tornaria outro processo de entrada do terminal? Não faz sentido.
Ao contrário de um arquivo, com um (pseudo) terminal os dados escritos e lidos nele não estão relacionados porque a fonte de dados é algo completamente diferente (um teclado ou um programa). Veja
man 7 pty
. Um pseudo terminal tem um lado do cliente que é usado pelos aplicativos do terminal e um lado mestre onde a entrada para o lado do cliente é gerada.Meu emulador de terminal é o konsole (PID 40818), atualmente executando apenas um shell/terminal:
Você pode ver, o shell usa,
/dev/pts/40
mas o emulador de terminal grava em/dev/ptmx
. Somente o descritor18
de arquivo do emulador de terminal pode gravar na entrada de /dev/pts/40. Se um processo diferente for aberto/dev/ptmx
, ele criará um novo pseudo terminal no qual será gravado.