ระบบไฟล์และไดเร็คทอรี่บน Server

ระบบไฟล์บน Server พวก linux จะมีความแตกต่างกับระบบไฟล์ บน Windows ครับ เนื่องจากระบบไฟล์บน linux ค่อนข้างจะรัดกุมมากกว่า ทำให้การใช้งานระบบไฟล์ บน Server ไม่ค่อยได้รับความนิยมเท่าที่ควร อันเนื่องมาจากความใช้ยากของมันครับ

ระบบไฟล์และไดเร็คทอรี่บน Server จะถูกแบ่งออกเป็น 3 กลุ่มครับคือ

1. เจ้าของ(owner) หรือผู้สร้างไฟล์ครับ เช่น เรา login เข้า server ผ่าน ftp เราจะเป็นเจ้าของโดยผ่าน ftp เท่านั้น หรือไฟล์นี้ถูกสร้างโดยโค้ดบนเว็บ ไฟล์นี้จะมีเจ้าของเป็น Server (หรือง่ายๆคือ PHP บน Server นั่นแหละครับเจ้าของ)
2. กลุ่ม(group) หมายถึงผูที่ถูกจัดให้อยู่ในกลุ่มที่สามารถเรียยกใช้ไฟล์นั้นๆได้ตามที่กำหนด
3. คนอื่น(other) หมายถึง ทุกคนที่ไม่ได้อยู่ใน 2 กลุ่มข้างต้น

สถานะที่เป็นไปได้สำหรับทั้ง 3 กลุ่มคือ อ่าน (read), เขียน (write), ทำงาน (execute)

read(r) หมายถึง สามารถดูเนื้อหาที่อยู่ภายในไฟล์นี้ได้ ถ้าเป็นไดเร็คทอรี่ หมายถึง สามารถดูรายชื่อไฟล์ใน ไดเร็คทอรี่นั้นได้
write(w) หมายถึงไฟล์นี้สามารถเขียนหรือแก้ไขได้ ถ้าเป็น ไดเร็คทอรี่ ก็หมายความว่า สามารถ สร้างไฟล์ หรืออัปโหลดไฟล์ไปยังไดเร็คทอรี่นี้ได้
execute(x) หมายถึงไฟล์นี้ สามารถถูกเรียกให้ทำงานได้ ถ้าเป็นไดเร็คทอรี่ หมายถึง สามารถเรียกให้ไฟล์ในไดเร็คทอรี่นั้น ทำงานได้

การกำหนดสิทธิ หมายถึงการกำหนดให้ ไฟล์หรือไดเร็คทอรี่นั้นสามารถถูกใช้ได้โดย User ที่กำหนด ซึ่งการกำหนดสิทธืนี้สามารทำได้โดย เจ้าของ หรือ Admin เท่านั้น

โดยปกติแล้ว บน PHP เราสามารถกำหนดสิทธิได้โดยใช้ ตัวเลข 3 หลัก หรือ รหัส xrw ครับ

Read Write Execute
4 2 1
r w x

ตัวอย่าง เช่น

Owner Group Other
7 7 7
rwx rwx rwx

กำหนดเป็น 777 หรือ rwxrwxrwx

ดูที่หลักแรก สีแดงเพียงหลักเดียวนะครับ มาจาก 4(r) + 2(w) + 1(x) = 7 หรือ rwx อันหมายถึง สามารถทำได้ทุกอย่าง (หลักอื่นๆ ก็มีลักษณะเดียวกัน)

775 หมายถึง Owner และ Group สามารถทำได้ทุกอย่าง แต่ User อื่นๆ ไม่สามารถเขียนไฟล์ได้ 5 = 4(r) + 1(x)

ปัญหาที่พบบ่อยๆของการใช้งาน ไฟล์ และไดเร็คทอรี่ก็คือ การเขียน ไฟล์ หรือ อัปโหลด หรือ แก้ไข ไฟล์ใดๆ บน Server ไม่ได้ ลองทำความเข้าใจกับสิ่งที่ผมกล่าวถึงตอนต้นก่อน ครับ

1.ไดเร็คทอรี่หรือไฟล์ใดๆ บน Server มักถูกอัปโหลดผ่าน ftp ไปตอนติดตั้ง ทำให้ Owner ของไฟล์ คือเรา ผ่าน ftp เท่านั้น คนอื่นๆ เช่น ผู้ใช้ทั่วไปที่เรียกผ่านเว็บบราวเซอร์ จะไม่สามารถใช้งาน ไฟล์ หรือ ไดเร็คทอรี่นั้นได้
2. ในทางกลับกัน หากเราเรียก setup เพื่อ สร้างไฟล์ หรือ ไดเร็คทอรี่ นั้นๆ สำเร็จ เราก็จะไม่สามารถ ใช้งานไดเร็คทอรี่ นั้นๆ ผ่าน ftp ได้เช่นกัน เนื่องจาก Owner จะเป็นของ PHP โดยผ่าน Browser

การแก้ปัญหา
1. อัปโหลดไฟล์ทั้งหมด ผ่าน ftp และ ปรับ chmod ให้ไฟล์ หรือไดเร็คทอรี่ นั้นๆ เป็น 777 อันหมายถึงทุกคน มี สิทธิที่จะ อ่าน หรือเขียนไฟล์ หรือ ไดเร็คทอรี่นั้นๆ เท่ากันทุกคน
2. สร้างทุกไฟล์หรือ ไดเร็คทอรี่ นั้นๆ บน Server ทั้งหมด อันหมายถึง ทุกคน สามารถใช้งาน ไฟล์ หรือ ไดเร็คทอรี่นั้นๆได้ทุกคน โดยผ่าน Web Browser

ในข้อที่ 1 อาจมีข้อเสียด้านความปลอดภัย หาก Server ไม่รัดกุมพอ อันเนื่องมาจาก ไดเร็คทอรี่หรือไฟล์นั้นๆ สามารถถูกแก้ไขโดยใครก็ได้(ที่อาจเป็น hacker) เพียงแต่มันง่ายด้านการจัดการ
ในข้อที่ 2 ปลอดภัยดี และสามารถใช้งานได้ตามปกติ แต่มีข้อเสียทมี่เราจะไม่สามารถอัปโหลดไฟล์ใดๆผ่าน ftp ไปยัง Server ได้(หากมีความจำเป็น) รวมถึงไม่สามารถลบไฟล์นั้นๆได้ด้วย

ในทางปฏิบัติ เราอาจเลือกใช้ ทั้ง 2 วิธีร่วมกัน โดยการจัดโครงสร้างเว็บที่เหมาะสม ผมยกตัวอย่างเช่น การ ออกแบบเว็บโดยให้ ไดเร็คทอรี่ ที่ต้องการ เขียนข้อมูล อยู่ภายใต้ไดเร็คทอรี่เดียวกัน (ไดเร็คทอรี่ data/) แล้วให้ไดเร็คทอรี่ข้อมูลอื่นๆ อยู่ภายใต้ไดเร็คทอรี่ data/ อันแรก ซึ่งในตอน setup server ครั้งแรก เราจะสร้าง ไดเร็คทอรี่ data/ ผ่าน ftp และปรับ chmod ให้เป็น 777 หลังจากนั้นให้ run setup เพื่อสร้างไดเร็คทอรี่หรือไฟล์อื่นๆ ภายใต้ไดเร็คทอรี่ data/ อีกที และหลังจาก setup เสร็จ ก็กลับมาปรับ chmod ให้ data/ เป็น 775 เพื่อความปลอดภัย

สำหรับไดเร็คทอรี่ ที่ setup สร้างขึ้น หากต้องการลบ จะไม่สามารถลบได้ด้วย ftp นะครับ จะต้องเขียนโค้ด php เพื่อทำการลบไดเ็คทอรี่ หรือไฟล์นั้นๆ แล้ว run ผ่าน Browser เอาเอง

อีกปัญหาหนึ่งของการใช้งาน ไฟล์หรือไดเร็คทอรี่บน Server ก็คือการเปลี่ยนเจ้าขิงไฟล์ หรือที่เรียกกันง่ายๆว่า chmod ครับ ซึ่งมีข้อกำหนดดังนี้
1.ผู้ที่มีสิทธิเปลี่ยนสถานะของไฟล์ตองเป็นเจ้าของ หรือ Admin เท่านั้น ดังนั้นทั่วไป ถ้าคุณใช้ ftp ในการสร้างไฟล์ หรือไดเร็คทอรี่ คุณก็สามารถเปลี่ยนสถานะของไฟล์ได้
2.คำสั่ง chmod ของ PHP ไม่สามารถทำงานได้กับ remote file นั่นเป็นสาเหตุว่า ทำไมเราถึงไม่สามารถเขียนคำสั่ง chmod เพื่อเปลี่ยนสถานะของไฟล์ได้ด้วย PHP หรือพูดง่ายๆก็คือ เราไม่สามารถใช้ chmod บน Server ที่เป็น linux ได้นั่นเอง

การแก้ปัญหา
1.ถ้าคุณใช้ ftp คุณก็สามารถปรับ chmod ได้ด้วยตัวเองบน ftp อยู่แล้ว ก็ปรับให้เสร็จซะในตอนสร้าง
2.ถ้าคุณสร้างไฟล์หรือไดเร็คทอรี่บน Server ด้วยคำสั่งของ PHP เ่ช่น mkdir() คุณไม่จำเป็นต้องปรับ chmod (ถึงพยายามก็ปรับไม่ได้อยู่ดี) แต่คุณก็จะสามารถใช้งานไฟล์ หรือ ไดเร็คทอรี่นั้นได้เต็มอยู่แล้ว เนื่องจากไฟล์นั้นๆ จะมีเจ้าของเป็น Server โดยผ่าน Browser ซึ่งจะมีผลทำให้ คุณไม่สามารถปรับ chmod หรือทำอะไรได้กับไฟล์ หรือ ไดเร็คทอรี่นี้ ผ่าน ftp เนื่องจาก ftp ไม่ได้เป็นเจ้าของนั่นเอง
ผู้เขียน goragod โพสต์เมื่อ 07 ก.พ. 2552 เปิดดู 18,742 ป้ายกำกับ File System
^