การส่งอินพุตไปยัง shells / interpreters ด้วยวิธีนี้จะทำให้เกิดปัญหาและยากที่จะทำงานในลักษณะที่เชื่อถือได้
วิธีที่เหมาะสมคือการใช้ซ็อกเก็ตนี่คือเหตุผลที่พวกเขาถูกประดิษฐ์คุณสามารถทำได้ในบรรทัดคำสั่งโดยใช้ncat
nc
หรือsocat
เพื่อผูกกระบวนการหลามกับซ็อกเก็ตที่เรียบง่าย หรือเขียนแอพพลิเคชั่นหลามแบบง่าย ๆ ที่ผูกเข้ากับพอร์ตและฟังคำสั่งเพื่อตีความบนซ็อกเก็ต
ซ็อกเก็ตสามารถอยู่ในพื้นที่และไม่ได้สัมผัสกับเว็บอินเตอร์เฟสใด ๆ
ปัญหาคือว่าถ้าคุณเริ่มต้นpython
จากบรรทัดคำสั่งมันมักจะแนบมากับเปลือกของคุณซึ่งติดอยู่กับสถานีในความเป็นจริงเราสามารถเห็น
$ ls -al /proc/PID/fd
lrwxrwxrwx 1 USER GROUP 0 Aug 1 00:00 0 -> /dev/pty1
ดังนั้นเมื่อคุณเขียนถึงstdin
ของ python คุณกำลังเขียนไปยังpty
psuedo-terminal ซึ่งเป็นอุปกรณ์เคอร์เนลไม่ใช่ไฟล์ง่ายๆ มันioctl
ไม่ได้ใช้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