ข้อผิดพลาดเซิร์ฟเวอร์ภายใน


0

ฉันกำลังพยายามสร้างการสื่อสารแบบอนุกรมจากเว็บเซิร์ฟเวอร์ในพื้นที่ของฉันดังนั้นฉันจึงสร้างไฟล์ c ++ และคอมไพล์มันเพื่อทำให้การสื่อสารจริงและรวบรวมกับ GCC:

#include <iostream>
#include <fstream>

using namespace std;

char c = 2;
char hexdata = (c & 0xFF);

int main () {

  fstream fs;
  fs.open ("/dev/ttyS0", std::fstream::out | std::fstream::app);

  fs << hexdata;

  fs.close();

  return 0;
}

จนถึงตอนนี้มันใช้งานได้และฉันสามารถอ่านข้อมูลที่ส่งได้ ตอนนี้ฉันคัดลอกลงใน / usr / lib / cgi-bin และตั้งชื่อเป็น serialOut.cgi และพยายามเรียกใช้งานจากเทอร์มินัลและใช้งานได้เช่นกัน แต่เมื่อฉันพยายามเปิดจากเบราว์เซอร์มันทำให้ฉันมีข้อผิดพลาดภายใน:ป้อนคำอธิบายรูปภาพที่นี่

แม้ว่าฉันจะมีสคริปต์ CGI อีกสองตัวในไดเรกทอรีเดียวกันทำงานได้ดี ฉันลองตรวจสอบการอนุญาตแล้วมันก็โอเคเช่นกัน:

-r-xr-xr-x 1 root root 34408 Mar 30 18:37 serialout.cgi

นอกจากนี้ error.log ก็ไม่มีข้อผิดพลาด สาเหตุของปัญหานี้คืออะไรและฉันจะแก้ไขได้อย่างไร


แก้ไข

ฉันแก้ไขโค้ดของฉันและตอนนี้ข้อผิดพลาดภายในเซิร์ฟเวอร์หายไปและมันแสดงข้อความ แต่ข้อมูลอนุกรมยังไม่ถูกส่ง

#include <iostream>
#include <fstream>

using namespace std;

char c = 2;
char hexdata = static_cast<char>(c & 0xFF);

int main () {

  fstream fs;
  fs.open ("/dev/ttyS0", std::fstream::out | std::fstream::app);

  fs << hexdata;

  fs.close();
  cout << "Content-type: text/html" << endl << endl;
  cout << "<html><body>Done!</body></html>";

  return 0;
}

ป้อนคำอธิบายรูปภาพที่นี่

ฉันพยายามเพิ่มนามแฝงใน / dev / ไปยังไดเรกทอรีจริง / dev / แต่ก็ยังไม่ได้แก้อะไรเลย ความช่วยเหลือใด ๆ ชื่นชม


1
โปรแกรมของคุณดูไม่เหมือนโปรแกรม CGI มันจะไม่ส่งคืนสิ่งใดเลย
Daniel B

1
ไม่จำเป็นต้องตอบกลับคำขอ ส่วนหัวทางเลือกแรกจากนั้นบรรทัดว่างแล้วเนื้อหา ดังนั้นโปรแกรมขนาดเล็กจะต้องตอบสนองด้วยการแบ่งบรรทัดอย่างน้อย โชคดีที่มีหนังสือเกี่ยวกับว่า
Daniel B

1
ดังนั้นเพิ่มรูปแบบของการดีบักทำรหัสของคุณ? จากสิ่งที่คุณพูดว่าใช้งานได้หากคุณเรียกใช้ทีละรายการ มีการอนุญาตดำเนินการอะไรบ้าง ผู้ใช้รายนั้นมีสิทธิ์ในการส่งข้อมูลหรือไม่
เซท

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

1
โอ้ใช่แล้วการพยายามเรียกใช้เนื่องจากผู้ใช้ http เป็นแนวคิดที่ยอดเยี่ยม ขึ้นอยู่กับข้อกำหนดด้านความปลอดภัยของคุณคุณสามารถทำให้ SetUID เป็นรูทได้ แต่โดยทั่วไปแล้วมันเป็นความคิดที่ไม่ดี
Daniel B
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.