Prac-04(New) ปฏิบัติการครั้งนี้มี ๒ ตอน ตอนแรกเป็นการทดลองและสรุปสิทธิของไดเรกทอรีแะแฟ้ม ตอนที่สองเป็นการสร้างและกำหนดให้ shell script ทำงาน ตอนที่ ๑ สิทธิ w ของแฟ้มและไดเรกทอรี -------------------------------- กำหนดให้ไดเรกทอรีปัจจุบันเป็น ~/886326 และมีสร้างไดเรกทอรีย่อย testdir และสร้างแฟ้ม aa.txt ในไดเรกทอรีใหม่ดังนี้ $ mkdir testdir $ ls -ld testdir # -d ดูรายละเอียดของไดเรกทอรีที่สร้างใหม่ drwx------ 2 jira staff 4096 Jan 25 07:43 testdir # ไม่ใช่รายละเอียดของแฟ้มในไดเรกทอรี $ echo "This is a test." > testdir/aa.txt # สร้างแฟ้ม aa.txt โดยการ redirection จากคำสั่ง echo $ ls -l testdir # ขอดูรายชื่อแฟ้มในไดเรกทอรี testdir -rw------- 1 jira staff 16 Jan 25 07:43 aa.txt # มีแฟ้ม aa.txt เพียงแฟ้มเดียว $ cat testdir/aa.txt # ขอดูข้อมูลในแฟ้ใ This is a test. ตอนที่ ๑.๑ สิทธิ r (read) ของไดเรกทอรี - ตัวอย่าง ------------------------------------------- $ chmod 300 testdir # ถอนสิทธิ read ออกจากไดเรกทอรี testdir $ ls -ld testdir # และตรวจสอบยืนยัน d-wx------ 2 jira staff 4096 Jan 25 07:43 testdir $ cd testdir # เปลี่ยนเข้าไปภายใน testdir $ ls # ขอดูรายชื่อแฟ้มในไดเรกทอรี ls: cannot open directory .: Permission denied # ไม่สามารถ "เปิด" ไดเรกทอรีได้ .: (ระบบ) ปฏิเสธการใช้สิทธิ $ cat aa.txt # แสดงข้อมูลในแฟ้ม aa.txt ที่แน่ใจว่ามีอยู่ This is a test. สรุป : หากไดเรกทอรีไม่มีสิทธิ read (r) - เปลี่ยนเข้าไปยังไดเรกทอรีนั้นได้ - แสดงรายชื่อแฟ้มในไดเรกทอรีไม่ได้ - สามารถใช้แฟ้มในไดเรกทอรีได้ หากรู้ชื่อแฟ้ม ตอนที่ ๑.๒ สิทธิ w (write) ของไดเรกทอรี ----------------------------------- เปลี่ยนสิทธิการใช้งานไดเรกทอรี testdir กลับมาเป็น drwx------ เช่นเดิม และตรวจสอบว่าแฟ้ม aa.txt มีสิทธิการใช้งานเป็น -rw-------ก่อนทำการทดลองต่อไป จงออกแบบการทดลองและสรุปผลของการทำงาน เมื่อทดลองถอนสิทธิ w (write) ออกจากไดเรกทอรี testdir โดยทำการทดลองดังนี้ - เปลี่ยนการทำงานเข้าไปยังไดเรกทอรี testdir ด้วยคำสั่ง cd - การสร้างแฟ้มใหม่ bb.txt ด้วยคำสั่ง touch - การแก้ไขข้อมูลในแฟ้ม aa.txt ด้วยโปรแกรม editor เช่น vi - การเปลี่ยนชื่อแฟ้ม aa.txt เป็น bb.txt ด้วยคำสั่ง mv - การลบแฟ้ม aa.txt ด้วยคำสั่ง rm ในกรณีที่ไม่สามารถดำเนินการได้ ข่าวสารแสดงความผิดพลาดที่ระบบแสดงเป็นอย่างไร? หมายความว่าอย่างไร? และจงสรุปผลตามตัวอย่างในหัวข้อ ๑.๑ ตอนที่ ๑.๓ สิทธิ x (execute) ของไดเรกทอรี ------------------------------------- เปลี่ยนสิทธิการใช้งานไดเรกทอรี testdir กลับมาเป็น drwx------ เช่นเดิม และตรวจสอบว่าแฟ้ม aa.txt มีสิทธิการใช้งานเป็น -rw-------ก่อนทำการทดลองต่อไป จงออกแบบการทดลองและสรุปผลของการทำงาน เมื่อทดลองถอนสิทธิ x (execute) ออกจากไดเรกทอรี testdir โดยทำการทดลองดังนี้ (ในกรณีที่ไม่สามารถเปลี่ยนเข้าไปยังไดเรกทอรี testdir ได้ ยังสามารถอ้างถึงแฟ้มในไดเรกทอรีได้ เช่นอ้างถึง bb.txt โดยใช้ชื่อเส้นทางเป็น testdir/bb.txt) - การเปลี่ยนไดเรกทอรีเข้าไปยัง testdir ด้วยคำสั่ง cd - การแสดงรายชื่อแฟ้มในไดเรกทอรี testdir ด้วยคำสั่ง ls และ ls -l - การสร้างแฟ้มใหม่ bb.txt ด้วยคำสั่ง touch - การขอดูข้อมูลในแฟ้ม aa.txt ด้วยคำสั่ง cat testdir/aa - การเปลี่ยนชื่อแฟ้ม aa.txt เป็น bb.txt ด้วยคำสั่ง mv - การลบแฟ้ม aa.txt ด้วยคำสั่ง rm ในกรณีที่ไม่สามารถดำเนินการได้ ข่าวสารแสดงความผิดพลาดที่ระบบแสดงเป็นอย่างไร? เหมือนกันหรือต่างจากข่าวสารที่ได้ในตอนที่ ๑.๒อย่างไร? และจงสรุปผลตามตัวอย่างในหัวข้อ ๑.๑ ตอนที่ ๑.๔ สิทธิ w (write) ของไดเรกทอรี และแฟ้ม ------------------------------------------- เปลี่ยนสิทธิการใช้งานไดเรกทอรี testdir เป็น dr-x------ และสิทธิการใช้งานแฟ้ม aa.txt -r-------- เมื่อทำการลบแฟ้ม aa.txt จะมีผลลัพธ์อย่างไร? และจงสรุปความสัมพันธ์ระหว่างสิทธิ w ของไดเรกทอรีและแฟ้ม ------------------------------------------------------------ ตอนที่ ๒ Shell script สำหรับปฏิบัติการครั้งที่ ๒ ----------------------------------------- การสร้างโครงสร้างไดเรกทอรีตามปฏิบัติการครั้งที่ ๒ สามารถทำให้เป็นอัตโนมัติได้ โดยการเขียน shell script ดังต่อไปนี้ (บรรทัดที่ขึ้นต้นด้วยเครื่องหมาย # เป็น comment ยกเว้นบรรทัดแรกคือ #!/bin/bash เป็นคำสั่งพิเศษ เพื่อกำหนดให้ script ทำงานในสิ่งแวดล้อมของ Bourne Again Shell) แฟ้ม Script02: Bourne shell script เขียนตามลำดับขั้นตอนของงานที่กำหนดไว้ในปฏิบัติการครั้งที่ ๒ ----------------------------------------------- #!/bin/bash # สร้างโครงสร้างไดเรกทอรีตามที่กำหนดในปฏิบัติการครั้งที่ ๒ (Prac02) # กำหนดให้ไดเรกทอรีปัจจุบันเป็น ~/886326 # การเตรียมการ - สร้างแฟ้ม xx.txt โดยใช้คำสั่ง echo และเปลี่ยนทิศทาง output ไปยังแฟ้ม xx.txt # > เป็นการเปลี่ยนแทนข้อมูลในแฟ้มที่กำหนด (ถ้ามี) ด้วย output ของ echo # >> เป็นการนำ output ของ echo ไปต่อท้ายข้อมูลในแฟ้มที่กำหนด echo 0123456789 > xx.txt echo 1234567890 >> xx.txt echo 2345678901 >> xx.txt echo 3456789012 >> xx.txt echo 4567890123 >> xx.txt echo 5678901234 >> xx.txt echo 6789012345 >> xx.txt echo 7890123456 >> xx.txt echo 8901234567 >> xx.txt echo 9012345678 >> xx.txt # คัดลอก xx.txt ไว้อีกสามสำเนาคือ xy.txt, xz.txt และ yy.txt cp xx.txt xy.txt cp xx.txt xz.txt cp xx.txt yy.txt # สร้างไดเรกทอรี H และ K mkdir H K # สร้างไดเรกทอรีย่อย 5 ไดเรกทอรีใต้ H ได้แก่ A, B, C, D และ E mkdir ./H/A ./H/B ./H/C ./H/D ./H/E # สร้างไดเรกทอรีย่อย 2 ไดเรกทอรีใต้ K ได้แก่ F และ G mkdir ./K/F ./K/G # 1. คัดลอกแฟ้ม xx.txt ไปยังไดเรกทอรี A, C, D ซึ่งอยู่ในไดเรกทอรี H; F ซึ่งอยู่ในไดเรกทอรี K; และไดเรกทอรี H cp xx.txt ./H/A cp xx.txt ./H/C cp xx.txt ./H/D cp xx.txt ./K/F cp xx.txt ./H # 2. คัดลอกแฟ้ม yy.txt ไปยังไดเรกทอรี B, C, E ซึ่งอยู่ในไดเรกทอรี H; G ซึ่งอยู่ในไดเรกทอรี K; และไดเรกทอรี K cp yy.txt ./H/B cp yy.txt ./H/C cp yy.txt ./H/E cp yy.txt ./K/G cp yy.txt ./K # 3. แฟ้มที่อยู่ในไดเรกทอรี H (xx.txt) และแฟ่มที่อยู่ในไดเรกทอรี K (yy.txt) กำหนดให้เจ้าของและกลุ่มมีสิทธิ # read และ write ผู้ใช้อื่นในระบบมีสิทธิเฉพาะ read หรือ (rw- rw- r--) = 664 (ฐานแปด) chmod 664 ./H/xx.txt ./K/yy.txt # 4. แฟ้มที่อยู่ในไดเรกทอรี A คือ xx.txt, แฟ้มที่อยู่ในไดเรกทอรี B คือ yy.txt , แฟ้มที่อยู่ในไดเรกทอรี C คือ xx.txt และ yy.txt, # แฟ้มที่อยู่ในไดเรกทอรี D คือ xx.txt และแฟ้มที่อยู่ในไดเรกทอรี E คือ yy.txt กำหนดให้เจ้าของมีสิทธิ read และ write # กลุ่มมีสิทธิเฉพาะ read ผู้ใช้อื่นในระบบไม่มีสิทธิใดเลย หรือ (rw- r-- ---) = 640 (ฐานแปด) chmod 640 ./H/A/xx.txt ./H/B/yy.txt ./H/C/*.txt ./H/D/xx.txt ./H/E/yy.txt # 5. แฟ้มที่อยู่ในไดเรกทอรี F คือ xx.txt และแฟ้มที่อยู่ในไดเรกทอรี G คือ yy.txt ให้เจ้าของมีสิทธิเฉพาะ read # กลุ่มและผู้ใช้ไม่มีสิทธิใดเลย หรือ (r-- --- ---) = 400 (ฐานแปด) chmod 400 ./K/F/xx.txt ./K/G/yy.txt เมื่อทำการศึกษาการทำงานจาก comment จนเข้าใจดีแล้ว จงพิมพ์ หรือ คัดลอกโปรแกรม lab02 เพื่อทดลองให้ทำงานดังต่อไปนี้ $ Script02 # สั่งให้ script ทำงาน -bash: ./Script02: Permission denied # ไม่มีสิทธิในการใช้งาน -- ไม่มีสิทธิ execute ถึงแม้ว่าจะมีการกำหนด file creation mask (umask) ไว้เป็น 0077 ซึ่งจะมีผลทำให้แฟ้มที่สร้างใหม่ มีสิทธิในการใช้งานเป็น rwx --- --- แต่ระบบปฏิบัติการจะกำหนดสิทธิ execute ให้เฉพาะแฟ้มโปรแกรมที่เป็นภาษาเครื่อง (binary executable file) เช่นแฟ้มที่ได้จากการทำงานตัวแปลภาษา (compiler) เท่านั้น แฟ้มที่เป็น text file ธรรมดา ระบบจะกำหนดให้มีสิทธิเฉพาะ read/write เท่านั้น แฟ้ม shell script ที่สร้างขึ้นเป็น text file จึงมีสิทธิเฉพาะ read/write ก็เช่นเดียวกัน จึงไม่สามารถ execute ได้เพราะไม่มีสิทธิ จึงต้องใช้คำสั่ง chmod เปลี่ยนให้เจ้าของมีสิทธิ execute เช่น $ chmod 700 Script02 แต่ก่อนที่จะทำการ Run เพื่อให้สร้างไดเรกทอรีและแฟ้มตามที่กำหนด หากมีแฟ้มและไดเรกทอรีเดิมต้องลบออกก่อน ดังนี้ (กำหนดให้ไดเรกทอรีปัจจุบันเป็น ~/886326) $ rm *.txt # ลบแฟ้มทุกแฟ้มที่มีส่วนขยายเป็น txt $ rm -rf H G # ลบแฟ้มทุกแฟ้มในไดเรกทอรี H และ G และไดเรกทอรีทั้งสองด้วยโดยวิธี recursive # ในกรณีที่มีแฟ้ม read only (หรือ write protected) ให้ลบโดยไม่ต้องถามผู้ใช้ (force) เมื่อลบเรียบร้อยแล้ว จึงให้ Script02 ทำงาน โดยเรียกชื่อแฟ้มดังนี้ $ Script02 Script นี้จะทำการสร้างไดเรกทอรี, แฟ้ม และกำหนดสิทธิของแฟ้มตามที่กำหนดไว้ในปฏิบัติการครั้งที่ ๒ ปฏิบัติการ ------- เมื่อศึกษาทดลองจนเข้าใจดีแล้ว จงเขียน shell script ชื่อ Script03 ซึ่งเมื่อให้ทำงานจะทำการลบแฟ้มและไดเรกทอรีที่สร้างขึ้นจาก Script02 ทีละขั้นตอน โดยการเปลี่ยนสิทธิ ลบแฟ้ม ลบไดเรกทอรี ทีละระดับ จากล่างขึ้นบน หรือเป็นการทำงานย้อนกลับของ Script02 เพื่อฝึกประสบการณ์และความชำนาญ --- ไม่อนุญาตให้ใช้การลบแบบ recursive --- คำแนะนำ: ดำเนินการโดยป้อนคำสั่งให้กับเชลล์ทีละคำสั่ง บันทึกคำสั่งที่ทำงานถูกต้องไว้ และนำมารวมกันเป็น shell script หากไม่สันทัดภาษาอังกฤษ ยังไม่ต้องเขียน comment ก็ได้ แต่ยังอยากสนับสนุนให้ลองพยายามดู ผิดบ้างไม่เป็นไร เพราะเป็นการเขียนเอง อ่านเอง ถ้าตัวเองอ่านแล้วเข้าใจได้ ถือเป็นจุดเริ่มต้นที่ดี ค่อยคิดค่อยปรับปรุงไป วันหน้าต้องทำได้ดีแน่นอน