以这种方式将输入发送到shell /解释器非常容易出现问题,并且很难以任何可靠的方式进行工作。
正确的方法是使用套接字,这就是发明套接字的原因,您可以在命令行中使用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
psuedo-terminal,这是一个内核设备,而不是简单的文件。它使用ioctl
not read
和write
,因此您将在屏幕上看到输出,但不会将其发送到生成的进程(python
)
复制尝试内容的一种方法是使用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