この方法でシェル/インタープリターに入力を送信することは、非常に問題が発生しやすく、信頼できる方法で作業することが非常に困難です。
適切な方法はソケットを使用することです。これがソケットが発明された理由です。これを使用して、ncat
nc
またはsocat
pythonプロセスを単純なソケットにバインドするコマンドラインで実行できます。または、ポートにバインドし、ソケットで解釈するコマンドをリッスンする単純なpythonアプリケーションを作成します。
ソケットはローカルにすることができ、Webインターフェースに公開されません。
問題はpython
、コマンドラインから開始すると、通常、ターミナルに接続されているシェルに接続されていることです。実際、
$ ls -al /proc/PID/fd
lrwxrwxrwx 1 USER GROUP 0 Aug 1 00:00 0 -> /dev/pty1
そのためstdin
、Pythonで書き込むときは、実際pty
には、単純なファイルではなく、カーネルデバイスである疑似端末に書き込んでいます。ioctl
not read
およびを使用しているwrite
ため、画面に出力が表示されますが、生成されたプロセス(python
)には送信されません。
試行しているものを複製する1つの方法は、fifo
またはを使用することです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
screen
入力のみにも使用できます
# start screen
$ screen -dmS python python
# send command to input
$ screen -S python -X 'print \"hello\"'
# view output
$ screen -S python -x