ให้บริการไฟล์ Python CGI บน Synology NAS

Oct 19 2020

ฉันไม่สามารถรับไฟล์ python เพื่อใช้กับ Apache 2.2 หรือ 2.4 โดยไม่มีข้อผิดพลาด 500 ฉันติดตั้ง WebStation, python, perl, php และ Apache 2.2 และ 2.4 แล้ว

ฉันสามารถให้บริการไฟล์คงที่ได้ดีด้วย apache เมื่อฉันพยายามให้บริการ cgi "สวัสดีชาวโลก" ขั้นพื้นฐานที่สุดฉันได้รับข้อผิดพลาด 500 ข้อผิดพลาดคือ

[cgid: error] [pid 10076: tid 140542621480832] (2) ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าว: AH01241: exec of ['/volume2/Development/WebRepo/cgi-bin/test.py' ล้มเหลว

พยายามเรียกใช้ทั้งสคริปต์ perl และสคริปต์ python ทั้งสองทำงานได้สำเร็จจากบรรทัดคำสั่ง แต่ไม่ได้รับจาก Apache (ข้อผิดพลาดเดียวกันกับ "ไม่มีไฟล์ดังกล่าว .. ") โปรดทราบว่านี่เป็นข้อผิดพลาด 500 ไม่ใช่ 404 ดังนั้นจึงเห็นไฟล์ ฉันสามารถให้บริการไฟล์ HTML แบบคงที่ได้ดี

สคริปต์ python ไม่ง่ายกว่านี้:

#!/usr/bin/python
print "Content-type: text/html\n\n";
print "Hello, World.";

ไฟล์ทั้งหมดมีสิทธิ์ 755 สิทธิ์ เส้นทางไปยัง python ถูกต้อง ฉันกำลังสูญเสียว่าจะทำอย่างไรต่อไป

คำตอบ

1 saaj Nov 29 2020 at 21:26

Python สามารถให้บริการสคริปต์ CGI นอกกรอบโดยใช้http.server.CGIHTTPRequestHandlerไฟล์.

ใน Synology NAS ของฉันฉันได้ติดตั้งแพ็คเกจ Python3 อย่างเป็นทางการ (เวอร์ชัน 3.8.2-0150) ฉันสามารถ SSH เป็น NAS adminและเพิ่มสคริปต์:

mkdir -p app/cgi-bin

cat << EOF > app/cgi-bin/hello.py
#!/usr/bin/env python3

print('Content-Type: text/html')
print()
print('<html><body><h2>Hello World!</h2></body></html>')
EOF

หลังจากนั้นฉันสามารถเรียกใช้งานได้เช่นนี้ (โปรดทราบว่า--directoryไม่มีผลเพราะ--cgiฉันcdอยู่ที่นั่น):

cd app && python3 -m http.server --cgi

curl http://nas:8000/cgi-bin/hello.pyจากนั้นในเครื่องของฉันฉันสามารถ

กำลังทำงานในการบูต

คุณสามารถรันสิ่งนี้โดยอัตโนมัติเมื่อบูตผ่านตัวกำหนดตารางงาน

แผงควบคุม →ตัวกำหนดเวลางาน → สร้าง → งานที่ทริกเกอร์ → สคริปต์ที่ผู้ใช้กำหนดเอง กรอกข้อมูลเหล่านี้ในแท็บทั่วไป :

  • งาน: Python CGI
  • ผู้ใช้: admin
  • เปิดใช้งาน: [x]

และสคริปต์ที่ผู้ใช้กำหนดบนแท็บการตั้งค่างาน :

cd /var/services/homes/admin/app
python3 -m http.server --cgi

จากนั้นคุณสามารถเรียกใช้ด้วยตนเอง นอกจากนี้ยังควรทำงานเมื่อรีบูต

สิทธิ์

หากคุณต้องการเรียกใช้งานเป็นrootตรวจสอบให้แน่ใจว่าสิทธิ์ของไฟล์ถูกต้องจากrootมุมมองของ ในกรณีของฉันมีความคลาดเคลื่อนด้วยเหตุผลบางประการ

$ ls -l app/cgi-bin/hello.py -rwxrwxrwx+ 1 admin users 122 Nov 29 14:50 app/cgi-bin/hello.py $ sudo ls -l app/cgi-bin/hello.py 
Password: 
-rwx--x--x+ 1 admin users 122 Nov 29 14:50 app/cgi-bin/hello.py