Clear
Lead Graphic Papers

การจัดการไดเรกทอรีและไฟล์ในระบบยูนิกซ์

ผู้เขียน: เสฏฐวุฒิ แสนนาม
วันที่เผยแพร่: 5 พ.ย. 2554
ปรับปรุงล่าสุด: 9 พ.ย. 2554

ยูนิกซ์ (นิยมเขียนว่า Unix แต่ชื่อตามเครื่องหมายการค้าคือ UNIX) เป็นชื่อของระบบปฏิบัติการที่ถูกพัฒนาขึ้นโดยนักวิจัยที่ศูนย์วิจัย Bell Labs จากบริษัท AT&T ในปี ค.ศ. 1969 ถูกออกแบบมาเพื่อให้มีความสามารถหลักๆ คือรองรับการประมวลผลโปรแกรมได้หลายตัวพร้อมกัน (Multi-tasking) และรองรับผู้ใช้งานหลายคน (Multi-user) ในปัจจุบันระบบยูนิกซ์ได้มีการพัฒนาเพิ่มเติมเพื่อให้สามารถทำงานได้บนฮาร์ดแวร์ที่หลากหลาย รวมถึงถูกใช้เป็นโครงสร้างของระบบปฏิบัติการสมัยใหม่หลายระบบปฏิบัติการ เช่น BSD, Solaris, Mac OSX หรือ ระบบปฏิบัติการที่ทำงานคล้ายยูนิกซ์ (Unix-like) เช่น Linux หรือ Android อีกด้วย [1]

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

ไดเรกทอรีและไฟล์ในระบบยูนิกซ์

  • ไฟล์ (File) คือสิ่งที่ใช้แทนตำแหน่งของข้อมูลที่อยู่ในหน่วยความจำ โดยทั่วไปการตั้งชื่อไฟล์นิยมใช้เครื่องหมาย . ในการแยกชื่อกับส่วนขยายของไฟล์ (File Extension) เพื่อระบุว่าไฟล์นี้เป็นประเภทอะไร
  • ไดเรกทอรี (Directory) คือพื้นที่เสมือนในคอมพิวเตอร์ มีไว้สำหรับจัดเก็บไฟล์หรือไดเรกทอรีอื่นๆ ให้อยู่ในพื้นที่เดียวกัน

โครงสร้างของไดเรกทอรีในระบบยูนิกซ์

ไดเรกทอรีในระบบยูนิกซ์จะอ้างอิงโครงสร้างข้อมูลแบบต้นไม้หัวกลับ จากรากของต้นไม้ที่แตกรากสาขาจากด้านบนลงสู่ด้านล่าง โดยมีส่วนที่อยู่ด้านบนสุดเรียกว่า root ซึ่งแทนด้วยเครื่องหมาย / ดังรูป

dirfileunix1.png

ภาพจาก: http://www.ualberta.ca/

จาก root จะประกอบด้วยไดเรกทอรีย่อยอยู่ภายใน แต่ละไดเรกทอรีจะใช้สำหรับจัดเก็บไฟล์ที่มีการทำงานคล้ายคลึงกัน โครงสร้างไดเรกทอรีหลักๆ ของระบบยูนิกซ์เป็นดังนี้


ไดเรกทอรีหน้าที่
/root
/binเก็บโปรแกรมที่เป็นคำสั่งของระบบ
/bootเก็บ Kernel (โปรแกรมส่วนที่เป็นการทำงานหลักของระบบปฏิบัติการ) และไฟล์ที่เกี่ยวข้องกับการเริ่มต้นระบบ
/devเก็บไฟล์ที่เป็นส่วนติดต่อของอุปกรณ์ต่างๆ เช่น ดิสก์ เครื่องพิมพ์ ฯลฯ
/etcเก็บไฟล์ที่ใช้สำหรับกำหนดค่าการทำงานและไฟล์ที่เกี่ยวข้องกับการเริ่มต้นระบบ
/homeไดเรกทอรี home ของผู้ใช้ ตั้งชื่อตามชื่อบัญชีผู้ใช้
/libเก็บไฟล์ไลบรารีของระบบ
/mediamount point ของอุปกรณ์เก็บข้อมูลแบบถอดได้ (มีในระบบปฏิบัติการสมัยใหม่)
/mntmount point ของอุปกรณ์เก็บข้อมูลแบบถอดได้
/optเก็บโปรแกรมที่ผู้ใช้ติดตั้งเพิ่มเติมซึ่งไม่เกี่ยวข้องกับระบบหลัก
/procไฟล์ข้อมูลของโปรเซสทั้งหมดที่อยู่ในหน่วยความจำ
/rootไดเรกทอรี home ของ root (บางระบบปฏิบัติการจะอยู่ใน /home)
/sbinเก็บโปรแกรมที่เป็นคำสั่งของระบบที่ต้องใช้สิทธิ์ของ root ในการรัน
/tmpเก็บไฟล์ชั่วคราว (Tempolary file) จะถูกลบทิ้งเมื่อเปิดเครื่องขึ้นมาใหม่
/usrเก็บข้อมูลคำสั่งอื่นๆเพิ่มเติม โครงสร้างภายในคล้ายโครงสร้างของ /
/varเก็บไฟล์ที่เกี่ยวข้องกับการตั้งค่าและการทำงานของระบบ

คำสั่งที่เกี่ยวข้องกับการใช้งานไดเรกทอรีและไฟล์

สร้างไดเรกทอรี

  • การสร้างไดเรกทอรี สามารถทำได้โดยใช้คำสั่ง mkdir DIR_NAME เช่น mkdir abc เป็นการสร้างไดเรกทอรีชื่อ abc
  • ในกรณีที่ต้องการสร้างหลายไดเรกทอรีพร้อมกันในครั้งเดียว ใช้คำสั่ง mkdir {DIR1,DIR2,DIR3,...} เช่น mkdir {a,b,c} จะเป็นการสร้าง 3 ไดเรกทอรี คือ a, b และ c
  • ในกรณีที่ต้องการสร้างไดเรกทอรีที่มีไดเรกทอรีย่อยอยู่ภายใน ใช้คำสั่ง mkdir -p /PARENT1/PARENT2/CHILD เช่น mkdir -p q/w/e จะเป็นการสร้างไดเรกทอรี q ซึ่งมีไดเรกทอรี w อยู่ภายใน และมีไดเรกทอรี e อยู่ภายในไดเรกทอรี w อีกที

ลบไดเรกทอรี

  • การลบไดเรกทอรี ใช้คำสั่ง rm -r DIRECTORY_NAME
  • ถ้าไดเรกทอรีที่ต้องการลบนั้นมีไฟล์หรือไดเรกทอรีอยู่ภายใน จะไม่สามารถทำการลบได้ถ้าไม่ลบไฟล์หรือไดเรกทอรีทั้งหมดที่อยู่ภายในก่อน แต่ถ้าต้องการลบทิ้งทั้งไดเรกทอรีโดยไม่สนใจสิ่งที่อยู่ภายใน สามารถใช้คำสั่ง rm -rf DIRECTORY_NAME เพื่อบังคับให้ระบบลบไดเรกทอรีนั้นได้

สร้างไฟล์

  • การสร้างไฟล์เปล่าๆ ขึ้นมาโดยไม่มีเนื้อหาอะไร สามารถทำได้โดยใช้คำสั่ง touch FILENAME เช่น คำสั่ง touch test.txt จะได้ไฟล์ชื่อ test.txt

ลบไฟล์

  • การลบไฟล์ ใช้คำสั่ง rm FILENAME เช่น คำสั่ง rm test.txt เป็นการลบไฟล์ test.txt

คัดลอกไฟล์/ไดเรกทอรี

  • การคัดลอกไฟล์หรือไดเรกทอรี ใช้คำสั่ง cp SOURCE TARGET เช่น cp test.txt test2.txt เป็นการคัดลอกไฟล์ test.txt มาสร้างเป็นไฟล์ชื่อ test2.txt

ย้าย/เปลี่ยนชื่อไฟล์หรือไดเรกทอรี

  • ในระบบยูนิกซ์ การย้ายและการเปลี่ยนชื่อไฟล์หรือไดเรกทอรี สามารถทำได้โดยใช้คำสั่ง mv
  • การย้ายไฟล์หรือไดเรกทอรีไปไว้ที่ใหม่ ใช้คำสั่ง mv FILENAME NEW_DIR เช่น mv test.txt /tmp จะเป็นการย้ายไฟล์ test.txt จากตำแหน่งปัจจุบันไปไว้ที่ /tmp
  • การเปลี่ยนชื่อไฟล์หรือไดเรกทอรี ใช้คำสั่ง mv OLD_NAME NEW_NAME เช่น mv file1.txt file2.txt จะเป็นการเปลี่ยนชื่อไฟล์จาก file1.txt เป็น file2.txt

เปลี่ยนไดเรกทอรี

  • การเปลี่ยนไดเรกทอรีจากตำแหน่งปัจจุบันไปยังตำแหน่งอื่น ใช้คำสั่ง cd DIRECTORY_NAME ซึ่งการระบุ DIRECTORY_NAME สามารถทำได้หลายแบบ ดังนี้
    • ระบุ เป็น absolute path จะอ้างอิงตำแหน่งที่อยู่จาก / เช่น ถ้าปัจจุบันอยู่ที่ /home/user/files/ เมื่อพิมพ์ cd /bin จะเป็นการย้ายไปที่ไดเรกทอรี /bin
    • ระบุ เป็น relative path จะอ้างอิงตำแหน่งจากจุดที่อยู่ปัจจุบัน เช่น ถ้าปัจจุบันอยู่ที่ /home/user/files/ เมื่อพิมพ์ cd work จะเป็นการย้ายไปที่ไดเรกทอรี /home/user/files/work
    • ตำแหน่งปัจจุบัน แทนด้วยเครื่องหมาย .
    • ตำแหน่ง ของไดเรกทอรีที่อยู่ด้านบนขึ้นไป (parent directory) แทนด้วยเครื่องหมาย .. เช่น ถ้าปัจจุบันอยู่ที่ /home/user/files/ เมื่อพิมพ์ cd .. จะเป็นการย้ายไปที่ไดเรกทอรี /home/user/
    • ตำแหน่ง ของไดเรกทอรี home ของผู้ใช้ แทนด้วยเครื่องหมาย ~ ถ้าปัจจุบันอยู่ที่ /home/user/files/work เมื่อพิมพ์ cd ~ จะเป็นการย้ายไปที่ไดเรกทอรี /home/user/ นอกจากนี้การพิมพ์คำสั่ง cd โดยไม่ระบุ path ปลายทาง ก็จะเป็นการย้ายตำแหน่งมาที่ไดเรกทอรี home ของผู้ใช้ด้วยเช่นกัน

ตรวจสอบตำแหน่งของไดเรกทอรีที่อยู่ในปัจจุบัน

  • การตรวจสอบตำแหน่งของไดเรกทอรีที่อยู่ในปัจจุบัน สามารถทำได้โดยใช้คำสั่ง pwd (ย่อมาจาก Print Working Directory) ซึ่งจะได้ผลลัพธ์ออกมาเป็น absolute path ของไดเรกทอรีที่ทำงานอยู่ในขณะนั้น

แสดงรายชื่อไดเรกทอรีหรือไฟล์ทั้งหมดในไดเรกทอรีที่ระบุ

  • ในการแสดงรายชื่อไดเรกทอรีหรือไฟล์ทั้งหมดที่อยู่ในไดเรกทอรีที่ระบุ สามารถทำได้โดยใช้คำสั่ง ls DIRECTORY_NAME ถ้าไม่ระบุชื่อไดเรกทอรี จะเป็นการแสดงข้อมูลในไดเรกทอรีที่ทำงานอยู่ในปัจจุบัน
  • ถ้าต้องการดูข้อมูลในไดเรกทอรีย่อยด้วย ใช้คำสั่ง ls -R
  • ถ้าต้องการดูข้อมูลแบบละเอียด ใช้คำสั่ง ls -l ซึ่งจะได้ผลดังภาพด้านล่าง
dirfileunix2.png

รายละเอียดของข้อมูลต่างๆ ที่แสดงผลอธิบายได้ตามหมายเลข ดังนี้

dirfileunix3.png
  1. จำนวนของลิงก์ทั้งหมดที่มีในไดเรกทอรีนั้น ซึ่งประกอบด้วยจำนวนไฟล์หรือไดเรกทอรีที่อยู่ภายใน บวกกับลิงก์ของตัวไดเรกทอรีเอง
  2. ประเภทของไฟล์และสิทธิ์ในการใช้งาน (Permission) ตัวอักษรตัวแรกคือประเภทของไฟล์ ถ้าเป็นเครื่องหมาย - หมายถึงไฟล์ธรรมดา ถ้าเป็น d หมายถึงไดเรกทอรี และถ้าเป็น l หมายถึงลิงก์
  3. จำนวนลิงก์ทั้งหมดที่อยู่ภายในไดเรกทอรีนั้น ถ้าเป็นไฟล์จะมีแค่ 1 ลิงก์
  4. เจ้าของไฟล์ (Owner)
  5. กลุ่ม (Group)
  6. ขนาด (Size) มีหน่วยเป็นไบต์ ถ้าเป็นไฟล์จะเป็นขนาดของไฟล์ ถ้าเป็นไดเรกทอรีจะเป็นจำนวนบล็อกที่ใช้ต่อ 1 ไดเรกทอรี ซึ่งโดยปกติแล้วจะเป็น 4096
  7. วันที่เข้าใช้งานล่าสุด
  8. เวลาที่เข้าใช้งานล่าสุด
  9. ชื่อไฟล์หรือชื่อไดเรกทอรีนั้นๆ ถ้าเป็นลิงก์จะแสดงเครื่องหมาย -> ไปที่ตำแหน่งของไฟล์จริง

การสร้างลิงก์

  • ลิงก์ (Link) ในระบบยูนิกซ์ จะเป็นการอ้างอิงถึงไฟล์หรือตำแหน่งของข้อมูลบนดิสก์ มีอยู่ด้วยกัน 2 แบบ คือ Hard Link และ Symbolic Link
    • Hard Link เป็นการสร้างตัวอ้างอิงข้อมูลที่อยู่ในดิสก์ โดยใช้ inode (ส่วนที่เก็บเนื้อหาและคุณสมบัติของข้อมูล) เดียวกัน ทำให้ข้อมูลชุดเดียวสามารถปรากฏในหลายที่พร้อมกันได้ การสร้าง Hard Link จำเป็นที่จะต้องสร้างบนระบบไฟล์ (File System) ชนิดเดียวกันเท่านั้น ข้อดีของ Hard Link คือ เมื่อไฟล์ใดไฟล์หนึ่งถูกลบ ข้อมูลในดิสก์ส่วนนั้นยังคงเข้าถึงจากไฟล์ที่เหลืออยู่ได้ [2]
      dirfileunix4.png
    • Symbolic Link เป็นการสร้างตัวอ้างอิงจากไฟล์ที่มีอยู่แล้ว ทำให้เมื่อไฟล์ต้นฉบับถูกลบ ข้อมูลในส่วนนั้นก็จะไม่สามารถเข้าถึงได้จาก Link ที่สร้างไว้ได้ การสร้าง Symbolic Link สามารถสร้างบนระบบไฟล์ที่แตกต่างกันได้
      dirfileunix5.png
  • เมื่อใช้คำสั่ง ls -l เพื่อดูข้อมูลในไดเรกทอรี จะพบว่า ไฟล์ที่เป็นลิงก์จะมีการแสดงเครื่องหมาย -> เพื่อบอกว่าไฟล์นี้จะลิงก์ไปยังไฟล์ไหน
  • การสร้างลิงก์แบบ Hard Link ใช้คำสั่ง ln FILENAME LINKNAME เช่น ln def ghi จะเป็นการสร้างลิงก์ชื่อ ghi โดยลิงก์นี้จะเชื่อมต่อไปที่ตำแหน่งของข้อมูลเดียวกันกับไฟล์ def
  • การสร้างลิงก์แบบ Symbolic Link ใช้คำสั่ง ln -s FILENAME LINKNAME เช่น ln -s def ghi จะเป็นการสร้างลิงก์ชื่อ ghi โดยลิงก์นี้จะเชื่อมต่อที่ไฟล์ def

การตรวจสอบประเภทของไฟล์

  • ในกรณีที่ต้องการตรวจสอบไฟล์ที่ไม่รู้จัก ว่าไฟล์นั้นเป็นไฟล์ประเภทไหน สามารถใช้คำสั่ง file FILENAME เพื่อดูข้อมูลของไฟล์นั้นได้ เช่น คำสั่ง file /bin/ls เป็นการดูประเภทของไฟล์ /bin/ls ซึ่งจะได้ผลลัพธ์ดังนี้
dirfileunix6.png

จากผลลัพธ์ดังกล่าว จะพบว่า ไฟล์ /bin/ls เป็นไฟล์ประเภท executable (สามารถประมวลผลได้) ของระบบปฏิบัติการ Linux
  • คำสั่ง file เป็นการวิเคราะห์ประเภทของไฟล์ จากส่วนหัว (header) ของไฟล์นั้นๆ

การค้นหาไฟล์

  • การค้นหาไฟล์ที่อยู่ในไดเรกทอรีที่กำหนด ใช้คำสั่ง find PATH -name FILENAME เช่น คำสั่ง find /etc -name passwd เป็นการค้นหาว่ามีไฟล์ชื่อ passwd อยู่ในไดเรกทอรี /etc หรือไม่
  • ถ้าต้องการค้นหาไฟล์โดยไม่ระบุไดเรกทอรี ใช้คำสั่ง locate FILENAME เช่น locate php.ini

การสร้าง archive และการบีบอัดข้อมูล

  • การสร้าง archive คือการรวมไฟล์ทุกไฟล์ในไดเรกทอรีให้เป็นไฟล์เดียว สามารถทำได้โดยใช้คำสั่ง tar cvf ARCHIVE.tar DIRECTORY เช่น tar cvf docs.tar /home/user/document จะเป็นการรวมไฟล์ทุกไฟล์ในไดเรกทอรี /home/user/document ให้เป็นไฟล์ชื่อว่า docs.tar
  • การเพิ่มไฟล์ใน archive ทำได้โดยใช้คำสั่ง tar -r NEWFILE -f ARCHIVE.tar
  • ในการบีบอัดข้อมูล จำเป็นต้องทำ 2 ขั้นตอน คือ สร้าง archive แล้วจึงเอา archive นั้นมาบีบอัด
  • การบีบอัดข้อมูลในระบบยูนิกซ์สามารถทำได้หลายแบบ แต่ที่นิยมใช้กันทั่วไปคือใช้วิธีบีบอัดแบบ gzip และ bzip โดยที่ bzip จะสามารถบีบอัดข้อมูลได้มากกว่าแต่จะใช้เวลาบีบอัดนานกว่า gzip
    • การบีบอัดแบบ gzip ผลลัพธ์ที่ได้จะเป็นไฟล์ .tar.gz สามารถทำได้โดยใช้คำสั่ง tar czvf ARCHIVE.tar.gz DIRECTORY
    • การบีบอัดแบบ bzip ผลลัพธ์ที่ได้จะเป็นไฟล์ .tar.bz หรือ .tar.bz2 ขึ้นอยู่กับขั้นตอนวิธีที่ใช้ในการบีบอัด สามารถทำได้โดยใช้คำสั่ง tar cjvf ARCHIVE.tar.bz DIRECTORY
  • การแตกไฟล์ (Extract) จาก archive ใช้คำสั่ง tar xvf ARCHIVE.tar
  • ในกรณีที่ต้องการแตกไฟล์จาก archive ที่ถูกบีบอัด ต้องตรวจสอบว่าไฟล์นั้นถูกบีบอัดมาโดยใช้วิธีอะไร
    • ถ้าบีบอัดด้วย gzip ใช้คำสั่ง tar xzvf ARCHIVE.tar.gz
    • ถ้าบีบอัดด้วย bzip ใช้คำสั่ง tar xjvf ARCHIVE.tar.bz2

การกำหนดสิทธิ์การใช้งาน (Permission)

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

การกำหนดความเป็นเจ้าของไฟล์ (File ownership)

  • ทุกไฟล์ในระบบ สามารถมีเจ้าของ (Owner) และกลุ่ม (Group) ได้แค่อย่างละ 1 เท่านั้น
  • ผู้ที่เป็นเจ้าของไฟล์ หรืออยู่ในกลุ่มที่กำหนด สามารถดำเนินการกับไฟล์ (อ่าน,เขียน,ประมวลผล) ได้ตามสิทธิ์ที่กำหนดใน Permission bit ซึ่งเป็นตัวเลขที่ใช้ในการกำหนดสิทธิ์การใช้งาน
  • การเปลี่ยน Owner ของไฟล์ ใช้คำสั่ง chown USER FILENAME
  • การเปลี่ยน Group ของไฟล์ ใช้คำสั่ง chgrp GROUP FILENAME

การกำหนดสิทธิ์การใช้งาน (Permission)

  • สิทธิ์การใช้งาน สามารถมารถกำหนดได้ 6 อย่าง ได้แก่
    • Read แทนด้วยเครื่องหมาย r
    • Write แทนด้วยเครื่องหมาย w
    • Execute แทนด้วยเครื่องหมาย x
    • SUID แทนด้วยเครื่องหมาย S
    • SGID แทนด้วยเครื่องหมาย S
    • Sticky แทนด้วยเครื่องหมาย t

ซึ่งความหมายของสิทธิ์ทั้ง 6 อย่างจะอธิบายในลำดับถัดไป

  • สิทธิ์การใช้งาน แบ่งออกเป็น 3 ส่วน ตามประเภทของผู้ใช้งาน ซึ่งได้แก่
    • User เจ้าของไฟล์นั้นๆ แทนด้วยเครื่องหมาย u
    • Group คนที่อยู่ในกลุ่มเดียวกันกับกลุ่มที่เจ้าของไฟล์นั้นอยู่ แทนด้วยเครื่องหมาย g
    • Other คนอื่นๆ ที่ไม่ใช่เจ้าของไฟล์และไม่ได้อยู่ในกลุ่มที่เจ้าของไฟล์อยู่ แทนด้วยเครื่องหมาย o
  • การตรวจสอบสิทธิ์การใช้งานสามารถทำได้โดยใช้คำสั่ง ls -l FILENAME เช่น ls -l /etc/passwd จะได้ผลดังรูป
dirfileunix7.png

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

User Group Other
Read Write Execute Read Write Execute Read Write Execute

จากตัวอย่าง จะพบว่า สิทธิ์การใช้งานของไฟล์ /etc/passwd คือ rw-r--r-- แบ่งดูรายละเอียดทีละส่วน ดังนี้

  • r-- คือสิทธิ์ของคนที่อยู่ในกลุ่มเดียวกันกับเจ้าของไฟล์
  • rw- คือสิทธิ์ของเจ้าของไฟล์
  • r-- คือสิทธิ์ของคนอื่นๆที่ไม่ใช่เจ้าของไฟล์และไม่ได้อยู่ในกลุ่มเดียวกันกับเจ้าของไฟล์

จากรูป จะพบว่า เจ้าของไฟล์ /etc/passwd คือ root และอยู่ในกลุ่มที่ชื่อ root จากข้อกำหนด rw- แสดงว่าเจ้าของไฟล์สามารถอ่านและเขียนไฟล์นี้ได้ แต่ไม่สามารถสั่งประมวลผลไฟล์นี้ได้ ส่วนคนที่อยู่ในกลุ่มที่ชื่อ root จะได้รับสิทธิ์ r-- คืออ่านได้อย่างเดียว ซึ่งคนอื่นๆ นอกเหนือจากนี้จะได้สิทธิ์ r-- ก็จะสามารถอ่านได้อย่างเดียวเช่นกัน

ในส่วนของไฟล์ /bin/bash จะพบว่ามีสิทธิ์การใช้งานคือ rwxr-xr-x หมายความว่า เจ้าของไฟล์ได้สิทธิ์ rwx คือสามารถอ่าน เขียน และสั่งประมวลผลไฟล์นี้ได้ แต่คนที่อยู่ในกลุ่มเดียวกับเจ้าของไฟล์และคนอื่นๆ นอกเหนือจากนี้จะได้สิทธิ์ r-x คืออ่านและสั่งประมวลผลไฟล์ได้อย่างเดียว ไม่สามารถแก้ไขได้

SUID, SGID และ Sticky

ทั้ง SUID, SGID และ Sticky ต่างก็เป็นบิทพิเศษที่เอาไว้กำหนดค่าการนำงานในกรณีที่มีการประมวลผลไฟล์ นั้นๆ โดยทั้ง 3 บิทนี้จะแสดงในส่วนของ Execute bit โดยแต่ละแบบมีการทำงานดังนี้
  • SUID เมื่อมีใครก็ตามรันไฟล์นี้ โปรเซสนั้นจะถูกรันโดยใช้ชื่อของเจ้าของไฟล์
  • SGID เมื่อมีใครก็ตามรันไฟล์นี้ โปรเซสนั้นจะถูกรันโดยใช้ชื่อของกลุ่มที่ระบุ
  • Sticky ใครก็ตามสามารถอ่านหรือแก้ไขไฟล์นี้ได้ แต่ไฟล์นี้จะไม่สามารถถูกคนอื่นลบได้ นอกจากเจ้าของไฟล์เท่านั้น
  • เมื่อมีการกำหนดค่า SUID หรือ SGID แล้ว บิทที่เป็นส่วนของ Execute bit จะแสดงสัญลักษณ์ตัว S เช่น ถ้ากำหนด SUID ให้กับไฟล์ ไฟล์นั้นจะมีสิทธิ์การใช้งานเป็น rwS------
  • เมื่อมีการกำหนดค่า Sticky bit ให้กับไฟล์ บิทที่เป็นส่วนของ Execute bit จะแสดงสัญลักษณ์ตัว t

การกำหนดหรือแก้ไขสิทธิ์การใช้งาน

ในการกำหนดหรือแก้ไขสิทธิ์การใช้งานของไฟล์หรือไดเรกทอรี ใช้คำสั่ง chmod {parameter} FILENAME การกำหนด parameter สามารถทำได้ 2 วิธี คือ ใช้แบบตัวอักษร และแบบตัวเลข

  • การกำหนดสิทธิ์โดยใช้ตัวอักษร
    • การกำหนดผู้ใช้
      • ใช้ u แทน User (เจ้าของไฟล์)
      • ใช้ g แทน Group (กลุ่มที่ไฟล์นั้นอยู่)
      • ใช้ o แทน Other (คนอื่นๆ นอกเหนือจากนี้)
      • ใช้ a แทน All (ทั้ง 3 ประเภทที่กล่าวมา)
    • การกำหนดสิทธิ์
      • ใช้ r แทน Read (อ่าน)
      • ใช้ w แทน Write (เขียน)
      • ใช้ x แทน Execute (ประมวลผล)
      • ใช้ s แทนการเซ็ต SUID หรือ SGID
      • ใช้ t แทนการเซ็ต Sticky
    • การเพิ่มสิทธิ์ ใช้เครื่องหมาย + และการยกเลิกสิทธิ์ ใช้เครื่องหมาย -
    • การกำหนดหรือแก้ไขสิทธิ์ ใช้คำสั่ง chmod [user][+/-][permission] FILENAME เช่น chmod g+rw file เป็นการเพิ่มสิทธิ์ในการอ่านและเขียนไฟล์ให้กับ group หรือคำสั่ง chmod ug-w+s เป็นการกำหนดสิทธิ์ในการห้ามเขียนไฟล์พร้อมทั้งกำหนด SUID และ SGID ให้กับ User และ Group
  • การกำหนดสิทธิ์โดยใช้ตัวเลข
    • ใส่ parameter เป็นตัวเลข 4 ตัว
      • ตัวแรกสุดเป็นการเซ็ต SUID, SGID หรือ stickey
      • ตัวที่สองเป็นการกำหนดสิทธิ์ของ User
      • ตัวที่สามเป็นการกำหนดสิทธิ์ของ Group
      • ตัวที่สี่เป็นการกำหนดสิทธิ์ของ Other
    • ตัวเลขแต่ละตัวมีความหมายดังนี้
สิทธิ์การใช้งาน ค่า
SUID 4
SGID 2
Sticky 1
Read 4
Write 2
Execute 1

    • การกำหนดสิทธิ์ในส่วนของ SUID, SGID หรือ Sticky จะใส่หรือไม่ใส่ก็ได้ ซึ่งถ้าไม่ใส่โดยปกติจะมีค่าเป็น 0
    • ถ้าเอาค่าของตัวเลขแต่ละส่วนมาบวกกันจะสามารถกำหนดสิทธิ์ได้หลากหลายแบบ เช่น
0 7 5 5
- rwx r-x r-x
4 6 4 1
- rwS r-- --x
5 2 3 1
- -wS -wx --t

จากตารางที่ยกตัวอย่างไว้ด้านบน จะพบว่า ถ้ากำหนด Permission เป็น 0755 จะมีค่าเป็น rwxr-xr-x หรือถ้ากำหนด Permission เป็น 4641 จะมีค่าเป็น rwSr----x เป็นต้น

ตัวเลข 0755 ในตารางด้านบนเกิดขึ้นเนื่องจาก

    • กำหนดให้ User สามารถ Read, Write และ Execute ได้ ซึ่งเมื่อนำเลข 4 + 2 + 1 จะได้เท่ากับ 7
    • กำหนดให้ Group สามารถ Read และ Execute ได้ ซึ่งเมื่อนำเลข 4 + 1 จะได้เท่ากับ 5
    • สิทธิ์ของ Other มีที่มาเช่นเดียวกับสิทธิ์ของ Group

ตัวเลข 4641 ในตารางด้านบนเกิดจาก

    • กำหนดค่า SUID ซึ่งจากตาราง SUID มีค่าเท่ากับ 4
    • กำหนดให้ User สามารถ Read และ Write ได้ ซึ่งเมื่อนำเลข 4 + 2 จะได้เท่ากับ 6
    • กำหนดให้ Group สามารถ Read ได้อย่างเดียว จึงมีค่าเป็น 4
    • กำหนดให้ Other สามารถ Execute ได้อย่างเดียว จึงมีค่าเป็น 1

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

อ้างอิง

  1. http://en.wikipedia.org/wiki/Unix
  2. http://en.wikipedia.org/wiki/Hard_link

Clear