Proc stdin comportamento estranho

1

Alguémpodeexplicarporqueissoestáacontecendoecomocorrigi-loparaqueosdadosenviadosparastdinsecomportemdamesmamaneiraqueosdadosdigitadosemstdin.

Paraquemnãoconseguevero.gif

Basicamenteeutenho3terminaisdeconfiguração.Umestáexecutandoumservidornetcat,queéoseguintecomando.

nc-l127.0.0.14000

Oterminal2estáapenasexecutandoumclientenetcat,queéoseguintecomando.

nc127.0.0.14000

Aodigitarnocliente,oquesignificabasicamenteinserirdadosparastdinoudescritordearquivo0desseprograma.Osdadosaparecemnoservidorassimqueateclaenterforatingida.Esseéocomportamentoesperado.

Seriadeseesperarque,sevocêinserissedadosemstdindeoutrafontequenãooteclado,elefuncionariadamesmamaneira,contantoquevocêforneçaumanovalinhanofinalouatémesmoumanovalinhaeumretornodecarro.

Emboraestenãosejaocasoquandorodaroterminal3quepossuioseguintecomando.

echo"test\n" > /proc/$pid/fd/0

Por estranho que pareça, os dados do echo aparecem no terminal 2, mas ele não é tratado como entrada de teclado e, portanto, nenhuma mensagem é enviada do clinet no terminal 2 para o servidor no terminal 1.

Isso eu concluo é besteira.

    
por Full_Nitrous 15.08.2018 / 01:00

1 resposta

4

Se você olhar o link /proc/$PID/fd/0 , verá que ele aponta para o terminal:

# ls -l /proc/11962/fd/0
lrwx------ 1 foo users 64 Aug 15 04:30 /proc/11962/fd/0 -> /dev/pts/15

Quando você envia para ele, você não está passando a entrada para o processo nc , você está enviando para o terminal. Que imprime o que você produz.

Parece assim:

   /proc/$PID/fd/$N   <-------> [            ]
                                [  terminal  ]
[  nc  ] <--------------------> [            ]

Não assim:

           /proc/$PID/fd/$N  
               |       |
[      ] <-----+       +------> [            ]
[  nc  ] <--------------------> [  terminal  ]

Se o descritor de arquivo 0 do processo fosse aberto em um arquivo, você ainda esperaria uma gravação para /proc/$PID/fd/0 para mostrar como entrada para o processo, ou para ir para o arquivo aberto?

lrwx------ 1 foo users 64 Aug 15 04:36 /proc/11994/fd/0 -> /tmp/testfile

O que deve echo foo > /proc/11994/fd/0 fazer neste caso?

É o mesmo aqui. Quando o processo lê a partir do fd, ele lê os dados do arquivo. Mas quando você reabre o mesmo arquivo para escrever através de /proc/$PID/fd/$N , você escreve para o arquivo.

Você precisará usar o ioctl TIOCSTI ou algum mecanismo semelhante para inserir dados no buffer de entrada do terminal. Veja tty_ioctl (4)

    
por 15.08.2018 / 03:43

Tags