Kabuklara / tercümanlara bu şekilde girdi göndermek çok problemlidir ve güvenilir bir şekilde çalışmak çok zordur.
Uygun yol soketleri kullanmaktır, bu yüzden icat edildiler, bunu bir python işlemini kullanarak basit bir sokete bağlamak ncat
nc
veya socat
bağlamak için komut satırında yapabilirsiniz . Veya bağlantı noktasına bağlanan ve bir soket üzerinde yorumlanacak komutları dinleyen basit bir python uygulaması yazın.
soketler yerel olabilir ve herhangi bir web arayüzüne maruz kalmayabilir.
Sorun şu ki python
, komut satırından başlarsanız , genellikle bir terminale bağlı olan kabuğunuza eklenir, aslında
$ ls -al /proc/PID/fd
lrwxrwxrwx 1 USER GROUP 0 Aug 1 00:00 0 -> /dev/pty1
size yazarken böylece stdin
pitonun, aslında yazıyoruz pty
psuedo terminali, bir çekirdek cihazı değil, basit bir dosyadır. O kullanır ioctl
değil read
ve write
(ekranınızda çıktı göreceği şekilde, ancak bunun ortaya çıkardığı sürece gönderilmeyecektir python
)
Denediğiniz şeyi çoğaltmanın bir yolu a fifo
veya 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
Yalnızca screen
giriş için de kullanabilirsiniz
# start screen
$ screen -dmS python python
# send command to input
$ screen -S python -X 'print \"hello\"'
# view output
$ screen -S python -x