O envio de informações para shells / intérpretes dessa maneira é muito suscetível a problemas e muito difícil de ser trabalhado de maneira confiável.
A maneira correta é usar soquetes; é por isso que eles foram inventados; você pode fazer isso na linha de comando usando ncat
nc
ou socat
para vincular um processo python a um soquete simples. Ou escreva um aplicativo python simples que se ligue à porta e ouça os comandos para interpretar em um soquete.
soquetes podem ser locais e não expostos a nenhuma interface da web.
O problema é que, se você iniciar a python
partir da linha de comando, ela normalmente está conectada ao seu shell, conectada a um terminal, na verdade, podemos ver
$ ls -al /proc/PID/fd
lrwxrwxrwx 1 USER GROUP 0 Aug 1 00:00 0 -> /dev/pty1
portanto, quando você escreve para stdin
python, na verdade você está gravando no pty
psuedo-terminal, que é um dispositivo de kernel, não um arquivo simples. Ele ioctl
não usa read
e write
, portanto, você verá a saída na tela, mas não será enviada para o processo gerado ( python
)
Uma maneira de replicar o que você está tentando é com um fifo
ou named pipe
.
# make pipe
$ mkfifo python_i.pipe
# start python interactive with pipe input
# Will print to pty output unless redirected
$ python -i < python_i.pipe &
# keep pipe open
$ sleep infinity > python_i.pipe &
# interact with the interpreter
$ echo "print \"hello\"" >> python_i.pipe
Você também pode usar screen
apenas para entrada
# start screen
$ screen -dmS python python
# send command to input
$ screen -S python -X 'print \"hello\"'
# view output
$ screen -S python -x