The words you are searching are inside this book. To get more targeted content, please make full-text search by clicking here.
Discover the best professional documents and content resources in AnyFlip Document Base.
Search
Published by Sompoi Wiangkosai, 2020-12-13 11:14:31

linuxbasic

linuxbasic

ยนู กิ ซข์ ั้นตน้

เทพพิทกั ษ์ การญุ บญุ ญานนั ท์

2

สารบญั

1 เร่ิมต้นกบั ยนู ิกซ์ 5

1.1 วิธีต่างๆ ทีจ่ ะป้อนคำส่ังยูนิกซ์ . . . . . . . . . . . . . . . . . . . . . . . . 6

1.2 คำสั่งเบอ้ื งตน้ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

1.2.1 เขียนข้อความออกจอภาพ . . . . . . . . . . . . . . . . . . . . 6

1.2.2 ดูวัน-เวลา . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

1.2.3 ดรู ายชอ่ื ไฟล์ . . . . . . . . . . . . . . . . . . . . . . . . . . 8

1.2.4 ดูเนือ้ หาไฟล์ . . . . . . . . . . . . . . . . . . . . . . . . . . 10

1.2.5 สำเนาไฟล์ . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

1.2.6 เปลย่ี นชื่อไฟล์ . . . . . . . . . . . . . . . . . . . . . . . . . 14

1.2.7 ลบไฟล์ . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

1.2.8 พมิ พไ์ ฟลอ์ อกเครอ่ื งพมิ พ์ . . . . . . . . . . . . . . . . . . . . 14

1.3 ไดเรกทอรี . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

1.3.1 ไดเรกทอรปี จั จบุ ัน . . . . . . . . . . . . . . . . . . . . . . . . 17

1.3.2 การเปลยี่ นไดเรกทอรี . . . . . . . . . . . . . . . . . . . . . . 17

1.3.3 “.” และ “..” . . . . . . . . . . . . . . . . . . . . . . . . 18

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

1.3.5 การสำเนาและยา้ ยไฟล์ขา้ มไดเรกทอรี . . . . . . . . . . . . . . . 20

1.3.6 การสำเนาไดเรกทอรี . . . . . . . . . . . . . . . . . . . . . . 20

1.3.7 การลบไดเรกทอรี . . . . . . . . . . . . . . . . . . . . . . . . 21

1.4 การตงั้ ชือ่ ไฟล์ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

1.5 wildcard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

3

4

2 ระบบรักษาความปลอดภัย 25

2.1 ผูใ้ ชแ้ ละกลุ่ม . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

2.2 การตง้ั รหัสผา่ น . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

2.3 สารบบผใู้ ช้ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

2.4 ใครเป็นใคร . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

2.4.1 ฉนั คือใคร . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

2.4.2 เหลือบแลเพอ่ื นบา้ น . . . . . . . . . . . . . . . . . . . . . . . 27

2.4.3 รจู้ ักเพอ่ื นบา้ น . . . . . . . . . . . . . . . . . . . . . . . . . 27

2.5 ผู้ดูแลระบบ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

2.6 แปลงร่าง . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

2.7 การปกป้องไฟล์ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

2.7.1 สทิ ธิการเข้าถงึ ไฟล์ . . . . . . . . . . . . . . . . . . . . . . . 30

2.7.2 สิทธกิ ารเข้าถงึ ไฟลแ์ บบพิเศษ . . . . . . . . . . . . . . . . . . 31

2.7.3 การกำหนดสิทธเิ ข้าถงึ ไฟล์ . . . . . . . . . . . . . . . . . . . . 32

2.7.4 การโอนเจ้าของไฟล์ . . . . . . . . . . . . . . . . . . . . . . . 34

3 เกยี่ วกบั ไฟล์และไดเรกทอรี 35

3.1 ชนิดของไฟลบ์ นยนู ิกซ์ . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

3.2 ระบบไฟลบ์ นยนู ิกซ์ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

3.3 i-node . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

3.4 การลงิ ก์ไฟล์ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

3.5 ตรวจสอบการใช้เน้อื ทีด่ ิสก์ . . . . . . . . . . . . . . . . . . . . . . . . . 41

4 เครอ่ื งมอื ประมวลผลไฟล์ 43

4.1 การเปลยี่ นทศิ ทางข้อมูล . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

4.2 เชื่อมคำสง่ั ดว้ ย pipe . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

4.3 ตัวกรอง . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

4.3.1 head . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

4.3.2 tail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

4.3.3 grep . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

4.3.4 wc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

4.3.5 sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

4.3.6 uniq . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

4.3.7 tee . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

4.3.8 cut และ paste . . . . . . . . . . . . . . . . . . . . . . . . . 57

4.3.9 comm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

4.4 สง่ ทา้ ย . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

บทที่

1

เร่มิ ต้นกับยนู กิ ซ์

ยนู ิกซเ์ ปน็ ระบบปฏิบัติการทมี่ ีประวัติยาวนาน ถอื ไดว้ า่ เปน็ ระบบท่ีมีอายกุ ารใช้งานนานทส่ี ุด และแพรห่ ลาย
ในเครื่องคอมพวิ เตอร์ประเภทต่างๆ มากท่สี ดุ เท่าที่มนษุ ย์เคยมมี า ไม่วา่ จะเป็นเคร่อื งในระดับมนิ ิคอมพิวเตอร์
ไปจนถึงอปุ กรณ์พกพา ยนู ิกซ์ถูกใช้งานในหอ้ งวจิ ยั ในสถาบันการศึกษา ในงานทางทหาร เป็นจุดกำเนิด
ของอินเทอร์เนต็ และของภาษา C ซง่ึ เปน็ ภาษาสำหรับเขียนโปรแกรมระบบท่ีแพร่หลายท่สี ุดในปัจจุบนั
รวมท้งั เปน็ ตน้ แบบสำหรับระบบปฏบิ ตั ิการอ่นื ๆ เช่น MS-DOS, MS-Windows, OS/2 ผ่านทางมาตรฐาน
POSIX อกี ดว้ ย

ยนู กิ ซเ์ องมกี ารแตกแขนงออกไปมากมาย โดยเรม่ิ จากที่ AT&T Bell Lab โดย เคน ทอมป์สนั (Ken
Thompson) ใน พ.ศ. 2512 ไปแตกหน่อและพัฒนาอยา่ งมโหฬารท่ีมหาวทิ ยาลัยแคลฟิ อร์เนียทเ่ี บอร์คลยี ์
เปน็ BSD Unix (ซ่งึ เป็นแบบฉบบั ของ FreeBSD, NetBSD, OpenBSD และยูนิกซเ์ ชิงพาณิชย์หลายตัว
ในปัจจุบนั ) โดยต่อมา AT&T กไ็ ด้ผนวกสว่ นขยายต่างๆ กลับเขา้ มาใน AT&T Unix System V เชน่ กนั
ผู้ผลติ ต่างๆ กไ็ ด้นำยนู ิกซ์ไปใช้กับผลิตภณั ฑ์ของตนมากมาย เช่น SunOS และ Solaris บนเครอื่ ง Sun
SPARC, Ultrix บน DEC PDP-11, HP-UX ของ HP, Aix ของ IBM, Xenix ของไมโครซอฟทใ์ นยคุ
หนง่ึ (ซึ่งต่อมากลายเป็น SCO Unix สำหรบั เครอื่ ง PC) ฯลฯ รวมทัง้ GNU/Linux หรือท่ีเราเรียกกัน
สนั้ ๆ ว่าลนิ กุ ซ์ที่เรากำลังพดู ถงึ ในเอกสารฉบับน้ี ก็นับได้ว่าเปน็ แขนงหนง่ึ ของระบบยนู ิกซ์เช่นกัน โดย
เป็นการเขยี นขึ้นมาใหม่ทัง้ หมดภายใต้เงื่อนไขของซอฟตแ์ วร์เสรี

การทย่ี ูนิกซ์ถกู ใช้งานกว้างขวางเชน่ น้ี ก็เปน็ เพราะยนู ิกซถ์ ูกออกแบบมาด้วยปรัชญาท่ีเรียบงา่ ย ชัดเจน
แต่ก็ยงั ยดื หยุ่นและมีประสทิ ธิภาพในการแก้ปัญหาที่ซับซอ้ น ทำให้มีวฒั นธรรมการใช้งานเป็นแบบฉบบั
ของตัวเอง ความคงทนอยูใ่ นวงการมากว่า 30 ปจี งึ ทำใหย้ ูนิกซ์น่าศึกษาแม้สำหรับผู้ทไี่ ม่ได้ใชย้ นู กิ ซ์ก็ตาม

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

5

6 บทที่ 1. เริ่มต้นกบั ยนู ิกซ์

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

1.1 วธิ ีต่างๆ ทจ่ี ะป้อนคำสงั่ ยูนิกซ์

การป้อนคำสั่งยูนกิ ซ์จะป้อนผ่านตัวแปลคำสงั่ ท่ีเรยี กว่า เชลล์ (shell) ซงึ่ การจะได้มาซึ่งเชลล์น้นั ก็มีอยู่
หลายวธิ ี เช่น

1. ลอ็ กอนิ ใน text console
2. เปิด terminal emulator ใน X Window
3. เช่ือมตอ่ ไปยงั เครอื่ งปลายทางดว้ ย telnet, rlogin หรอื ssh
4. เรยี กเชลล์ซอ้ นเชลล์
5. ใช้ shell escape จากโปรแกรมบางโปรแกรม เช่น vi
ในท่ีนขี้ อใหใ้ ชส้ องวิธแี รกก่อน สว่ นวธิ ีอ่ืนๆ ท่ีเหลือน้นั เราจะไดพ้ บต่อไป

1.2 คำส่ังเบือ้ งต้น

1.2.1 เขยี นขอ้ ความออกจอภาพ

เรามาเริ่มจากคำสง่ั ที่ทำให้เครื่องโต้ตอบอะไรกับคณุ ได้ก่อนก็แลว้ กัน คุณสามารถสงั่ แสดงข้อความใดๆ
ออกทางจอภาพไดด้ ้วยคำส่งั echo

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

thep@anubis:~$ echo hello
hello
thep@anubis:~$ echo how are you
how are you
thep@anubis:~$ echo "how are you"
how are you

คำสง่ั echo จะแสดงขอ้ ความท่ีเป็นอาร์กวิ เมนต์ (argument คอื ค่าที่ส่งให้กบั คำสั่งใดๆ) ท้งั หมด
โดยคน่ั ระหว่างอาร์กิวเมนต์แตล่ ะตัวด้วยช่องวา่ งหนง่ึ ช่อง สังเกตว่า ในคำสง่ั แรก เราส่งอาร์กวิ เมนต์ให้
กับ echo เพยี งคา่ เดียว คำสงั่ ถดั มาสง่ ให้สามคา่ คือ how, are และ you การเว้นช่องวา่ งระหว่าง
how และ are จงึ ไม่มีผลใดๆ ในขณะที่คำส่ังสดุ ท้าย เราใช้เครื่องหมายคำพูดครอบขอ้ ความทั้งหมด ทำ
ให้อาร์กวิ เมนต์เหลือเพียงค่าเดยี ว

คำส่งั echo – แสดงขอ้ ความ

รูปแบบ echo [STRING] . . .

คำบรรยาย แสดง STRING ออกทางเอาทพ์ ุตมาตรฐาน คัน่ ระหวา่ ง STRING แต่ละตวั ด้วยช่องวา่ ง
หน่ึงชอ่ ง

1.2. คำสงั่ เบอ้ื งต้น 7

เมือ่ เขยี นจอภาพแล้ว คณุ ก็อาจจะอยากลบทง้ิ คำส่งั สำหรบั ลบจอภาพในยนู ิกซ์ได้แกค่ ำสง่ั clear
ซง่ึ จะพจิ ารณาประเภทของจอท่ีคุณใช้ (เชน่ เปน็ xterm, Linux console หรอื VT100 ฯลฯ) และหาวิธี
ลบจอใหโ้ ดยอตั โนมตั ิ

คำสงั่ clear – ลบจอภาพ
รูปแบบ clear
คำบรรยาย ลบจอภาพตามประเภทของเทอรม์ นิ ัลท่ใี ช้

1.2.2 ดูวัน-เวลา

นกั คอมพิวเตอรห์ ลายคนไมเ่ คยใช้นาฬกิ าข้อมือเลย เพราะอาศัยดูเวลาจากเครอ่ื งเอา ถึงคณุ มนี าฬกิ า คุณ
ก็สามารถตรวจสอบนาฬกิ าของเครอ่ื งวา่ เดินตรงหรือไมด่ ้วยคำสั่ง date

thep@anubis:~$ date
Sat Jul 5 16:31:45 ICT 2003

อย่าแปลกใจถา้ คุณเห็นปฏทิ ินบนเครอ่ื งของคุณเป็นภาษาไทย ไม่เหมือนกับตวั อยา่ งขา้ งบน น่นั
แสดงวา่ คณุ ได้ใชร้ ะบบทป่ี รบั แต่งใหเ้ ป็นไทยแลว้

คำส่งั date – แสดงวนั ทแี่ ละเวลาของระบบ
รปู แบบ date
คำบรรยาย แสดงวันท่ีและเวลาของระบบ

นอกจากแสดงวัน-เวลาปัจจบุ ันแลว้ คุณอาจดูปฏทิ ินของเดอื นปัจจบุ นั ได้ด้วยคำสง่ั cal

thep@anubis:~$ cal
July 2003

Su Mo Tu We Th Fr Sa
12345

6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

หรือลองดปู ฏทิ นิ ของเดอื นอืน่

thep@anubis:~$ cal 2 2000
February 2000

8 บทที่ 1. เร่มิ ต้นกบั ยูนิกซ์

Su Mo Tu We Th Fr Sa
12345

6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29

ลองพิมพ์ cal 2003 ท่เี ครอ่ื งของคณุ ดสู วิ า่ จะเกิดอะไรขึ้น

คำส่งั cal – แสดงปฏิทิน

รปู แบบ cal [[month] year]

คำบรรยาย แสดงปฏิทนิ ของเดือนและปีท่ีกำหนด หากไม่กำหนดอะไรเลยจะแสดงปฏิทินของเดอื น
ปัจจบุ ัน และหากระบแุ ตป่ ีไมร่ ะบุเดอื น จะแสดงปฏิทนิ ของท้งั ปี

1.2.3 ดรู ายชือ่ ไฟล์

เราจะเริ่มสำรวจฮารด์ ดิสกก์ ันดว้ ยคำสง่ั ขอดรู ายช่อื ไฟล์ ไดแ้ กค่ ำสั่ง ls

thep@anubis:~$ ls
a.out Download hello.c Mail Projects tmp

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

thep@anubis:~$ ls -F
a.out* Download/ hello.c Mail/ Projects/ tmp/

จะเห็นว่า มีการเพิ่มเครอื่ งหมายพเิ ศษต่อทา้ ยชอ่ื ไฟล์เพื่อบอกชนิด กล่าวคอื
/ หมายถงึ ไดเรกทอรี
* หมายถึงไฟล์โปรแกรม
@ หมายถึง symbolic link
= หมายถงึ socket
| หมายถึง named pipe (FIFO)
โดยถา้ ไม่มีเคร่อื งหมายพเิ ศษ จะหมายถึงไฟล์ข้อมลู ปกติ ชนดิ ตา่ งๆ ของไฟล์ จะกลา่ วในรายละเอยี ดใน
บทท่ี 3
แต่ไฟล์ตา่ งๆ ก็ยังมีรายละเอียดมากกวา่ ชนดิ ของไฟล์ เช่น ขนาด เวลาปรบั ปรงุ ครั้งสดุ ท้าย ฯลฯ ซง่ึ
คณุ สามารถขอดรู ายละเอยี ดทั้งหมดได้ดว้ ยตวั เลอื ก -l

1.2. คำสั่งเบ้ืองตน้ 9

thep@anubis:~$ ls -l users 4815 2002-08-23 14:49 a.out
total 28 users 4096 2002-08-23 14:48 Download
-rwxr-xr-x 1 thep users
drwxr-xr-x 2 thep users 77 2002-08-23 14:49 hello.c
-rw-r--r-- 1 thep users 4096 2002-08-23 14:48 Mail
drwxr-xr-x 2 thep users 4096 2002-08-23 14:48 Projects
drwxr-xr-x 2 thep 4096 2002-08-23 14:48 tmp
drwxr-xr-x 2 thep

บรรทัดแรก (total 28) จะแสดงจำนวนบลอ็ กทง้ั หมดของไฟล์ในไดเรกทอรีนั้น โดยบล็อกหนึ่ง
โดยปกติจะมีขนาด 1024 ไบต์ ท้ังน้ี สำหรบั ไฟล์ท่เี ปน็ ไดเรกทอรยี ่อย (เชน่ Download) จะไมร่ วมขนาด
ของไฟล์ต่างๆ ทอ่ี ยู่ใต้ไดเรกทอรียอ่ ยนัน้ แต่จะนับเพียงขนาดของตวั ไดเรกทอรียอ่ ย (ท่ีเก็บชอื่ ไฟล์ตา่ งๆ)
เท่าน้นั

จากนน้ั ก็เปน็ รายละเอียดของแตล่ ะไฟล์ในไดเรกทอรี โดยแต่ละรายการจะแบง่ เปน็ สว่ นตา่ งๆ (จาก
ซา้ ยไปขวา) ดงั นี้

1. permission
2. จำนวนลงิ ก์ (ดูหัวขอ้ 3.3)
3. ผู้ใชท้ ี่เปน็ เจา้ ของไฟล์
4. กลุ่มท่ีเปน็ เจ้าของไฟล์
5. ขนาดของไฟล์
6. วนั -เวลาทีแ่ ก้ไขครงั้ สดุ ท้าย
7. ชื่อไฟล์
permission แสดงสทิ ธิที่อนญุ าตให้ผู้ใช้แต่ละคนเข้าถึงไฟล์ได้ ส่วนน้ีจะประกอบด้วยตัวอกั ษร 10
ตัว โดยแบ่งออกเป็น 4 ส่วน สว่ นแรกเป็นชนดิ ของไฟล์ แสดงดว้ ยตัวอกั ษรตัวแรกตัวเดียว ส่วนอีก 3
สว่ นถัดไป แสดงด้วยตวั อักษรสว่ นละ 3 ตัว เปน็ สทิ ธิของผูใ้ ช้ที่เป็นเจ้าของไฟล์ สทิ ธิของผูใ้ ช้ในกลมุ่
เดยี วกับเจา้ ของไฟล์ และสทิ ธิของผูใ้ ชอ้ ่นื ๆ ตามลำดบั
ชนิดของไฟล์ ไดแ้ ก่
- หมายถงึ ไฟล์ปกติ
d หมายถงึ ไดเรกทอรี
l หมายถึง symbolic link
s หมายถึง socket
c หมายถงึ character device
b หมายถึง block device
p หมายถึง named pipe (FIFO)
ชนิดตา่ งๆ ของไฟล์ จะกลา่ วในรายละเอียดในบทที่ 3
สว่ นสิทธิของผู้ใช้ที่แสดงดว้ ยอกั ษรสามตัวน้นั ตวั แรกจะหมายถงึ สทิ ธิในการอ่าน (r) ตัวถดั มา
หมายถงึ สทิ ธิในการเขียน (w) ตัวสดุ ทา้ ยหมายถึงสทิ ธิในการ execute (x) ซ่ึงหากในตำแหนง่ น้ันๆ เป็น
เครือ่ งหมายลบ (-) จะหมายถึงไม่อนญุ าต หากอนุญาตก็จะแสดงค่า r, w หรือ x ตามลำดบั โดยใน
ส่วนของสทิ ธิการ execute นนั้ ในบางกรณีอาจใช้อกั ษรอ่นื ไดแ้ ก่ s, t, S, T ซ่งึ จะมีความหมาย
พเิ ศษ ดงั จะได้กล่าวถงึ ในหัวขอ้ 2.7.2
permission ของไฟลน์ ี้ สามารถเปลี่ยนไดด้ ว้ ยคำสง่ั chmod ดงั จะกล่าวถงึ ในหวั ข้อ 2.7.3

10 บทที่ 1. เริม่ ต้นกับยนู กิ ซ์

เราได้เหน็ การใช้คำสง่ั ls ในการแสดงรายช่อื ไฟล์ไปแล้ว แต่ที่ผ่านมา ยงั มีไฟล์อกี สว่ นหนง่ึ ที่ถูก
ซ่อนไว้ไม่ได้แสดงออกมา ไฟล์ที่ถกู ซอ่ นเหลา่ นี้จะมีชื่อขึน้ ตน้ ด้วย “.” คุณสามารถดูรายชอ่ื ไฟล์เหล่านั้น
ได้โดยใช้ตัวเลอื ก -a

thep@anubis:~$ ls -a

. .alias .bash_profile .cshrc hello.c Projects

.. a.out .bashrc Download Mail tmp

นอกจากนี้ คำสั่ง ls ยังสามารถตง้ั ตัวเลอื กในการแสดงผลไดอ้ ีกหลายแบบ ดงั แสดงในสรปุ คำสง่ั

คำสัง่ ls – ดูรายชื่อไฟล์

รูปแบบ ls [ตวั เลือก] [path]

คำบรรยาย แสดงรายช่อื ไฟล์ใน path ทก่ี ำหนด โดยถา้ ไม่ระบุ path จะหมายถึงไดเรกทอรปี จั จบุ ัน

ตัวเลือก -1 แสดงหน่งึ รายการต่อบรรทัด (สำหรับสง่ ต่อใหโ้ ปรแกรมอนื่ )
-a แสดงทุกไฟล์รวมท้งั ไฟล์ท่ีซ่อนอยดู่ ว้ ย
-F แสดงปา้ ยบอกชนดิ ของไฟลอ์ ย่างย่อต่อทา้ ยช่อื
-i แสดงหมายเลข i-node ของแต่ละไฟล์
-l แสดงรายละเอียดของไฟล์อยา่ งยาว
-S เรยี งลำดับตามขนาดของไฟล์
-t เรียงไฟล์ใหม่ขนึ้ มากอ่ น

1.2.4 ดูเนือ้ หาไฟล์

คำสงั่ สำหรบั ดูเน้ือหาไฟล์ของยูนิกซ์ออกจะช่อื แปลกสกั หน่อย คือคำสงั่ cat เชน่ เมือ่ คุณจะส่งั แสดง
เนื้อหาของไฟล์ /etc/hostname (ซึ่งเกบ็ ชอ่ื เคร่ืองของคณุ ) ออกทางจอภาพ:

thep@anubis:~$ cat /etc/hostname
anubis

ความจรงิ แลว้ คำสั่ง cat มาจากคำวา่ catenate คอื การต่อไฟล์เข้าด้วยกัน แลว้ แสดงออกทาง
standard output ตวั อยา่ งเชน่ เม่ือมีไฟล์ a และ b คุณสามารถตอ่ ไฟล์ทั้งสองเขา้ ด้วยกนั ออกทางจอภาพ
ได้:

thep@anubis:~$ cat a
hello
thep@anubis:~$ cat b
bye
thep@anubis:~$ cat a b
hello
bye

1.2. คำส่งั เบอ้ื งต้น 11

ดังน้ัน คุณจะเหน็ วา่ การแสดงเนือ้ หาไฟล์หนึ่งไฟล์ออกทางจอภาพ จึงเปน็ เพียงกรณีพเิ ศษของการ
ต่อไฟลเ์ ทา่ น้ันเอง คำสั่ง cat สามารถจะต่อไฟลก์ ี่ไฟล์เขา้ ดว้ ยกันกไ็ ด้ และถา้ คณุ เรียกคำสัง่ cat โดยไม่
ระบไุ ฟลใ์ ดๆ เลย cat จะหมายถึง standard input (ได้แกแ่ ป้นพมิ พ์ ถา้ ไมม่ กี ารเปล่ยี นใหเ้ ปน็ อยา่ งอ่ืน)

thep@anubis:~$ cat
hello
hello
bye
£bye  
¢Ctrl-d ¡
thep@anubis:~$

คณุ จะเห็นแมวตวั นี้พูดลอ้ เลียนคุณไปตลอดบรรทัดตอ่ บรรทัด เพราะมนั พยายามตอ่ ไฟลท์ ่ีมีเพยี ง
ไ£ฟล์เดยี ว ค อื แปน้ พิมพ์ แล้วแสดงผลลัพธ์ออกทาง standard output ซึง่ ได้แก่จอภาพ จนกวา่ คณุ จะกด
¢Ctrl-d ¡ซงึ่ ยูนิกซ์กำหนดใหห้ มายถงึ end-of-file

การปลอ่ ยให้แมวล้อเลียนอย่างน้ี ก็ใช่จะไร้สาระเสยี ทีเดยี ว เพราะถ้าคุณเปลย่ี นทิศทาง standard
output จากจอภาพเป็นไฟล์แลว้ ละ่ ก็ มนั ก็คอื วิธีสร้างไฟล์ขอ้ ความอย่างงา่ ยน่นั เอง (เราจะกล่าวถงึ การ
เปล่ียนทศิ ทางข้อมลู อีกครงั้ ในหวั ขอ้ 4.1):

thep@anubis:~$ cat > d
hello
anybody here?
b£ ye  
¢Ctrl-d ¡
thep@anubis:~$ cat d
hello
anybody here?
bye

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

คำสั่ง cat – ตอ่ ไฟลแ์ ล้วแสดงออกทาง standard output

รูปแบบ cat [file . . . ]

คำบรรยาย ตอ่ ไฟลท์ ก่ี ำหนดตามลำดับ (หากไมร่ ะบไุ ฟล์ใดๆ จะหมายถึง standard input) แล้วแสดง
ผลออกทาง standard output

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

12 บทที่ 1. เริม่ ตน้ กับยูนิกซ์

คำสง่ั more จะแสดงเนื้อหาไฟล์ทีละหน้า โดยจะแสดงคำว่า “--More--” ที่ท้ายหน้าเพื่อบอกวา่
“มตี ่อ” คณุ สามารถควบคุมการแสดงผลได้ดว้ ยป่มุ ตา่ งๆ ดังนี้

£ 

¢§Enter ¤¡ เลอื่ นหนา้ จอไป 1 บรรทดั

¦£Sp ace ¥£ เล่ือนหนา้ จอไป 1 หนา้

 

¢£/ ¡ text¢Enter ¡คน้ หา text
¢£n  ¡ ค้นหาต่อ
¢q ¡ ออกจากโปรแกรม

£ 

more จะออกจากโปรแกรมทนั ทที ่ีแสดงผลมาถงึ ท้ายไฟล์ หรอื เมอื่ คุณกด ¢q ¡
การเรียกคำส่งั more สามารถเรียกโดยใส่ช่อื ไฟล์ที่ต้องการดู โดยใสไ่ ดม้ ากกว่า 1 ไฟล์ ซง่ึ ถา้ ระบมุ าก
กว่า 1 ไฟล์ กจ็ ะแสดงชื่อไฟล์ที่ต้นขอ้ ความใหด้ ้วย และถ้าไมร่ ะบุชื่อไฟล์ จะหมายถงึ standard input คลา้ ย
cat ยกเวน้ วา่ more จะไม่สามารถทำงานกับ standard input ที่เป็นแปน้ พิมพ์ได้ (เพราะแปน้ พมิ พ์เอา
ไว้ใช้รับคำสงั่ เลือ่ นจอไปแลว้ ) จงึ มักใช้ more ท่ีไม่ระบุชือ่ ไฟล์ในกรณีที่รบั ข้อมลู ต่อจากคำสง่ั อน่ื เทา่ นน้ั
เชน่ ในการดูผลที่พน่ ออกมาจากคำส่งั อ่ืนผา่ น pipe (เราจะกล่าวถึงการใช้ pipe โดยละเอยี ดในบทท่ี 4)

thep@anubis:~$ ls -l /bin | more

total 2872

-rwxr-xr-x 1 root root 47464 2002-08-04 03:15 afio

-rwxr-xr-x 1 root root 2724 2002-01-27 14:05 arch

-rwxr-xr-x 1 root root 579816 2002-09-12 05:51 bash

-rwxr-xr-x 1 root root 13864 2002-08-04 16:10 cat

-rwxr-xr-x 1 root root 16232 2002-09-01 20:39 chgrp

-rwxr-xr-x 1 root root 16008 2002-09-01 20:39 chmod

-rwxr-xr-x 1 root root 18120 2002-09-01 20:39 chown

-rwxr-xr-x 1 root root 42664 2002-09-01 20:39 cp

-rwxr-xr-x 1 root root 47656 2002-06-23 03:09 cpio

-rwxr-xr-x 1 root root 82248 2002-09-14 19:32 dash

-rwxr-xr-x 1 root root 34408 2002-09-01 20:40 date

-rwxr-xr-x 1 root root 28808 2002-09-01 20:39 dd

-rwxr-xr-x 1 root root 26184 2002-09-01 20:39 df

-rwxr-xr-x 1 root root 59496 2002-09-01 20:39 dir

-rwxr-xr-x 1 root root 4076 2002-01-27 14:05 dmesg

-rwxr-xr-x 1 root root 11080 2002-09-01 20:40 echo

-rwxr-xr-x 1 root root 43292 2000-11-27 09:05 ed

--More--

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

1.2. คำสั่งเบ้อื งต้น 13

£ 

¢§Enter ¤¡ เลื่อนหนา้ จอลง 1 บรรทดั

£¦Sp ace ¥ เลอ่ื นหน้าจอลง 1 หนา้

¢£j  ¡ เล่อื นหน้าจอลง 1 บรรทัด

¢£k  ¡ เลอ่ื นหน้าจอข้ึน 1 บรรทัด

£¢f  ¡ เลื่อนหน้าจอลง 1 หนา้

£¢b  ¡ เลอื่ นหนา้ จอข้นึ 1 หนา้
¢£g  ¡ ไปทตี่ น้ ไฟล์

¢£G  ¡ ไปที่ทา้ ยไฟล์
£¢m  ¡letter mark ตำแหน่งปจั จุบนั ด้วย letter

¢£’  ¡lett£er  ไปทต่ี ำแหนง่ ที่ mark ไว้

¢£/  ¡text¢£Enter  ¡ค้นหา text

¢£?  ¡text¢Enter ¡คน้ หา text ยอ้ นหลัง
¢£n  ¡ ค้นหาต่อในทิศทางเดิม

£¢N  ¡ คน้ หาต่อในทิศทางตรงข้าม
¢q ¡ ออกจากโปรแกรม

1.2.5 สำเนาไฟล์

บนยูนิกซ์ คุณสามารถทำสำเนาไฟล์ไดด้ ว้ ยคำสั่ง cp (copy)

thep@anubis:~$ ls
a
thep@anubis:~$ cat a
hello
thep@anubis:~$ cp a b
thep@anubis:~$ ls
ab
thep@anubis:~$ cat b
hello

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

thep@anubis:~$ ls
ab
thep@anubis:~$ cp -i a b
cp: overwrite ‘b’? y

แต่ถา้ จะบงั คบั ให้เขยี นทบั ไฟล์ทีม่ อี ย่แู ลว้ เสมอ ก็ใชต้ วั เลือก -f

14 บทท่ี 1. เรม่ิ ตน้ กับยนู กิ ซ์

นอกจากสำเนาไฟล์แลว้ cp ยังสามารถใช้สำเนาไดเรกทอรีทั้งชดุ ได้ด้วย โดยใช้ตัวเลือก -r ดงั จะ
กล่าวต่อไปในหวั ขอ้ ท่ี 1.3

1.2.6 เปลยี่ นชอื่ ไฟล์

อกี คร้งั หนึง่ ท่ีเราจะพบคำสง่ั ยูนกิ ซท์ อ่ี อกแบบมาในรูปทวั่ ไป คำส่งั ที่ใชเ้ ปล่ยี นชอ่ื ไฟล์ในยูนกิ ซ์ ไดแ้ กค่ ำสง่ั
mv (move)

ความจรงิ แลว้ คำส่งั mv มีหนา้ ที่ในการเคล่อื นยา้ ยไฟล์จากที่หน่ึงไปยงั อกี ที่หนึ่ง โดยสามารถตัง้ ชอ่ื
ใหมไ่ ด้ เช่น คำส่งั ต่อไปนีเ้ ปน็ การย้ายไฟล์ a ไปไวท้ ี่ /tmp ภายใตช้ ่อื ใหมค่ อื b

thep@anubis:~$ mv a /tmp/b

ดังนัน้ การย้ายไฟลม์ าไวใ้ นไดเรกทอรเี ดมิ ในช่ือใหม่ ก็คอื การเปลยี่ นชอื่ ไฟลน์ ั่นเอง

thep@anubis:~$ mv a b

1.2.7 ลบไฟล์

คำสั่งสำหรับลบไฟล์บนยูนกิ ซไ์ ด้แกค่ ำสงั่ rm

thep@anubis:~$ rm a b

เป็นการลบไฟล์ a และ b

1.2.8 พมิ พไ์ ฟลอ์ อกเครอ่ื งพมิ พ์

เน่ืองจากระบบยนู กิ ซเ์ ป็นระบบ multi-user จึงสนบั สนนุ การพิมพผ์ ่าน print queue ผูใ้ ชแ้ ตล่ ะคนสามารถ
สง่ งานไปเข้าคิวเพอ่ื รอส่งออกทางเคร่อื งพิมพไ์ ด้ดว้ ยคำส่งั lpr เมือ่ สง่ ไปแล้ว ถา้ คิวว่างอยู่ กจ็ ะถูกสง่ ไป
ยังเครอ่ื งพิมพ์ทันที แตถ่ า้ ระบบกำลังพมิ พง์ านชนิ้ อื่นอยู่ กต็ ้องรอในควิ ไปกอ่ น

ตัวอยา่ งเชน่ ถา้ จะพมิ พไ์ ฟล์ output.ps ออกทางเครื่องพมิ พ์ ก็ใช้คำสง่ั

thep@anubis:~$ lpr output.ps

ในบางกรณี ระบบของคุณอาจมีเครอื่ งพิมพ์มากกว่าหนึง่ ตัว ซ่ึงตรวจดูได้ทไ่ี ฟล์ /etc/printcap

thep@anubis:~$ cat /etc/printcap
# Entry edited Tue Jun 10 15:28:13 2003 by foomatic-configure.
# Additional configuration atop /etc/foomatic/lpd/c82-foo.ppd
c82-foo||Epson Stylus C82|:\

:filter_options= --lprng $J $Z /etc/foomatic/lpd/c82-foo.ppd:\
:lf=/var/log/lp-errs:\

1.2. คำสง่ั เบื้องตน้ 15

:ppdfile=/etc/foomatic/lpd/c82-foo.ppd:\
:sd=/var/spool/lpd/c82-foo:\
:lp=/dev/lp0:\
:if=/usr/bin/foomatic-rip:\
:sh:\
:force_localhost:\
:mx#0:

c82:\
:NUP=1:\
:PRINTER_TYPE=LOCAL:\
:RTLFTMAR=18:\
:TOPBOTMAR=18:\
:ASCII_TO_PS=YES:\
:TEXT_SEND_EOF=NO:\
:lp=/dev/lp0:\
:RESOLUTION=1440x720:\
:GSDEVICE=uniprint:\
:DESIRED_TO=ps:\
:PAPERSIZE=a4:\
:lf=/var/log/lp-errs:\
:sd=/var/spool/lpd/c82:\
:PS_SEND_EOF=NO:\
:sh:\
:force_localhost:\
:mx#0:

:

ซ่ึงในท่ีนมี้ ี print queue สองควิ คือ c82-foo และ c82 หากต้องการเจาะจงใหอ้ อกยังคิวทีต่ อ้ งการ ก็
สามารถระบไุ ดด้ ้วยตวั เลอื ก -P queue เชน่

thep@anubis:~$ lpr -P c82-foo output.ps

การพิมพ์โดยไมร่ ะบุชื่อคิว จะพิมพ์ออกทางเคร่ืองพิมพท์ ี่ผูด้ แู ลระบบต้ังไวใ้ หเ้ ป็นคิวปริยาย
การตรวจสอบ print queue วา่ มีงานพมิ พ์อะไรรออยู่บา้ ง ใช้คำสง่ั lpq

thep@anubis:~$ lpq -P c82-foo
Printer: c82-foo@localhost ’Epson Stylus C82’

Queue: 1 printable job
Server: pid 2257 active
Unspooler: pid 2258 active
Status: processing ’dfA256localhost’, size 674097, format ’f’,

16 บทท่ี 1. เริ่มตน้ กบั ยูนิกซ์

IF filter ’master-filter’ at 11:32:58.948

Rank Owner/ID Class Job Files Size Time

active thep@localhost+256 A 256 output.ps 674097 11:32:58

จะเหน็ ว่า มี active job อยหู่ นึ่งงาน หมายเลข job คือ 256 ไฟลท์ ่พี มิ พค์ ือ output.ps ขนาด 674,097
ไบต์ สั่งพิมพ์เมอ่ื เวลา 11.32 น.

หากทงิ้ ไว้นานแลว้ เห็นว่ายังไม่ออกที่เคร่อื งพมิ พ์ อาจมีอะไรขัดขอ้ งบางอย่าง หรอื ต้องการจะเลิก
พมิ พ์กลางคนั คณุ กส็ ามารถยกเลกิ ไดด้ ว้ ยคำสั่ง lprm โดยระบหุ มายเลข job ท่ตี ้องการ

thep@anubis:~$ lprm -P c82-foo 256
Printer: c82-foo@localhost ’Epson Stylus C82’

checking perms ’thep@localhost+256’
dequeued ’thep@localhost+256’
thep@anubis:~$ lpq -P c82-foo
Printer: c82-foo@localhost ’Epson Stylus C82’
Queue: no printable jobs in queue
Status: job ’thep@localhost+256’ saved at 11:45:13.299

คำสัง่ lprm -a จะยกเลกิ งานทกุ งานในคิวที่เปน็ ของคุณ คุณจะไม่มีสทิ ธยิ กเลิกงานพมิ พ์ของผู้ใช้
อนื่ นอกเสยี จากคณุ จะเป็นผูด้ แู ลระบบ

เช่นเดยี วกับคำสง่ั lpr คำส่ัง lpq และ lprm จะระบุคิวดว้ ยตวั เลอื ก -P หรอื ไม่กไ็ ด้ โดยถ้าไม่
ระบุ จะหมายถงึ คิวปริยายทผ่ี ้ดู ูแลระบบตง้ั ไว้ (ปกตกิ ค็ ือควิ แรกใน /etc/printcap นนั่ เอง) หรอื ถ้า
คุณตอ้ งการตง้ั คา่ เครอื่ งพิมพ์ปกติของคุณเอง กส็ ามารถทำไดโ้ ดยเซ็ตตวั แปรระบบชอ่ื PRINTER

thep@anubis:~$ export PRINTER=c82
thep@anubis:~$ lpq
Printer: c82@localhost

Queue: no printable jobs in queue
Status: finished ’thep@localhost+870’, status ’JFAIL’ at 20:09:25.185

สังเกตที่บรรทดั Printer: ว่าไดเ้ ปลีย่ นเปน็ c82 โดยไม่ต้องใช้ตัวเลือก -P

1.3 ไดเรกทอรี

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

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

1ใน MS-DOS จะใช้คำว่าไดเรกทอรีเช่นเดียวกบั ยนู กิ ซ์ ในขณะท่ี MS Windows จะเร่ิมใช้คำวา่ โฟลเดอร์ (folder) ซ่ึง
หมายความถึงส่ิงเดยี วกัน

1.3. ไดเรกทอรี 17

thep@anubis:~$ ls -F /

bin/ etc/ lib/ root/ vmlinuz@
sbin/ vmlinuz.old@
boot/ floppy/ lost+found/ tmp/
usr/
cdrom/ home/ mnt/ var/

cdrom0/ initrd/ opt/

dev/ initrd.img@ proc/

จะเห็นว่า ไดเรกทอรีรากยังมี ไดเรกทอรีย่อย (subdirectory) อยู่ในนนั้ อีกจำนวนหน่งึ เมอื่ จะอา้ ง
ถงึ ไดเรกทอรีย่อยนบั จากรากก็อ้างได้ดว้ ยชื่อไดเรกทอรีย่อยหลัง slash และเมอื่ อา้ งถึงไฟล์หรือไดเรกทอ
รยี อ่ ยลงไปอีก ก็ค่ันแตล่ ะชั้นด้วย slash จนถึงชอื่ ไฟลห์ รือไดเรกทอรียอ่ ยทต่ี ้องการ2

thep@anubis:~$ ls -F /usr/local sbin/ share/ src/
bin/ games/ include/ lib/ man/
thep@anubis:~$ cat /etc/hostname
anubis

1.3.1 ไดเรกทอรปี ัจจบุ ัน

เมื่อคณุ อยู่ในเชลล์ของยูนิกซ์ คุณจะ “อย”ู่ ที่ไดเรกทอรใี ดไดเรกทอรหี นึ่งเสมอ โดยท่ีเมอ่ื คณุ อ้างชือ่ ไฟล์
ลอยๆ โดยไมไ่ ดร้ ะบุตำแหนง่ แหง่ ท่ี มนั จะหมายถึงไฟล์ใน ไดเรกทอรปี จั จบุ ัน (current directory)

คณุ สามารถขอดูค่าของไดเรกทอรปี ัจจบุ ันได้ด้วยคำสง่ั pwd (print working directory)

thep@anubis:~$ pwd
/home/thep

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

คุณสามารถเปล่ยี นไดเรกทอรปี ัจจุบันไปท่ีอนื่ ไดด้ ้วยคำส่งั cd (change directory)

thep@anubis:~$ cd /usr

thep@anubis:/usr$ pwd

/usr

thep@anubis:/usr$ ls -F

bin/ include/ local/ sbin/ X11R6/
share/
doc/ info@ m68k-palmos/ src/

games/ lib/ openwin/

thep@anubis:/usr$ cd local

2ใน MS-DOS และ MS Windows จะใช้ backslash แทน slash เพราะได้กำหนดใหใ้ ช้ slash ในการระบตุ ัวเลอื กในบรรทัด
คำส่งั ไปแล้ว เช่น dir /w เป็นตน้

18 บทที่ 1. เรม่ิ ตน้ กบั ยูนิกซ์

thep@anubis:/usr/local$ pwd
/usr/local

จะเหน็ วา่ คุณสามารถอา้ งไดเรกทอรีในแบบสัมบูรณ์ (absolute) เช่น /usr หรือในแบบสมั พทั ธ์ (rela-
tive) กับไดเรกทอรีปัจจบุ นั เช่น local กไ็ ด้

นอกจากน้ี การสง่ั cd โดยไมร่ ะบุอาร์กวิ เมนต์จะหมายถึงการเปลีย่ นไดเรกทอรกี ลับไปที่ ไดเรกทอรี
บา้ น (home directory) ของคณุ ซึง่ ไดเรกทอรีบา้ นน้ี ผ้ใู ช้แตล่ ะคนจะมีเป็นของตวั เอง กำหนดให้โดยผ้ดู ู
แลระบบ

การเปลีย่ นไดเรกทอรีดว้ ย cd จะเปล่ยี นไดเรกทอรีปจั จบุ ันไป ณ ตำแหน่งใหม่ แต่เมือ่ คุณใช้ยนู กิ ซ์
ไปสักพกั คณุ จะเริ่มพบว่ามีหลายคร้ังที่คุณแค่อยากเปล่ยี นไดเรกทอรีไปทำงานท่ีอนื่ เพยี งช่วั คราวแลว้
กลบั มาทำงานตอ่ ท่ีเดมิ ถา้ ใช้คำสง่ั cd คณุ ก็จำ (หรือจด) ไดเรกทอรีปจั จบุ นั ไว้ก่อนเปลยี่ นไปท่ีใหม่
จากนัน้ ก็ค่อยเปลีย่ นกลับมาทเี่ ดิมท่จี ำ (หรอื จด) ไว้ หรือไม่ก็ใช้ชุดคำสัง่ pushd และ popd

pushd และ popd จะทำงานเป็นสแต็ก (stack–กองซอ้ นที่วางทบั ๆ กนั โดยเวลาหยบิ ชิ้นบนสดุ
ท่ีวางหลังสดุ จะถกู หยบิ กอ่ น) โดย pushd จะเก็บค่าไดเรกทอรีปัจจบุ นั ใส่สแต็กไว้ ก่อนจะเปล่ยี นไดเรก
ทอรีไป และคำส่ัง popd จะหยบิ คา่ ในสแต็กล่าสดุ ข้ึนมาแลว้ เปลี่ยนไดเรกทอรีไป

thep@anubis:~$ pushd /usr/local
/usr/local ~
thep@anubis:/usr/local$ popd
~
thep@anubis:~$

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

คณุ สามารถขอดูคา่ สแต็กของไดเรกทอรีนี้ไดท้ ุกเวลาด้วยคำส่ัง dirs

thep@anubis:~$ pushd /usr/local
/usr/local ~
thep@anubis:~$ dirs
/usr/local ~
thep@anubis:/usr/local$ popd
~
thep@anubis:~$ dirs
~
thep@anubis:~$

1.3.3 “.” และ “..”

ในแตล่ ะไดเรกทอรี จะมีการอ้างองิ ไปยงั ไดเรกทอรีปัจจุบนั และไดเรกทอรีเบ้ืองบนภายใต้ช่อื “.” และ
“..” ตามลำดบั ซึ่งทำให้คณุ สามารถอา้ งไดเรกทอรแี บบสัมพัทธไ์ ดย้ ดื หยุน่ ย่งิ ข้นึ

1.3. ไดเรกทอรี 19

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

thep@anubis:~$ cd /usr/local

thep@anubis:/usr/local$ ls ..

bin games info local openwin share X11R6

doc include lib m68k-palmos sbin src

thep@anubis:/usr/local$ ls ../games

3Dc gnome-stones mahjongg xdemineur

banner gnometris nethack xdigger

cgoban gnomine nethack-gnome xgal

cmail gnuchess pxboard xgalaga

debugboard gnuchessx same-gnome xtet42

gnibbles gnugo sol zic2xpm

gnobots2 grab_cgoban tint

gnome-freecell iagno xboard

thep@anubis:/usr/local$ cd ..

thep@anubis:/usr$ pwd

/usr

ส่วน “.” น้ันจะอ้างอิงถงึ ไดเรกทอรีปัจจบุ นั ซงึ่ ดูเผินๆ อาจจะดไู ม่มีประโยชน์อะไรนัก เพราะการ
อา้ งถึง “./file” ก็มักจะเทยี บเทา่ กบั การอา้ งถึง “file” เฉยๆ อยู่แล้ว แต่คุณจะเห็นประโยชน์ของ
“.” เม่ือใช้ยูนกิ ซ์ไปสกั พัก ตัวอยา่ งเชน่ การเรยี กโปรแกรมหรอื สครปิ ตท์ ี่อยู่ในไดเรกทอรีปัจจบุ นั หรอื
การลบไฟลท์ ่ีช่อื ข้ึนตน้ ด้วยเครื่องหมายลบ (-) เปน็ ตน้

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

คำสั่งสรา้ งไดเรกทอรสี ำหรบั ยนู ิกซค์ ือ mkdir ซึ่งสามารถสงั่ สร้างในลกั ษณะสัมบูรณห์ รือสัมพทั ธก์ ็ได้

thep@anubis:~$ ls -F tmp/
a.out* Download/ hello.c Mail/ Projects/ tmp/
thep@anubis:~$ mkdir MyDoc
thep@anubis:~$ ls -F
a.out* Download/ hello.c Mail/ MyDoc/ Projects/
thep@anubis:~$ mkdir /var/tmp/MyDoc
thep@anubis:~$ ls -F /var/tmp
MyDoc/

ท้งั น้ี ในการส่ังสรา้ งไดเรกทอรีแบบสัมบูรณ์ จะตอ้ งมีไดเรกทอรีเบือ้ งบนอยู่กอ่ น มิฉะนนั้ จะไม่
สามารถสร้างได้

20 บทท่ี 1. เรม่ิ ต้นกับยูนิกซ์

thep@anubis:~$ mkdir /var/tmp/where/is/MyDoc
mkdir: cannot create directory ‘/var/tmp/where/is/MyDoc’: No such

file or directory

อยา่ งไรก็ดี mkdir ของ GNU มีตวั เลือก -p เพือ่ สร้างไดเรกทอรเี บือ้ งบนให้ด้วย

thep@anubis:~$ mkdir -p /var/tmp/where/is/MyDoc

1.3.5 การสำเนาและยา้ ยไฟลข์ า้ มไดเรกทอรี

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

thep@anubis:~$ ls MyDoc tmp/
thep@anubis:~$ cp /etc/hostname /etc/hosts MyDoc
thep@anubis:~$ ls MyDoc
hostname hosts
thep@anubis:~$ ls -F .
a.out* Download/ hello.c Mail/ MyDoc/ Projects/
thep@anubis:~$ mv a.out hello.c MyDoc
thep@anubis:~$ ls -F .
Download/ Mail/ MyDoc/ Projects/ tmp/
thep@anubis:~$ ls MyDoc
a.out hello.c hostname hosts

1.3.6 การสำเนาไดเรกทอรี

คำสง่ั ที่ใช้สำเนาไดเรกทอรีอย่างง่าย ไดแ้ ก่ cp -r โดยระบุต้นทางและปลายทางเป็นไดเรกทอรีแทนท่ี
จะเปน็ ไฟลอ์ ย่างการสำเนาไฟล์ ตัวเลอื ก -r (recursive) จะสำเนาทกุ ๆ ไฟล์และไดเรกทอรยี อ่ ยในไดเรก
ทอรีต้นทางไปยังไดเรกทอรีปลายทาง

thep@anubis:~$ ls -F

a.out* Download/ hello.c Mail/ MyDoc/ Projects/ tmp/

thep@anubis:~$ cp -r /usr/games mygames xdemineur
xdigger
thep@anubis:~$ ls -F

a.out* hello.c MyDoc/ Projects/

Download/ Mail/ mygames/ tmp/

thep@anubis:~$ ls mygames

3Dc gnome-stones mahjongg

banner gnometris nethack

1.4. การตงั้ ช่อื ไฟล์ 21

cgoban gnomine nethack-gnome xgal
cmail gnuchess pxboard xgalaga
debugboard gnuchessx same-gnome xtet42
gnibbles gnugo sol zic2xpm
gnobots2 grab_cgoban tint
gnome-freecell iagno xboard

1.3.7 การลบไดเรกทอรี

ยนู ิกซ์จะลบไดเรกทอรีดว้ ยคำสั่ง rmdir ซงึ่ จะใช้สำหรับไดเรกทอรีเปลา่ เท่านัน้ กล่าวคือ คุณจะตอ้ งลบ
ไฟล์ทัง้ หลายภายใตไ้ ดเรกทอรีท่ีจะลบน้นั ให้หมดเสียกอ่ น

thep@anubis:~$ ls -F tmp/
a.out* Download/ hello.c Mail/ MyDoc/ Projects/
thep@anubis:~$ cp /etc/hostname MyDoc
thep@anubis:~$ ls MyDoc
hostname
thep@anubis:~$ rmdir MyDoc
rmdir: ‘MyDoc’: Directory not empty
thep@anubis:~$ rm MyDoc/*
thep@anubis:~$ rmdir MyDoc
thep@anubis:~$ ls -F
a.out* Download/ hello.c Mail/ Projects/ tmp/

การไม่อนญุ าตให้ลบไดเรกทอรีท่ีมีขอ้ มูลน้ีก็มีข้อดีตรงท่ีลดโอกาสที่ขอ้ มลู จะหายโดยไม่เจตนาลงได้
อยา่ งไรกด็ ี ยังมีวธิ ีท่ีจะลบไดเรกทอรีพร้อมทงั้ ไฟล์และไดเรกทอรีย่อยท้ังหมดที่อยู่ในนนั้ โดยใช้ตวั เลอื ก
-r ในคำสง่ั rm ธรรมดา

thep@anubis:~$ ls -F Mail/ MyDoc/ Projects/ tmp/
a.out* Download/ hello.c Mail/ Projects/ tmp/
thep@anubis:~$ ls MyDoc
hostname
thep@anubis:~$ rm -r MyDoc
thep@anubis:~$ ls -F
a.out* Download/ hello.c

1.4 การตง้ั ช่ือไฟล์

ยูนกิ ซก์ ำหนดให้ไฟล์มีชอ่ื ยาวได้ถึง 14 ตวั อักษร ถงึ แม้หลายระบบ (เช่น GNU/Linux) ได้ขยายให้ใช้ได้
ถงึ 256 ตวั อักษร แต่ชอื่ ไฟล์ท่ียาวไม่เกนิ 14 ตวั อักษรจะใช้ไดก้ ับยนู ิกซ์ทกุ ระบบ ตวั อกั ษรท่ีอนุญาตให้
ใช้ตงั้ ช่อื ไฟลไ์ ดอ้ ย่างปลอดภัย ไดแ้ ก่

22 บทท่ี 1. เรม่ิ ตน้ กับยูนกิ ซ์

• ตวั อกั ษรภาษาองั กฤษ a-z และ A-Z โดยตัวเล็ก-ตัวใหญ่จะถอื ว่าต่างกนั กลา่ วคอื abc, ABC
และ Abc ถือว่าเปน็ ไฟลท์ ่ตี ่างกนั

• ตัวเลข 0-9
• เครอื่ งหมาย . ,
ส่วนเครอ่ื งหมายอื่นๆ เช่น ; $ ‘ " ’ | ( ) ~ * & # - < > ? / อาจมีปัญหาเมอ่ื นำมา
ตงั้ เป็นช่ือไฟล์ เน่อื งจากเป็นเครือ่ งหมายพเิ ศษท่ีเชลล์ตคี วาม โดยเฉพาะเครอื่ งหมาย / นัน้ ระบบจะ
ตคี วามเป็นเคร่ืองหมายแบง่ ชื่อไดเรกทอรเี สมอ
เครอ่ื งหมายจุด (.) นัน้ นยิ มใช้ตั้งนามสกุลของไฟล์เพื่อบอกชนิด เชน่ foo.c เปน็ ไฟล์ซอร์สโคด้
ภาษาซี foo.jpg เป็นไฟล์รูปภาพแบบ JPEG เป็นตน้ แตถ่ ้าเครอ่ื งหมาย . อยหู่ น้าสุด เชน่ .bashrc
จะทำใหไ้ ฟล์น้นั ถกู ซ่อนจากคำส่ัง ls ปกติ ต้องใชต้ ัวเลอื ก -a จงึ จะเหน็

1.5 wildcard

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

การกำหนด wildcard ใชส้ ัญลกั ษณพ์ ิเศษต่อไปน้ี
* แทนตัวอักษรใดๆ ตงั้ แต่ 0 ตวั ขึ้นไปกีต่ วั กไ็ ด้
? แทนตัวอักษรใดๆ 1 ตัว
[ ] แทนตวั อักษรใดๆ ในชุดทก่ี ำหนด 1 ตวั
เพอ่ื เป็นตัวอยา่ ง เราจะสร้างไดเรกทอรที ดสอบดังน้ี

thep@anubis:~/starwars$ touch starwars prologue.txt episode1.txt
episode2.txt episode3.txt episode4.txt episode5.txt episode6.txt
episodeX.txt epilogue.txt
thep@anubis:~/starwars$ ls
epilogue.txt episode3.txt episode6.txt starwars
episode1.txt episode4.txt episodeX.txt
episode2.txt episode5.txt prologue.txt

*.txt หมายถึงไฟลท์ ีล่ งทา้ ยด้วย “.txt”

thep@anubis:~/starwars$ ls *.txt
epilogue.txt episode3.txt episode6.txt
episode1.txt episode4.txt episodeX.txt
episode2.txt episode5.txt prologue.txt

episode?.txt หมายถงึ ไฟล์ท่ีขนึ้ ตน้ ด้วย “episode” ตามด้วยอักษรอะไรกไ็ ด้ 1 ตวั ตามด้วย
“.txt”

1.5. WILDCARD 23

thep@anubis:~/starwars$ ls episode?.txt
episode1.txt episode3.txt episode5.txt episodeX.txt
episode2.txt episode4.txt episode6.txt

episode[0-9].txt หมายถงึ ไฟล์ที่ข้ึนต้นดว้ ย “episode” ตามดว้ ยตวั เลข 1 ตัว ตามดว้ ย
“.txt”

thep@anubis:~/starwars$ ls episode[0-9].txt
episode1.txt episode3.txt episode5.txt
episode2.txt episode4.txt episode6.txt

epi* หมายถงึ ไฟลท์ ่ขี ้ึนตน้ ด้วย “epi”

thep@anubis:~/starwars$ ls epi*
epilogue.txt episode2.txt episode4.txt episode6.txt
episode1.txt episode3.txt episode5.txt episodeX.txt

*logue* หมายถึงไฟล์ทม่ี ีคำว่า “logue” อยู่ในชื่อ

thep@anubis:~/starwars$ ls *logue*
epilogue.txt prologue.txt

เพอื่ เปน็ การแสดงให้ผู้อ่านมองเห็นกลไกของการกระจาย wildcard ใกล้ชิดขนึ้ อีกนดิ เราลองใช้
wildcard กบั คำส่ัง echo ดงั นี้

thep@anubis:~/starwars$ echo *.txt
epilogue.txt episode1.txt episode2.txt episode3.txt episode4.txt
episode5.txt episode6.txt episodeX.txt prologue.txt

เราได้ทราบในหวั ข้อ 1.2.1 แล้วว่าคำส่งั echo จะทำหน้าทเ่ี พียงแคแ่ สดงค่าตา่ งๆ ทเ่ี ปน็ อารก์ ิวเมนต์
ออกทางจอภาพ คน่ั ดว้ ยชอ่ งวา่ งหนงึ่ ชอ่ ง ผลลัพธท์ ่ไี ดจ้ ึงแสดงให้เห็นวา่ echo ไมไ่ ด้รบั อารก์ ิวเมนต์เป็น
“*.txt” แต่เปน็ ชื่อไฟล์ทงั้ หมดที่กระจายแลว้ ซง่ึ การกระจายดงั กล่าวเป็นหนา้ ที่ของเชลล์ ดังนน้ั คณุ
คงจะพอมองเหน็ แล้ววา่ คำส่งั ls หรือโปรแกรมใดๆ บนยนู ิกซ์ ไม่จำเป็นตอ้ งรู้วธิ กี ระจาย wildcard เลย

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

จากตวั อย่างของ echo ข้างตน้ หากคณุ ไม่ต้องการให้เชลล์กระจาย wildcard เพือ่ ให้ echo แสดง
ขอ้ ความ “*.txt” จรงิ ๆ กม็ ีวิธีทำไดห้ ลายวธิ ี ได้แก่

1. ใช้ backslash (\) กำกับหนา้ เครอื่ งหมายพเิ ศษของ wildcard

thep@anubis:~/starwars$ echo \*.txt
*.txt

24 บทท่ี 1. เร่ิมตน้ กบั ยูนิกซ์

thep@anubis:~/starwars$ echo episode\[0-9\].txt
episode[0-9].txt

2. ใชอ้ ญั ประกาศคู่ (" ") ครอ่ มนพิ จนท์ ้ังหมด

thep@anubis:~/starwars$ echo "*.txt"
*.txt
thep@anubis:~/starwars$ echo "episode[0-9].txt"
episode[0-9].txt

3. ใช้อัญประกาศเด่ยี ว (’ ’) ครอ่ มนิพจน์ทั้งหมด

thep@anubis:~/starwars$ echo ’*.txt’
*.txt
thep@anubis:~/starwars$ echo ’episode[0-9].txt’
episode[0-9].txt

การใช้อญั ประกาศคแู่ ละอัญประกาศเดี่ยวจะให้ผลเหมอื นกนั ในกรณขี อง wildcard แตจ่ ะตา่ งกันเมือ่
มกี ารใชต้ วั แปรเชลล์ ดงั จะกล่าวในโอกาสต่อไป

บทที่

2

ระบบรกั ษาความปลอดภัย

ยนู ิกซ์เปน็ ระบบที่ถือกำเนดิ มาเพ่ือใช้กับเครอื่ งขนาดใหญ่ท่ีรองรบั ผใู้ ช้หลายคนในเวลาเดียวกนั (เรียกว่า
เปน็ ระบบ multi-user) ลักษณะการใช้ยูนกิ ซ์ของผู้ใช้ในระบบเหลา่ น้นั จึงคลา้ ยกบั การเช่าคอนโดมเิ นียม
รว่ มกันมากกว่าการเป็นเจ้าของบา้ นทงั้ หลังเหมือนการใช้ระบบดอสหรือวนิ โดวส์กับเครือ่ งคอมพวิ เตอร์
สว่ นตัว ดังนั้น ยนู กิ ซจ์ ึงต้องมีระบบรักษาความปลอดภัยเพอ่ื ปกปอ้ งความเปน็ สว่ นตวั ของผู้ใช้แต่ละคน
เปน็ คุณสมบตั ิขน้ั พนื้ ฐาน แม้ปจั จบุ นั เมือ่ นำมาใช้งานแบบ stand-alone ตามเครื่องพีซีตามบา้ นก็ตาม
ระบบดงั กลา่ วก็ยังมีประโยชน์ในด้านการลดความเสยี หายที่ผูใ้ ช้อาจกระทำต่อระบบโดยไม่ต้งั ใจ รวมถึง
การจำกดั ขอบเขตของผลกระทบของโปรแกรมประเภทไวรัส จนทำให้แรงจงู ใจในการสรา้ งไวรัสสำหรบั
ยูนิกซ์แทบไมม่ ีเอาเสียเลย

2.1 ผู้ใชแ้ ละกลุม่

สิ่งแรกที่จะใช้จำแนกแยกแยะผใู้ ช้ในระบบก็คือ บัญชผี ูใ้ ช้ (user account) ซงึ่ โดยหลักการกค็ ล้ายกบั บัญชี
ธนาคารมาก ผใู้ ชแ้ ต่ละคนจะมีชอื่ บัญชแี ละหมายเลขประจำตวั (user ID หรอื uid) ทรัพยากรทุกอย่างใน
ระบบจะมเี จ้าของท้งั นน้ั โดยระบุเจ้าของด้วยหมายเลขประจำตัวนี้เอง

โดยปกติ เม่ือผู้ใช้เปิดบญั ชีในระบบแลว้ ก็จะมี “บา้ น” ของตวั เองในระบบ เรียกวา่ ไดเรกทอรีบ้าน
(home directory) ไว้สำหรบั ใช้งานด้วย เมอื่ จะเข้าใช้ระบบ ผ้ใู ช้จะต้อง ลงบนั ทึกเขา้ ใช้ระบบ (login)
เสยี ก่อน เมอื่ ลงบันทึกแล้ว กจ็ ะเขา้ มาอยูท่ ไี่ ดเรกทอรีบ้านเป็นอนั ดบั แรก

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

ผ้ใู ช้คนหนง่ึ ๆ สามารถอยู่ในกลมุ่ มากกว่าหน่งึ กลุม่ ได้ โดยจะมกี ลุม่ โดยปริยายอยูก่ ลุ่มหนง่ึ เสมอ
25

26 บทที่ 2. ระบบรกั ษาความปลอดภัย

2.2 การตั้งรหัสผ่าน

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

thep@anubis:~$ passwd
Changing password for thep

(current) UNIX password: (ปอ้ นรหัสผ่านเดิม ซึ่งจะไมป่ รากฏบนจอภาพ)
Enter new UNIX password: (ปอ้ นรหสั ผ่านใหม่ ซง่ึ จะไมป่ รากฏเช่นกัน)
Retype new UNIX password: (ปอ้ นรหสั ผา่ นใหมซ่ ้ำอกี ครั้งเพ่อื ยนื ยัน)

passwd: password updated successfully

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

ในบางระบบ ผู้ดูแลระบบจะบงั คับนโยบายในการตั้งรหสั ผา่ นดว้ ยคำสั่ง passwd โดยอาจเตือน
หรอื ไม่ยอมให้ผา่ นถ้ารหัสสน้ั เกนิ ไปหรอื เดาได้ง่ายด้วยโปรแกรมอตั โนมตั ิ (เชน่ เป็นคำในพจนานุกรม
เปน็ ตน้ )

2.3 สารบบผูใ้ ช้

รายชื่อผู้ใช้ทั้งหมดในระบบจะเกบ็ ไว้ที่ไฟล์ /etc/passwd หนึ่งคนหน่งึ บรรทัด โดยแบง่ เปน็ ฟลิ ดต์ ่างๆ
คั่นด้วยทวภิ าค (colon) ดังตัวอย่าง

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
...
thep:x:500:100:Theppitak Karoonboonyanan,,,:/home/thep:/bin/bash

ขอ้ มูลในฟลิ ดต์ า่ งๆ ไดแ้ ก่

1. ชือ่ บญั ชี (user) เชน่ thep

2. รหสั ผา่ น (password) โดยจะเก็บในรูปแบบท่ีเขา้ รหัสทางเดยี วไว้ แต่สามารถแยกเกบ็ ในไฟล์
/etc/shadow ตา่ งหากซงึ่ root อ่านได้คนเดยี วได้ เพ่อื ความปลอดภยั จากการเดารหสั ผา่ น
ด้วยโปรแกรมอัตโนมตั ิ ดงั ในตัวอย่างข้างต้น โดยฟิลดน์ ้จี ะมีคา่ เปน็ x หมด

2.4. ใครเป็นใคร 27

3. หมายเลขประจำตัว (user id)

4. หมายเลขกลมุ่ (group id) หมายถงึ กลุม่ โดยปริยาย แต่ผใู้ ช้สามารถเข้าร่วมในกลุม่ อนื่ อกี ได้ ซึ่ง
จะกำหนดไวใ้ นไฟล์ /etc/group ดังจะกล่าวตอ่ ไป

5. ขอ้ มูลผูใ้ ช้ (comment) เกบ็ ช่อื -สกลุ ของผูใ้ ช้ โดยอาจเกบ็ ข้อมลู อื่นๆ อกี สามอย่าง ค่ันด้วยจุลภาค
(comma) ได้แก่ หมายเลขหอ้ งทำงาน หมายเลขโทรศัพท์ท่ที ำงาน หมายเลขโทรศัพทท์ บี่ ้าน

6. ไดเรกทอรบี า้ น (home directory)

7. เชลล์ (shell) ได้แก่โปรแกรมที่จะทำงานเพือ่ รับคำส่ังของผใู้ ช้เมือ่ ลงบันทึกเขา้ ระบบ

ผูใ้ ช้รายแรกๆ ถดั จาก root ในตวั อย่างข้างตน้ เช่น daemon, bin, sys เป็นผใู้ ชท้ ่ีสงวนไว้ใช้วง่ิ โปรแกรม
ให้บรกิ ารต่างๆ ไม่ใชผ่ ู้ใช้ท่เี ป็นบคุ คล ขอ้ มลู ในฟลิ ดข์ องเชลล์จงึ อาจเปน็ คำสั่งท่ไี มใ่ ชเ่ ชลล์ โดยบัญชที ่หี า้ ม
ลงบนั ทึกเข้าใชเ้ ดด็ ขาดมกั จะมเี ชลล์เปน็ /bin/false

2.4 ใครเป็นใคร

2.4.1 ฉนั คอื ใคร

เพื่อทีจ่ ะตรวจสอบให้แนใ่ จว่าคณุ กำลังทำงานอยู่ด้วยบญั ชขี องใคร คณุ สามารถถามไดด้ ว้ ยคำสง่ั whoami

thep@anubis:~$ whoami
thep

2.4.2 เหลอื บแลเพื่อนบา้ น

คำสง่ั who จะแสดงรายชอ่ื ผ้ทู ่ีกำลงั เข้าใช้ระบบทัง้ หมด

thep@anubis:~$ who Jun 26 23:59
thep tty2 Jun 27 00:01
root tty3 Jun 27 00:02
somsak tty4

คอลมั น์แรกจะเปน็ ช่ือบัญชีผใู้ ช้ที่เขา้ ใช้ระบบ คอลมั น์ท่ีสองเป็นชื่อเทอรม์ นิ ัลที่ใช้ติดตอ่ กบั ระบบ และ
คอลมั นถ์ ดั มาเปน็ เวลาทเ่ี ข้าใชร้ ะบบ

2.4.3 รจู้ ักเพ่ือนบ้าน

ข้อมูลต่างๆ ของผู้ใช้แตล่ ะคนท่เี กบ็ ไว้ในสารบบ สามารถเรียกดไู ด้ดว้ ยคำสั่ง finger

thep@anubis:~$ finger thep

Login: thep Name: Theppitak Karoonboonyanan

Directory: /home/thep Shell: /bin/bash

On since Thu Jun 26 23:59 (ICT) on tty2 5 minutes 48 seconds idle

(messages off)

28 บทท่ี 2. ระบบรกั ษาความปลอดภัย

No mail.
No Plan.

คณุ สามารถแก้ไขรายละเอยี ดขอ้ มูลของตวั คุณเองได้บางส่วนดว้ ยคำสั่ง chfn

thep@anubis:~$ chfn

Password: (ปอ้ นรหสั ผา่ น)

Changing the user information for thep

Enter the new value, or press ENTER for the default

Full Name: Theppitak Karoonboonyanan

Room Number []: 201

Work Phone []: 1150

Home Phone []: 1112

thep@anubis:~$ finger thep

Login: thep Name: Theppitak Karoonboonyanan

Directory: /home/thep Shell: /bin/bash

Office: 201, x1150 Home Phone: x1112

On since Thu Jun 26 23:59 (ICT) on tty2 17 minutes 3 seconds idle

(messages off)

No mail.

No Plan.

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

ส่วนบรรทดั สุดท้าย “No Plan.” นน้ั เป็นขอ้ มูลแผนการของคุณท่ีอยากเปิดเผยให้เพือ่ นบา้ นรู้
ซึ่งทำได้โดยเขียนไว้ในไฟล์ ~/.plan และอกี ไฟล์หนงึ่ ที่ finger จะตรวจสอบคือ ~/.project
เป็นการใหข้ ้อมลู ว่าคุณกำลงั ทำโครงงานอะไรอยู่

thep@anubis:~$ cat > ~/.plan

T£ o rule  the world.
¢Ctrl-d ¡

thep@anubis:~$ cat > ~/.project

N£ euclear  Weapon.
¢Ctrl-d ¡

thep@anubis:~$ finger thep

Login: thep Name: Theppitak Karoonboonyanan

Directory: /home/thep Shell: /bin/bash

Office: 201, x1150 Home Phone: x1112

On since Thu Jun 26 23:59 (ICT) on tty2 17 minutes 3 seconds idle

(messages off)

No mail.

2.5. ผดู้ ูแลระบบ 29

Project:
Neuclear Weapon.
Plan:
To rule the world.

นอกจากนี้ ยงั สามารถเปลยี่ นเชลลไ์ ดด้ ว้ ยคำสง่ั chsh

thep@anubis:~$ chsh

Password: (ป้อนรหัสผ่าน)

Changing the login shell for thep
Enter the new value, or press return for the default

Login Shell [/bin/bash]: /bin/tcsh

คำสัง่ finger นอกจากจะใช้ดูขอ้ มลู ทว่ั ไปของผใู้ ช้ ยังมีรปู แบบการเรียกแบบไม่ระบุชือ่ ผ้ใู ช้ โดยจะ
แสดงขอ้ มูลอยา่ งยอ่ ของผูใ้ ชท้ ่กี ำลังเขา้ ใช้ระบบท้ังหมด

thep@anubis:~$ finger

Login Name Tty Idle Login Time
15:54 Jun 27 00:01
root root *tty3 15:55 Jun 26 23:59
Jun 27 00:02
thep Theppitak Karoon *tty2 1:58

somsak Somsak Saetae tty4

2.5 ผ้ดู แู ลระบบ

ดังที่กล่าวไปแลว้ วา่ ผ้ใู ช้แตล่ ะคนจะถกู จำกัดขอบเขตของสิทธิในการเขา้ ถึงไฟล์ตา่ งๆ แต่จะมีผ้ใู ช้พิเศษ
อยู่คนหนง่ึ ท่ีมีสิทธิในการเข้าถงึ ไฟล์ทุกไฟล์ในระบบ เขาคอื ภารโรงผู้ถอื กญุ แจหอ้ งทุกห้อง เพ่อื จะได้
ชว่ ยแก้ปญั หาให้กบั ผู้ใช้ และเพือ่ ปรับแต่งระบบ ติดต้งั โปรแกรมท่ีใช้งานร่วมกนั ฯลฯ เรียกวา่ ผู้ดูแล
ระบบ (system administrator) หรือบางคร้ังเรียกอย่างยกย่องวา่ super user เนื่องเพราะเอกสิทธิ์ที่ได้
มาพรอ้ มกบั หนา้ ทีบ่ รกิ ารนั่นเอง

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

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

2.6 แปลงร่าง

ในบางครั้ง คุณอาจจำเป็นตอ้ งทำงานบางอย่างในนามของผ้ใู ช้อน่ื ชั่วคราว เชน่ เมอื่ คุณไดร้ ับความไว้วางใจ
จากผใู้ ชอ้ ่ืนให้ช่วยแก้ปญั หาบางอย่างให้ และโดยเฉพาะเม่อื คณุ เปน็ super user ซึ่งโดยปกติคุณจะใชบ้ ญั ชี

30 บทที่ 2. ระบบรักษาความปลอดภัย

ต่างหากของคุณทำงาน แต่เมื่อผูใ้ ช้ในระบบมารอ้ งขอให้แก้ปญั หาให้ (เชน่ ลมื รหสั ผ่าน) คณุ ไม่จำเปน็
ตอ้ งหาตู้โทรศพั ท์ เพียงแต่ใชค้ ำส่งั su เพ่อื เปล่ยี นเป็น super user

thep@anubis:~$ su

Password: (ปอ้ นรหสั ผา่ นของ super user)

anubis:/home/thep#

สงั เกตว่า เครื่องหมายรับคำส่ัง (prompt) ของคุณได้เปลย่ี นจาก $ เปน็ # ซงึ่ เปน็ เครอ่ื งหมายของ super
user เรียบรอ้ ยแล้ว

anubis:/home/thep# whoami
root

คณุ สามารถกำหนดชอื่ บญั ชีผูใ้ ช้อื่นท่ีต้องการเปลี่ยนไปเปน็ ให้กับคำส่ัง su ได้ โดยหากไม่กำหนด
จะหมายถึง root จากนัน้ su จะถามรหสั ผ่านของผู้ใชท้ ี่คณุ ตอ้ งการเปล่ียนไปเป็นนั้น

thep@anubis:~$ su somsak

Password: (ป้อนรหัสผา่ นของ somsak)

somsak@anubis:/home/thep$

การแปลงร่างด้วย su นี้ เป็นการสรา้ งเชลล์ใหม่ทับเชลล์เดมิ ดงั น้นั เมื่อคุณ£ปฏบิ ัติภารก จิ เสร็จ คุณ
สามารถกลับไปสเู่ ชลลเ์ ดิมได้โดยออกจากเชลล์ su นี้ ดว้ ยคำสง่ั exit หรือกด ¢Ctrl-d ¡

anubis:/home/thep# whoami
root
anubis:/home/thep# exit
thep@anubis:~$ whoami
thep

2.7 การปกปอ้ งไฟล์

2.7.1 สทิ ธิการเขา้ ถึงไฟล์

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

thep@anubis:~$ ls -l users 4815 2002-08-23 14:49 a.out
total 28 users 4096 2002-08-23 14:48 Download
-rwxr-xr-x 1 thep users
drwxr-xr-x 2 thep users 77 2002-08-23 14:49 hello.c
-rw-r--r-- 1 thep users 4096 2002-08-23 14:48 Mail
drwxr-xr-x 2 thep users 4096 2002-08-23 14:48 Projects
drwxr-xr-x 2 thep 4096 2002-08-23 14:48 tmp
drwxr-xr-x 2 thep

2.7. การปกปอ้ งไฟล์ 31

ดงั ได้เกริ่นไปแล้วในหวั ขอ้ 1.2.3 ว่าคอลมั น์แรกของผลลัพธ์ของคำส่ัง ls -l จะแสดงชนิดของ
ไฟล์และสทิ ธกิ ารเขา้ ถึงไฟล์ (permission) ซ่งึ สทิ ธิการเขา้ ถึงไฟล์นี้ มีบทบาทสำคญั ในระบบรกั ษาความ
ปลอดภยั ของยูนกิ ซ์ เนอื่ งจาก I/O ทกุ อย่างท่ีเรยี กผ่านระบบจะมกี ารตรวจสอบสทิ ธกิ อ่ นเสมอ โดยเทยี บ
user id และ group id ของผู้เรียกใช้กบั ค่าที่เป็นคณุ สมบตั ิของไฟล์ โดยถา้ ตรวจสอบสทิ ธิไม่ผ่าน ระบบ
จะถือเป็นขอ้ ผดิ พลาดและไม่ทำงานให้ โดยข้อความแจง้ ขอ้ ผดิ พลาดมักจะเป็น “Permission denied.”
ดงั น้ัน ไฟล์ข้อมลู ของผใู้ ชจ้ งึ ได้รบั การปกปอ้ งเปน็ อยา่ งดถี ้ามีการกำหนดสทิ ธอิ ย่างเหมาะสม

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

สทิ ธิการเขา้ ถงึ ไฟล์จะมีสามส่วน ไดแ้ ก่ 1. สทิ ธิของเจ้าของไฟล์เอง 2. สทิ ธิของผใู้ ช้ในกลุ่มเดยี วกับ
กลมุ่ เจา้ ของไฟล์ และ 3. สทิ ธิของผู้ใช้นอกกลุ่ม และสิทธิแต่ละสว่ นนัน้ สามารถกำหนดสิทธิได้สาม
ประการ คือ 1. สิทธใิ นการอา่ นไฟล์ (r) 2. สทิ ธใิ นการเขยี นไฟล์ (w) 3. สทิ ธใิ นการ execute ไฟล์ (x)

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

2.7.2 สทิ ธกิ ารเข้าถงึ ไฟล์แบบพเิ ศษ

นอกจากการกำหนดสทิ ธิเขา้ ถึงปกติ ยังมีการกำหนดสทิ ธิในลักษณะพิเศษอกี ลกั ษณะหนง่ึ สำหรับไฟล์ที่
ยอมให้ execute ได้ คอื การยอมให้ execute โปรแกรม ดว้ ยสทิ ธขิ องเจา้ ของไฟล์ มีบางสถานการณ์ที่
จำเปน็ ต้องทำเช่นน้นั เชน่ โปรแกรมตั้งรหัสผา่ น passwd ซึง่ อนญุ าตให้ผ้ใู ช้เปลี่ยนรหัสผ่านของตวั เอง
ได้ แต่การบันทกึ รหสั ผ่านท่ีเขา้ รหัสแลว้ ในไฟล์ของระบบจำเป็นต้องอาศยั สิทธิของ root ดังนน้ั ไฟล์
/usr/bin/passwd นอกจากจะอนญุ าตให้ execute แลว้ ยังอนุญาตให้ execute ดว้ ยสิทธิของ root
ซ่ึงเปน็ เจา้ ของไฟล์ไดอ้ ีกด้วย

thep@anubis:~$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 24248 2003-04-27 02:50 /usr/bin/passwd

สังเกตวา่ สทิ ธขิ องเจ้าของไฟล์มคี า่ เป็น s ไม่ใช่ x
การกำหนดสทิ ธิลกั ษณะพิเศษนี้ สามารถใช้กับ group ได้ดว้ ย กลา่ วคอื ผู้ execute จะสามารถ

execute โดยได้สิทธิเทียบเท่ากบั กลุ่มที่เป็นเจ้าของไฟล์ ไฟล์ท่ีมีการให้สิทธพิ เิ ศษนี้ ls -l จะรายงาน
permission ของการ execute ของกลุ่มเปน็ s เชน่ กัน

ท้ังการ execute ด้วยสิทธิของเจ้าของไฟล์และดว้ ยสิทธิของกลุ่มเจ้าของไฟล์นี้ เปน็ เรือ่ งท่ีคอ่ นขา้ ง
เส่ียงที่โปรแกรมหนง่ึ ๆ จะยอมให้มีได้ เพราะหากปอ้ งกนั ไม่ดี ก็เท่ากับเป็นชอ่ งโหว่ให้กับการขโมยสิทธิ
โปรแกรมลกั ษณะน้ีจงึ มไิ ด้มีให้เหน็ บอ่ ยๆ และถ้าจำเป็นตอ้ งใช้ ก็จะตอ้ งตรวจสอบดว้ ยความระมดั ระวัง
ยนู กิ ซเ์ ปดิ โอกาสให้โปรแกรมประเภทน้ีร้ตู ัวได้วา่ กำลงั ถกู execute แบบพเิ ศษ โดยโปรเซสจะทำงานดว้ ย
effective user/group id ของเจ้าของไฟล์เทา่ นนั้ แต่ real user/group id จะยงั คงเป็นของผู้เรยี กโปรแกรม
โปรแกรมจงึ มีโอกาสแยกแยะว่าจะให้สิทธิใดๆ ตาม effective หรือ real user/group id

มาถงึ ตรงน้ี ผอู้ า่ นอาจกำลังนกึ ถึงบิตสดุ ท้าย คอื สิทธิของการ execute ของผู้ใชน้ อกกลมุ่ ว่ามีการ
กำหนดสทิ ธิพเิ ศษเช่นนห้ี รอื ไม่ เมื่อคิดโดยตรรกะแล้ว การให้สิทธิ execute “ดว้ ยสิทธเิ ทยี บเท่าผู้ใช้นอก
กลมุ่ ” ก็เปรียบเสมอื นไม่ให้สิทธิอะไรพเิ ศษเลย และอีกประการหนึง่ ไฟล์มีเจา้ ของและกลุ่มเจ้าของที่จะ
ให้คา่ แก่ effective user/group id เทา่ นน้ั ไมม่ ีอะไรเกีย่ วข้องกบั ผูใ้ ชน้ อกกล่มุ เลย

32 บทที่ 2. ระบบรักษาความปลอดภยั

คำตอบก็คือ ยูนกิ ซใ์ ช้บิตพิเศษที่ว่านี้เพ่ือจดุ ประสงค์อืน่ ท่ีไม่ใช่การให้สทิ ธิโดยตรง บิตนี้เรียกวา่
“sticky bit” และไฟล์ท่ีถกู เซ็ตบิตน้ีก็เรียกว่า “sticky file” โดยไฟล์โปรแกรมที่ sticky นี้ จะคา้ งอยู่
ในหนว่ ยความจำของระบบเมื่อจบการทำงานแลว้ ทำให้ไม่จำเป็นต้องเรมิ่ โหลดโปรแกรมใหม่ในการเรียก
ใช้ครงั้ ตอ่ ไป1

“sticky bit” น้ี คอ่ นขา้ งพิเศษสักหนอ่ ยเมอ่ื นำไปใช้กบั ไดเรกทอรี “sticky directory” ท่ียอมให้
ทกุ คนเขยี น (เชน่ /tmp) จะยอมให้ผใู้ ช้ที่เป็นเจา้ ของไฟล์เทา่ นนั้ สามารถลบไฟล์ในไดเรกทอรีได้ (หาก
ไม่เซต็ sticky bit กบั ไดเรกทอรีสาธารณะก็หมายความว่า ทุกคนมีสทิ ธิลบไฟล์ใดๆ กไ็ ดท้ ง้ั น้นั ในไดเรก
ทอรนี น้ั ซึ่งไม่เหมาะสมนกั )

ls -l จะแสดงสิทธิการ execute ของผ้ใู ช้นอกกลุม่ ของ sticky file/directory ดว้ ย t แทน x
ตัวอยา่ งท่ีดกี ค็ ือ /tmp

thep@anubis:~$ ls -ld /tmp 4096 2003-06-28 17:19 /tmp
drwxrwxrwt 7 root root

การกำหนดสทิ ธิแบบพิเศษท้ังหมดนี้ จะอาศัยบิตเพ่มิ เติมอกี 3 บิต (เรียกว่า setuid bit, setgid bit
และ sticky bit ตามลำดบั ) รวมกบั บติ เดิม 9 บติ เปน็ 12 บติ โดยแทนดว้ ยเลขฐานแปด 4 หลัก การ
กำหนดสทิ ธพิ เิ ศษน้ีจะอยู่หลกั บนสุด โดยถ้ากำหนดแบบ 3 หลกั ปกติก็จะหมายถงึ คา่ ศูนย์ในบิตพเิ ศษ
ทงั้ หมด

2.7.3 การกำหนดสทิ ธิเขา้ ถงึ ไฟล์

permission ของไฟล์ สามารถเปลย่ี นได้ดว้ ยคำสงั่ chmod โดยเขา้ รหัส permission เป็นเลขฐานแปด 3
หลัก (ในกรณีปกต)ิ แทนสิทธิสามส่วน (เจ้าของ, กลุม่ , ผู้อืน่ ) โดยตัวเลขฐานแปดแตล่ ะหลัก เมอ่ื แปลง
เป็นเลขฐานสองสามบติ ก็จะแทนการอนญุ าตสามประการ (read, write, execute) สำหรับผใู้ ช้แต่ละ
ประเภท ตัวอยา่ งเชน่

750 เทียบเทา่ กบั rwxr-x--- คอื เจ้าของสามารถอา่ น เขียน execute ได;้ ผใู้ ช้ในกลมุ่ เดียวกนั อา่ น
และ execute ได้ แตเ่ ขยี นไม่ได;้ ผู้ใช้นอกกลมุ่ ทำอะไรไมไ่ ดเ้ ลยแม้แต่อา่ น

644 เทียบเท่ากับ rw-r--r-- คือเปน็ ไฟล์ที่ execute ไม่ได้ แต่อา่ นได้ทกุ คน และมีเพยี งเจา้ ของ
เท่านั้นทีเ่ ขยี นได้

777 เทยี บเท่ากับ rwxrwxrwx คอื เป็นไฟลส์ าธารณะ

ตัวอย่างการตง้ั คา่

thep@anubis:~$ touch a # สร้างไฟล์เปลา่ 0 2003-06-28 14:49 a
0 2003-06-28 14:49 a
thep@anubis:~$ chmod 750 a
thep@anubis:~$ ls -l a
-rwxr-x--- 1 thep users
thep@anubis:~$ chmod 644 a
thep@anubis:~$ ls -l a
-rw-r--r-- 1 thep users

1คมู่ ือของ GNU/Linux ระบุวา่ ความสามารถนี้แทบไม่จำเปน็ สำหรับ Linux kernel แล้ว เพราะระบบ virtual memory
สามารถจดั การให้ได้ แต่อย่างไรกด็ ี มนั ก็เปน็ ข้อกำหนดหนึ่งของยนู กิ ซ์ท่ตี ้องคงไว้

2.7. การปกปอ้ งไฟล์ 33

thep@anubis:~$ chmod 777 a 0 2003-06-28 14:49 a
thep@anubis:~$ ls -l a
-rwxrwxrwx 1 thep users

อย่างไรก็ดี เพือ่ ความงา่ ยต่อการส่งั งาน chmod ยังรับค่าอกี ลักษณะหนึ่ง คือเป็นคำสั่งเซต็ บติ ใน
รปู แบบ [ugoa][+-][rwx]

• อักษรตวั แรก หมายถงึ สว่ นของสทิ ธิทจี่ ะต้งั คา่ (เลือกไดม้ ากกวา่ หนึ่งสว่ น)

u = user (เจา้ ของไฟล์)
g = group (ผใู้ ช้ในกลมุ่ )
o = other (ผใู้ ช้นอกกลุ่ม)
a = all (เซต็ คา่ ท้ังสามส่วนพร้อมกนั )

• อักษรตัวทสี่ อง หมายถึง วิธีตัง้ คา่

+ = set (อนญุ าต)
- = clear (ไม่อนุญาต)

• อกั ษรตวั ทส่ี าม หมายถึง บติ ทีจ่ ะต้งั คา่ (เลอื กไดม้ ากกวา่ หนึง่ บติ )

r = read (สทิ ธใิ นการเขยี น)
w = write (สิทธใิ นการอา่ น)
x = execute (สิทธิในการ execute)

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

thep@anubis:~$ ls -l a

-rwxrwxrwx 1 thep users 0 2003-06-28 14:49 a

thep@anubis:~$ chmod g-w a # หา้ มผูใ้ ช้ในกลุ่มเขยี น

thep@anubis:~$ ls -l a

-rwxr-xrwx 1 thep users 0 2003-06-28 14:49 a

thep@anubis:~$ chmod o-rwx a # หา้ มผูใ้ ช้นอกกลุ่มทำทุกอย่าง

thep@anubis:~$ ls -l a

-rwxr-x--- 1 thep users 0 2003-06-28 14:49 a

thep@anubis:~$ chmod go+rw a # อนุญาตผู้ใชใ้ นกลุ่มและนอกกลุ่มอ่านและเขียน

thep@anubis:~$ ls -l a

-rwxrwxrw- 1 thep users 0 2003-06-28 14:49 a

thep@anubis:~$ chmod a-x a # ห้ามทกุ คน execute

thep@anubis:~$ ls -l a

-rw-rw-rw- 1 thep users 0 2003-06-28 14:49 a

thep@anubis:~$ chmod +x a # อนุญาตใหท้ ุกคน execute

thep@anubis:~$ ls -l a

-rwxrwxrwx 1 thep users 0 2003-06-28 14:49 a

จะเห็นวา่ สว่ นแรกทีเ่ ลอื กส่วนของสิทธนิ นั้ ถา้ ละกจ็ ะหมายถึงทุกสว่ น

34 บทท่ี 2. ระบบรกั ษาความปลอดภยั

สำหรับการกำหนดสทิ ธิแบบพเิ ศษ จะกำหนด setuid, setgid และ sticky bit ได้โดยเพ่ิมเลขฐาน
แปดหลกั บนอกี หนึ่งหลกั โดย 4 = setuid, 2 = setgid และ 1 = sticky เชน่

4750 เทียบเท่ากับ rwsr-x---

2750 เทยี บเทา่ กับ rwxr-s---

1755 เทยี บเทา่ กบั rwxr-xr-t

เนอื่ งจากบิตพเิ ศษทัง้ สามใช้ท่ีแสดงผลร่วมกับค่า x ปกติ คำสง่ั ls -l จงึ มีวธิ ีแยกความแตกตา่ งเม่ือ
บิตพิเศษถูกเซต็ โดยท่ี x ไมถ่ ูกเซ็ต (ซงึ่ ออกจะเป็นกรณีที่แปลกประหลาด แต่ ls ก็พยายามจดั การ) โดย
แสดงค่า s หรือ t ดว้ ยอักษรตัวใหญ่

thep@anubis:~$ chmod 4644 a # พิกล 0 2003-06-28 14:49 a
0 2003-06-28 14:49 a
thep@anubis:~$ ls -l a
-rwSr--r-- 1 thep users
thep@anubis:~$ chmod +x a
thep@anubis:~$ ls -l a
-rwsr-xr-x 1 thep users

คุณสามารถใช้รูปแบบ [guoa][+-][rwxst] เซต็ บติ พิเศษดังกลา่ วไดเ้ ช่นกนั

thep@anubis:~$ chmod g+s a 0 2003-06-28 14:49 a
thep@anubis:~$ ls -l a 0 2003-06-28 14:49 a
-rwsr-sr-x 1 thep users
thep@anubis:~$ chmod g+t a
thep@anubis:~$ ls -l a
-rwsr-sr-t 1 thep users

2.7.4 การโอนเจา้ ของไฟล์

ผูด้ แู ลระบบสามารถเปล่ียนเจา้ ของไฟล์ไดด้ ว้ ยคำสงั่ chown และเปล่ยี นกลุม่ เจา้ ของไฟลไ์ ดด้ ้วย chgrp

anubis:/home/thep# ls -l a 0 2003-06-28 14:49 a
-rwxrwxrwx 1 thep users
anubis:/home/thep# chown somsak a 0 2003-06-28 14:49 a
anubis:/home/thep# ls -l a 0 2003-06-28 14:49 a
-rwxrwxrwx 1 somsak users
anubis:/home/thep# chgrp wheel a
-rwxrwxrwx 1 somsak wheel

คำสงั่ chown และ chgrp เป็นคำสั่งทส่ี งวนไวส้ ำหรับ root เท่านัน้ ผู้ใชป้ กติไม่สามารถสง่ั ได้

บทท่ี

3

เกี่ยวกบั ไฟล์และไดเรกทอรี

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

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

3.1 ชนดิ ของไฟลบ์ นยนู ิกซ์

คำสง่ั ls -l สามารถชว่ ยแสดงชนดิ ของไฟล์ต่างๆ ได้ ดังไดก้ ล่าวไปแลว้ ในหัวข้อ 1.2.3 สญั ลกั ษณท์ ใี่ ช้
แทนชนดิ ตา่ งๆ ของไฟล์ ได้แก่

- หมายถึงไฟล์ปกติ
d หมายถงึ ไดเรกทอรี เปน็ ไฟล์ท่เี กบ็ “ต้นข้ัว” ของไฟลต์ ่างๆ ท่บี รรจอุ ยภู่ ายใน
l หมายถึง symbolic link เปน็ ไฟลท์ ชี่ ้ไี ปยงั ไฟลอ์ นื่ อกี ทอดหน่ึง ดังจะกล่าวต่อไปในหวั ข้อ 3.4
s หมายถึง socket เปน็ ช่องติดต่อส่ือสารกบั โปรเซสอืน่ ผา่ นระบบเครือขา่ ย
c หมายถงึ character device มกั เป็นอุปกรณภ์ ายนอกที่รับส่งข้อมลู เป็นลำดับตอ่ ๆ กัน เชน่ โมเด็ม

เมาส์ เครอื่ งพมิ พ์ เทอรม์ ินลั เทป ชอ่ งสัญญาณเสียง ฯลฯ

1โปรเซส (process) คอื โปรแกรมทีก่ ำลังทำงานอยู่ในขณะหน่ึงๆ

35

36 บทท่ี 3. เกยี่ วกับไฟล์และไดเรกทอรี

b หมายถงึ block device ไดแ้ ก่อปุ กรณ์ท่ีรับส่งข้อมูลเปน็ บลอ็ กๆ เชน่ ฮาร์ดดสิ ก์ ฟลอปปีดิสก์
ซีดีรอม แรมดิสก์

p หมายถงึ named pipe (FIFO) เปน็ ท่อสง่ ขอ้ มูลระหวา่ งโปรเซสท่ีโปรเซสหน่งึ เปิดไว้เพือ่ ให้โปรเซ
สอ่ืนในระบบสามารถรบั หรอื ส่งขอ้ มลู ได้

3.2 ระบบไฟล์บนยูนิกซ์

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

หากคณุ ค้นุ เคยกบั ระบบดอสหรอื วินโดวส์ท่ีมีหลายราก แตล่ ะรากเรมิ่ จากไดรฟ์ A: B: C: . . . ซง่ึ
แตล่ ะไดรฟ์จะหมายถงึ อปุ กรณ์เป็นตวั ๆ หรอื เป็นพาร์ทิชนั ในฮารด์ ดสิ ก์ หรอื เป็น network drive ที่
mount ผา่ น netware ละ่ ก็ คณุ จะพบแนวคดิ ท่ีตา่ งออกไปในยนู กิ ซ์

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

ไดเรกทอรีท่ีสำคญั ๆ ใน GNU/Linux ทคี่ วรทราบ ได้แก่

/boot เป็นไดเรกทอรเี ก็บไฟล์ท่ีใชบ้ ูตระบบ เคอรเ์ นลลนิ ุกซ์จะถูกเกบ็ ไว้ท่นี ่ี

/bin (binary) เป็นไดเรกทอรีเก็บโปรแกรมคำส่งั ขัน้ พ้ืนฐานของระบบ เปน็ โปรแกรมท่ีจำเป็นเพยี งพอ
สำหรับการใชง้ านระบบในกรณีท่รี ะบบไฟลส์ ว่ นอืน่ มปี ญั หา

/sbin (system admin binary) เก็บโปรแกรมคำส่งั ขน้ั พืน้ ฐานท่ีใช้สำหรบั ผู้ดูแลระบบเทา่ นัน้ เป็น
โปรแกรมท่จี ำเป็นเพียงพอสำหรบั การดแู ลแก้ไขระบบในกรณีทีร่ ะบบไฟลส์ ่วนอนื่ มีปญั หา

/lib (library) เกบ็ ไลบรารพี ืน้ ฐานท่ีโปรแกรมใน /bin และ /sbin ต้องใช้

/etc (et cetera) เดิมมีช่อื เช่นน้ีเพราะเก็บไฟล์จิปาถะของระบบ แต่การใช้งานในปจั จุบันจะเก็บการต้ัง
ค่าของระบบและของโปรแกรมต่างๆ

/usr (user) ชื่อบอกว่าเป็นไดเรกทอรีสำหรบั บริการผู้ใช้ ไดเรกทอรีน้ีใช้เกบ็ สว่ นต่างๆ ของระบบที่
จำเป็นต้องใช้ในโหมด multi-user ในระบบเก่าๆ จะบรรจุไดเรกทอรีบา้ นของผู้ใช้ด้วย แต่ปัจจบุ นั
แยกออกไปท่ี /home ต่างหาก

/usr/bin เกบ็ โปรแกรมคำส่งั ที่ใชใ้ นระบบเพิ่มเตมิ จาก /bin

/usr/sbin เกบ็ โปรแกรมคำสั่งทีใ่ ชส้ ำหรับผูด้ แู ลระบบเพ่มิ เติมจาก /sbin

/usr/lib เก็บไลบรารีต่างๆ เพิ่มเติมจาก /lib

/usr/include เก็บ header file ท่ีใชส้ ำหรับคอมไพลโ์ ปรแกรม

3.3. I-NODE 37

/usr/share เกบ็ ไฟล์ข้อมลู ทีใ่ ช้โดยโปรแกรมตา่ งๆ

/usr/local เป็นไดเรกทอรีทีม่ โี ครงสร้างคลา้ ย /usr แตใ่ ช้สำหรับการตดิ ต้งั โปรแกรมที่แยกตา่ งหาก
จากระบบตดิ ตง้ั ปกติ (เช่น คอมไพล์เองจากซอร์สโค้ดท่ีดาวน์โหลดมาตา่ งหาก) การแยกมาตดิ ตั้ง
ในทีต่ า่ งหากทำให้สะดวกตอ่ การจัดการโดยไมก่ ระทบต่อระบบติดตงั้ ปกติ

/usr/X11R6 ใช้สำหรับระบบ X Window ทั้งหมด ไมว่ า่ จะเปน็ โปรแกรม ไลบรารี ไฟล์ขอ้ มูล หรือ
เอกสารประกอบ

/tmp ไดเรกทอรีเก็บไฟลช์ ัว่ คราวสำหรับทุกคนในระบบ โดยปกตจิ ะถกู ล้างทง้ิ ทุกครัง้ ทีบ่ ตู ระบบ

/var ไดเรกทอรีเก็บขอ้ มลู ของระบบท่ีจะต้องมีการเปลีย่ นแปลงอยู่ตลอดเวลา เชน่ log file ตา่ งๆ ถงุ
เมล์ หรอื ควิ ของเครอื่ งพิมพ์ เปน็ ต้น

/dev เกบ็ ไฟล์ท่ีแทนอปุ กรณ์ทกุ อยา่ ง เปน็ ที่อยู่ของไฟล์ชนดิ character device และ block device
โดยเฉพาะ

/proc เป็นทีอ่ ยู่ของไฟล์เสมอื นท่ีใช้ตดิ ต่อกับเคอรเ์ นลลินุกซ์ ไฟล์ตา่ งๆ ในไฟล์นี้ไม่ใช่ไฟล์จรงิ แม้จะ
ปรากฏใน ls -l วา่ เป็นไฟลป์ กติก็ตาม

/home เกบ็ ไดเรกทอรบี ้านของผ้ใู ช้ทุกคน

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

3.3 i-node

หวั ขอ้ นี้จะกล่าวถงึ ลักษณะพเิ ศษอีกประการหน่ึงของระบบไฟล์ของยูนกิ ซ์ คอื ความสามารถในการ ตั้ง
ฉายา (alias) ใหก้ ับไฟล์ได้ กล่าวคือ ไฟลห์ น่ึงๆ สามารถต้ังชอ่ื ไดม้ ากกว่าหนง่ึ ชอ่ื การท่จี ะเข้าใจแนวคิดนี้
เราต้องทำความเข้าใจกบั คำวา่ i-node เสยี ก่อน

ระบบไฟล์โดยทว่ั ไปจะแยกเน้ือหาของไฟล์กบั ชือ่ ไฟล์เป็นคนละส่วนกัน แต่ยูนิกซ์มคี วามพเิ ศษเพ่มิ
ขนึ้ ตรงทีก่ ารเชือ่ มโยงระหว่างชื่อไปยงั เนอ้ื หาเป็นแบบ many-to-one (แทนทจ่ี ะเปน็ one-to-one) กลา่ วคอื
ในขณะที่การอา้ งถงึ ชอ่ื หน่ึงๆ จะหมายถงึ เนอ้ื หาไฟล์เพยี งหน่ึงเทา่ น้นั แต่เนอ้ื หาไฟล์หน่ึงๆ สามารถอา้ ง
มาจากช่อื ได้หลายชอ่ื

ตวั เน้อื หาของไฟล์ทกุ ช้ินจะมีหมายเลข i-node ประจำ ระเบียนชอ่ื ไฟล์ในไดเรกทอรีจะเชอ่ื มโยงไปยงั
ค่า i-node ที่เปน็ เนื้อหา เป็นการเช่อื มโยงในทิศทางเดยี ว ซ่ึงทำให้ i-node หนึ่งๆ สามารถถกู เชอ่ื มโยง
จากชื่อไฟล์ได้หลายช่ือ (ในขณะที่ระเบยี นช่ือไฟล์ชอื่ หนึ่งจะเก็บคา่ i-node เพียงค่าเดยี ว) ท่ีตวั i-node
เองก็จะเกบ็ reference count ไว้ว่ามีการเช่ือมโยงมายังตวั มนั เองเป็นจำนวนเทา่ ไร การลบไฟล์ในยูนกิ ซ์
จะหมายถงึ การ unlink โดยตัดการเช่อื มโยงน้ี และลดค่า reference count ใน i-node ลงหน่งึ เม่อื ใดท่ี
reference count ถกู ลดลงเหลือศูนย์ i-node จึงจะถกู ลบออกจากดสิ ก์จรงิ

คำสั่ง ls -l จะแสดงจำนวนลงิ กข์ องไฟลด์ งั กล่าวในคอลัมนท์ ี่สอง

thep@anubis:~$ ls -l users 4815 2002-08-23 14:49 a.out
total 28
-rwxr-xr-x 1 thep

38 บทที่ 3. เกย่ี วกับไฟล์และไดเรกทอรี

drwxr-xr-x 2 thep users 4096 2002-08-23 14:48 Download
-rw-r--r-- 1 thep users 77 2002-08-23 14:49 hello.c
drwxr-xr-x 2 thep users
drwxr-xr-x 2 thep users 4096 2002-08-23 14:48 Mail
drwxr-xr-x 2 thep users 4096 2002-08-23 14:48 Projects
4096 2002-08-23 14:48 tmp

จากตัวอย่างข้างตน้ จะเห็นว่าไฟล์ปกติ คือ a.out และ hello.c โดยปกตจิ ะมีจำนวนลิงกเ์ ป็น 1
และเมื่อสงั่ ลบด้วยคำสงั่ rm ก็จะเปน็ การลดจำนวนลิงก์นี้ลงหน่งึ กลายเปน็ ศนู ย์ และ i-node ของไฟล์ก็
จะถกู ลบจากฮารด์ ดิสกท์ นั ที การเชอ่ื มโยงไฟล์ปกติเข้ากับช่ือมากกว่าหนง่ึ ทำได้ด้วยการสร้าง hard link
ด้วยคำส่งั ln ซึ่งจะกล่าวในหัวขอ้ 3.4

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

thep@anubis:~$ ls -ld 4096 2002-08-23 14:28 .
drwxr-xr-x 6 thep users

อนึง่ หากต้องการดหู มายเลข i-node ของแตล่ ะไฟล์ คณุ กเ็ พยี งระบุตวั เลือก -i ให้กบั คำสง่ั ls

thep@anubis:~$ ls -i

204580 a.out 204583 hello.c 142158 Projects
142159 tmp
142156 Download 142157 Mail

3.4 การลิงก์ไฟล์

ดงั ท่ีได้กลา่ วไปแล้ว ว่าไฟล์บนยนู ิกซส์ ามารถมชี ่อื ได้มากกวา่ หน่ึงช่อื โดยอาศัยการเชอ่ื มโยง อย่างไรกต็ าม
การเช่ือมโยงไฟล์ไม่จำเปน็ ต้องใช้ i-node ร่วมเสมอไป วิธีเชื่อมโยงมีอยู่ 2 ลักษณะ คอื

1. hard link ไดแ้ ก่การเชอื่ มโยงโดยฝงั ในโครงสร้างของระบบไฟล์โดยตรง เป็นการเพ่มิ ช่ือใหม่ให้
กบั ไฟล์ โดยท่ีท้งั ไฟล์เกา่ และไฟล์ใหม่จะมีฐานะของความเป็นไฟล์เทา่ ๆ กัน ในทางเทคนคิ ก็คือ ไฟล์ท้ัง
สองจะใช้ i-node ร่วมกนั หรือถา้ จะกล่าวให้ละเอียดกวา่ นนั้ ก็คือ ไฟล์ทั้งสองจะเป็น entry ที่ต่างกันใน
ไดเรกทอรี แต่ชี้ไปยัง i-node เดยี วกัน การสรา้ ง hard link จะเพมิ่ reference count ใน i-node ท่ีถูก
เชื่อมโยงน้นั และทุกครั้งท่ีลบไฟล์ reference count จะถูกลดลง และ i-node น้ันจะถกู ลบออกไปจาก
ดสิ กจ์ ริงๆ เมือ่ reference count ลดลงเหลือศูนย์

2. symbolic link หรือท่ีเรียกสนั้ ๆ ว่า symlink จะเป็นการเชื่อมโยงผา่ นไฟล์ชนดิ พเิ ศษท่ีเกบ็ ชอ่ื
ของไฟล์ท่ีเช่อื มโยงไปหาอกี ต่อหนึง่ เม่อื มีการอ้างถงึ ไฟลท์ ่ีเปน็ symlink เพ่ือการอ่านหรือเขียน ยนู ิกซ์จะ
อ่านช่ือไฟล์ท่ีเชอ่ื มโยงแล้วอา้ งไปถงึ ชอื่ นนั้ ๆ แทน ดังนนั้ symlink จงึ ไม่ได้มีฐานะเปน็ ไฟล์ที่เก็บขอ้ มูล
ด้วยตัวของมนั เอง แตเ่ ป็นเพยี งตวั ช้ไี ปหาไฟล์อ่ืนเท่านัน้

โดยปกติจะไม่สามารถทำ hard link กบั ไดเรกทอรี และไม่สามารถทำ hard link ข้ามอปุ กรณ์ได้
(เช่น ไม่สามารถทำ hard link ข้ามไดเรกทอรีท่ีอยู่ในฮาร์ดดสิ กค์ นละพาร์ทชิ นั ได้ และไมส่ ามารถทำ hard
link จากไฟลใ์ นซดี ีรอมลงมาทฮ่ี าร์ดดสิ กไ์ ด้ เปน็ ต้น) แต่สามารถทำ symlink ได้

3.4. การลิงก์ไฟล์ 39

คำสัง่ สำหรับเชือ่ มโยงไฟล์ทัง้ แบบ hard link และ symlink ใช้คำส่ังเดยี วกนั คือ ln (link) โดยหาก
ไม่ระบุตัวเลือกใดเลยจะหมายถงึ hard link และถา้ ระบุตวั เลอื ก -s จะหมายถึง symlink สว่ นรปู แบบ
การสง่ คา่ ก็จะเหมอื นคำสัง่ cp คือชือ่ ไฟล์ตน้ ฉบบั มากอ่ นช่อื ไฟลป์ ลายทางทจี่ ะสร้างใหม่

ตวั อยา่ งเช่น มไี ฟล์ a ซึ่งมลี ักษณะดังน้ี

thep@anubis:~ $ ls -li users 6 2002-09-22 20:46 a
total 8

125565 -rw-r--r-- 1 thep
thep@anubis:~$ cat a
hello

เมอ่ื ทำ hard link b ให้ชีม้ ายงั เน้อื หาเดียวกบั a

thep@anubis:~$ ln a b users 6 2002-09-22 20:46 a
thep@anubis:~$ ls -li users 6 2002-09-22 20:46 b
total 8

125565 -rw-r--r-- 2 thep
125565 -rw-r--r-- 2 thep

สงั เกตวา่ ท้งั a และ b มีหมายเลข i-node เดียวกัน คือ 125565 และจำนวนลิงก์ ของ a ถกู เพิ่ม
จาก 1 เปน็ 2 และจำนวนลิงก์ของ b ก็เทา่ กบั 2 เชน่ กนั (เพราะมาจาก i-node เดียวกนั )

เม่อื เปลีย่ นแปลงเน้ือหาของไฟล์ b ก็จะเหน็ วา่ a ก็เปล่ียนตามดว้ ย (เพราะใช้ i-node เดยี วกนั )

thep@anubis:~$ echo bye > b
thep@anubis:~$ cat a
bye

รวมทัง้ การเปลีย่ น permission (เพราะ permission เป็นคณุ สมบตั ิประจำ i-node)

thep@anubis:~$ chmod a+w b users 4 2002-09-22 20:50 a
thep@anubis:~$ ls -li users 4 2002-09-22 20:50 b
total 8

125565 -rw-rw-rw- 2 thep
125565 -rw-rw-rw- 2 thep

และเมื่อลบ a จำนวนลงิ ก์ของ b กจ็ ะลดลงหนง่ึ

thep@anubis:~ $ rm a users 4 2002-09-22 20:50 b
thep@anubis:~ $ ls -li
total 4

125565 -rw-rw-rw- 1 thep

ในขณะท่ถี า้ ทำ symlink c ให้ชี้มายัง b

40 บทที่ 3. เก่ียวกบั ไฟลแ์ ละไดเรกทอรี

thep@anubis:~$ ln -s b c users 4 2002-09-22 20:50 b
thep@anubis:~$ ls -li users 1 2002-09-22 21:10 c -> b
total 4

125565 -rw-rw-rw- 1 thep
127799 lrwxrwxrwx 1 thep

จะเหน็ ว่า c เป็นไฟลใ์ หม่ทใี่ ช้คนละ i-node กับ b โดยเป็นไฟลช์ นิด symlink ท่ีเกบ็ ชื่อ “b” (สังเกต
วา่ ขนาดของ c เทา่ กับ 1 คอื เท่ากับความยาวของช่ือ “b” ที่มันเก็บ) และสังเกตวา่ จำนวนลิงก์ของ b
ไม่ได้เพมิ่ เหมอื นตอนทส่ี ร้าง hard link

และการเปลี่ยนแปลงใดๆ ใน c ก็จะมีผลกับ b ดว้ ยเช่นกัน

thep@anubis:~$ echo hi > c
thep@anubis:~$ cat b
hi

รวมทัง้ การเปลี่ยน permission

thep@anubis:~ $ chmod go-w c users 4 2002-09-22 20:50 b
thep@anubis:~ $ ls -li users 1 2002-09-22 21:10 c -> b
total 4

125565 -rw-r--r-- 1 thep
127799 lrwxrwxrwx 1 thep

แต่สังเกตวา่ permission ของ c เองไม่มีความหมาย และจะแสดงเป็น lrwxrwxrwx เสมอ
ทัง้ น้เี พราะมนั ไมไ่ ดเ้ ปน็ เจ้าของ i-node ของไฟลท์ ีอ่ า้ งถงึ เองนน่ั เอง

โดยปกติแลว้ ในชีวิตประจำวันเรามักจะใช้ symlink มากกว่า hard link ด้วยเหตุผลหลายประการ
เชน่

• ไมส่ ามารถทำ hard link กับไดเรกทอรีได้
• ไมส่ ามารถทำ hard link ข้าม device ได้
• symlink สามารถมองเห็นได้งา่ ยผ่านคำสง่ั ls ธรรมดา ทำให้จดั การได้ง่าย
อยา่ งไรก็ดี ปัญหาที่คุณอาจจะพบเมือ่ ใช้ symlink กค็ ือ ปัญหา broken link เมอ่ื ไฟลต์ ้นฉบับถกู ลบ

thep@anubis:~$ rm b 1 2002-09-22 21:10 c -> b
thep@anubis:~$ ls -l
total 0

127799 lrwxrwxrwx 1 thep user
thep@anubis:~$ cat c
cat: c: No such file or directory

3.5. ตรวจสอบการใช้เนื้อทดี่ สิ ก์ 41

3.5 ตรวจสอบการใช้เนือ้ ที่ดิสก์

วา่ กันวา่ ฮารด์ ดสิ ก์เป็นทรัพยากรทม่ี เี ทา่ ไรกไ็ มเ่ คยพอ ไมว่ ่าจะเป็นสมัย 40 MB หรือ 40 GB ฮารด์ ดสิ ก์
ของคณุ จะถกู ใช้จนเต็มเสมอ แนน่ อน คุณตอ้ งการเคลยี ร์เนอื้ ทีส่ กั หน่อย คณุ สามารถตรวจสอบเน้ือทีว่ ่าง
ของดสิ กต์ า่ งๆ ทถี่ กู ใชใ้ นระบบไดด้ ้วยคำสั่ง df (disk free)

thep@anubis:~$ df

Filesystem 1K-blocks Used Available Use% Mounted on
3548548 188696 95% /
/dev/hda2 3937252 18236840 37008 100% /home

/dev/hda5 19251804

คอลมั น์ตา่ งๆ มคี วามหมายตามหวั ตาราง ในท่ีน้ีมอี ุปกรณท์ ่ใี ช้เก็บข้อมลู สองตัว คอื
1. /dev/hda2 คือฮารด์ ดิสก์ IDE primary master, primary partition ที่ 2 mount ไว้ท่ี / หรือ
รากของระบบไฟล์ มีขนาดทงั้ หมด 3,937,252 KB (หรอื 3.8 GB) ใช้ไปแล้ว 3,548,548 KB
(หรอื 3.4 GB) เหลอื 188,696 KB (หรอื 185 MB) ใชเ้ นอื้ ที่ไปคดิ เปน็ 95% โดยประมาณ
2. /dev/hda5 คอื ฮาร์ดดิสก์ IDE primary master, logical partition ที่ 1 mount ไวท้ ี่ /home
มขี นาดทั้งหมด 19,251,804 KB (หรอื 19 GB) ใชไ้ ปแลว้ 18,236,840 KB (หรือ 18 GB) เหลือ
37,008 KB หรือ 37 MB ใชเ้ นื้อทไี่ ปคดิ เปน็ 100% โดยประมาณ
คณุ อาจใช้ตวั เลอื ก -h เพอ่ื แสดงขนาดตา่ งๆ ในรูปแบบท่ีอา่ นงา่ ย แทนการแสดงเป็นจำนวนบล็อก

(ตวั เลอื ก -h ในคำสงั่ เกยี่ วกบั เน้อื ที่ดสิ กเ์ ปน็ ความสามารถพิเศษของ GNU ทเี่ พ่ิมเติมจากยูนิกซท์ ่ัวไป)

thep@anubis:~$ df -h

Filesystem Size Used Avail Use% Mounted on

/dev/hda2 3.8G 3.4G 185M 95% /

/dev/hda4 19G 18G 37M 100% /home

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

thep@anubis:~$ ls -l users 4815 2002-08-23 14:49 a.out
total 28 users 4096 2002-08-23 14:48 Download
-rwxr-xr-x 1 thep users
drwxr-xr-x 2 thep users 77 2002-08-23 14:49 hello.c
-rw-r--r-- 1 thep users 4096 2002-08-23 14:48 Mail
drwxr-xr-x 2 thep users 4096 2002-08-23 14:48 Projects
drwxr-xr-x 2 thep 4096 2002-08-23 14:48 tmp
drwxr-xr-x 2 thep

บรรทัด “total 28” นั้น แสดงจำนวนบล็อก (ในทน่ี ี้บล็อกมีขนาด 1 KB) ที่ไดเรกทอรีปัจจบุ ันใช้
ทัง้ หมด แต่ไมไ่ ด้รวมเนอื้ ทตี่ า่ งๆ ในไดเรกทอรีย่อย

เครื่องมือตรวจสอบการใชเ้ นอื้ ท่ีที่มีประสิทธภิ าพกว่าคอื คำส่ัง du (disk usage) ซงึ่ จะนับเน้อื ท่ี
ทั้งหมดในไดเรกทอรยี ่อยด้วย

42 บทท่ี 3. เกย่ี วกับไฟล์และไดเรกทอรี

thep@anubis:~$ du
6064 ./Download/nautilus
956 ./Download/metatheme
1700 ./Download/gtk2
8760 ./Download/gdm
928 ./Download/icon
316 ./Download/metacity
18728 ./Download
4 ./Mail
4 ./Projects
4 ./tmp
18756 .

หรือคณุ สามารถใช้ตวั เลือก -h เพอ่ื ขอดูผลลัพธแ์ บบเข้าใจงา่ ย

thep@anubis:~$ du -h
6.0M ./Download/nautilus
956K ./Download/metatheme
1.7M ./Download/gtk2
8.6M ./Download/gdm
928K ./Download/icon
316K ./Download/metacity
19M ./Download
4.0K ./Mail
4.0K ./Projects
4.0K ./tmp
19M .

ตัวเลือก -s ของ du จะแสดงค่าสรุปของไดเรกทอรีปจั จบุ นั เทา่ นน้ั

thep@anubis:~$ du -sh
19M .

บทท่ี

4

เคร่อื งมือประมวลผลไฟล์

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

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

4.1 การเปล่ยี นทศิ ทางขอ้ มลู

โปรแกรมบนยูนกิ ซ์ทุกโปรแกรมจะมีช่องทางติดต่อกับอปุ กรณ์มาตรฐานสามอย่าง คอื standard in-
put สำหรับรับข้อมูลเขา้ , standard output สำหรับแสดงผลลพั ธ์ และ standard error สำหรับแสดง
ขอ้ ผดิ พลาด

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

การเปลีย่ นทศิ ทางขอ้ มลู (redirection) สำหรบั standard input และ standard output ในเชลลต์ า่ งๆ
บนยูนิกซ์ จะใชเ้ คร่ืองหมาย < > >> ดงั นี้
command < file เปลี่ยน standard input ใหม้ ารบั ขอ้ มูลจาก file
command > file เปลี่ยน standard output ให้แสดงผลลัพธ์ออกทาง file โดยเขยี นทบั เน้อื หา

43

44 บทท่ี 4. เครือ่ งมือประมวลผลไฟล์

เดิมถ้ามีอยู่ ถ้ายังไม่มีกจ็ ะสร้างไฟลใ์ หม่
command >> file เปลี่ยน standard output ให้แสดงผลลัพธ์ออกทาง file โดยเขยี นต่อทา้ ย

เนือ้ หาเดิมถ้ามอี ยู่ ถา้ ยงั ไมม่ ีกจ็ ะสรา้ งไฟล์ใหม่
สำหรบั การเปลย่ี นทศิ ทาง standard error นั้น ออกจะตา่ งกนั ไปในเชลล์แต่ละชนิด ถา้ คุณใชเ้ ชลล์ใน
ตระกูลเดียวกับ Bourne Shell (sh) เชน่ Korn Shell (ksh) Zsh (zsh) หรอื Bourne Again Shell
(bash คือเชลลท์ ใี่ ช้เปน็ เชลลห์ ลักใน GNU/Linux น่ันเอง) จะใชร้ ปู แบบ command 2> file และ
command 2>> file คล้ายกบั การเปลยี่ นทิศทาง standard output1 ระวังว่า “2>” และ “2>>”
น้นั เขียนตดิ กนั หมด ไมม่ ชี อ่ งว่างค่นั ระหวา่ ง 2 และ >
สว่ นเชลล์ในตระกลู เดียวกบั C Shell (csh) เช่น TENEX C Shell (tcsh) จะมีเพียงวิธีเปลยี่ น
ทศิ ทาง standard error ให้ออกยังไฟล์เดียวกับ standard output เท่านั้น ไม่สามารถเปลี่ยนทิศทาง
แยกกนั โดยตรงได้2 รปู แบบท่ใี ชค้ อื command >& file และ command >>& file
เห็นความสามารถในการเปลีย่ นทิศทาง standard error ออกทางไฟล์เดียวกับ standard output
ของ C Shell แลว้ คุณอาจเกิดคำถามขึน้ บ้างวา่ จะทำเช่นนน้ั ใน bash ท่ีคณุ กำลังใช้ใน GNU/Linux
อยา่ งไร เพราะคงมีบอ่ ยครั้งท่ีคณุ อยากจะโยนทกุ ส่งิ ทุกอย่างที่ปรากฏบนจอภาพลงไฟล์ ทงั้ ผลลัพธ์และ
ขอ้ ผดิ พลาด ท่แี น่ๆ คือ คุณทำเช่นนีไ้ มไ่ ด้

thep@anubis:~$ ls -R /root
log Mail minicom.log XF86Config.new
ls: /root/Mail: Permission denied
thep@anubis:~$ ls -R /root > res 2> res
thep@anubis:~$ cat res
ls: /root/Mail: Permission denied
nfig.new

เพราะผลลัพธ์จะปนกนั เนือ่ งจากการเขยี นทับกันไปมาผ่านไฟล์ท่เี ปิดแยกกัน จึงไม่เปน็ ลำดบั เหมือนทเ่ี คย
ปรากฏบนจอ เราจำเป็นต้องทำให้ standard output และ standard error กลายเป็นไฟล์เดียวกันใน
มุมมองของโปรแกรม ซงึ่ รูปแบบการสัง่ การเช่นน้ันใน bash และเชลล์ในตระกูลเดยี วกัน คอื 2>&1

thep@anubis:~$ ls -R /root > res 2>&1
thep@anubis:~$ cat res
/root:
log
Mail
minicom.log
XF86Config.new
ls: /root/Mail: Permission denied

ความหมายของ “2>&1” ก็คือ ให้ file descriptor 2 เปล่ยี นทิศทางออกทางไฟล์เดียวกับ file
descriptor 1 ซงึ่ ก็คือ ให้ standard error ออกทางไฟลเ์ ดยี วกับ standard output น่นั เอง (รปู แบบ

1เลข 2 ใน 2> และ 2>> มาจากคา่ file descriptor ที่โปรแกรมทกุ โปรแกรมในยนู ิกซ์ใช้ตดิ ตอ่ กับ standard error โดยคา่
0 หมายถึง standard input และค่า 1 หมายถงึ standard output แต่จะไม่มีรูปแบบ 0< 1> หรอื 1>> มีเพียง standard error
เทา่ นัน้ ท่ใี ช้

2อยา่ งไรก็ดี มวี ธิ ีแกข้ ดั อยู่ทางหนง่ึ คือ (command > file1) >& file2

4.1. การเปลีย่ นทิศทางข้อมูล 45

น้ีสามารถใช้กบั file descriptor คา่ อื่นท่ีมากกว่า 2 ได้อีกดว้ ย แต่เร่ืองน้ีอยู่นอกเหนือขอบเขตของ
ยูนกิ ซ์พน้ื ฐานเล่มนี้)

รปู แบบสดุ ท้ายของการเปลี่ยนทศิ ทางข้อมูลกค็ อื การป้อน input ในบรรทัดคำสง่ั เลย (เรียกวา่ here-
document) โดยใชร้ ูปแบบ

command << delimitor
... here-document ...
delimitor

โดยที่ delimitor คือขอ้ ความท่ีใช้จบเอกสาร ขอ้ ความทกุ บรรทดั ก่อนบรรทดั นี้จะถูกป้อนเขา้ ทาง
standard input ของ command โดยตรง

thep@anubis:~$ cat << EOF
> At $HOME, I saw this poetry:
>
> A keeper who worked at the zoo,
> Was given a gnu to see to;
> He cries: ‘That’s the gnu
> That I knew at Bellevue --
> I knew that I knew that new gnu.’
> EOF
At /home/thep, I saw this poetry:

A keeper who worked at the zoo,
Was given a gnu to see to;

He cries: ‘That’s the gnu
That I knew at Bellevue --
I knew that I knew that new gnu.’
thep@anubis:~$

สงั เกตว่า $HOME ซง่ึ เปน็ ตวั แปรระบบจะถกู แทนคา่ เหมือนบรรทัดคำสง่ั ปกติ ถ้าไม่ต้องการให้เชลล์แทน
ค่า คณุ ต้องใส่เคร่ืองหมายคำพดู (ค่หู รอื เดี่ยวก็ได้) ครอ่ ม delimitor ทีต่ ำแหน่งเรมิ่

thep@anubis:~$ cat << "EOF"
> At $HOME, I saw this poetry:
> ...
> EOF
At $HOME, I saw this poetry:
...
thep@anubis:~$

46 บทท่ี 4. เคร่ืองมือประมวลผลไฟล์

4.2 เชือ่ มคำสง่ั ดว้ ย pipe

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

การเชื่อมทอ่ ในคำส่งั เชลลม์ รี ปู แบบดังนี้

command1 | command2 | ...

ผลกค็ ือ standard output ของ command1 จะถกู เชื่อมตรงเข้ากับ standard input ของ command2
และหากมีคำสง่ั เช่ือมทอ่ ตอ่ จาก command2 อกี ก็จะมกี ารเช่อื มในลักษณะเดียวกันกับคำสง่ั ถดั ๆ ไป

ดว้ ยกลไกการทำงานเช่นน้ี คำสัง่ แตล่ ะคำสั่งในยนู ิกซ์จะทำงานง่ายๆ คือ อ่านข้อมูลเขา้ ทาง standard
input ประมวลผล เขยี นผลลพั ธ์ออกทาง standard output และแสดงขอ้ ผดิ พลาดออกทาง standard
error เทา่ น้นั ไม่ตอ้ งมี interface ซบั ซ้อน จากนัน้ ผู้ใช้จะเปน็ ผู้ประกอบคำสง่ั ต่างๆ เขา้ ด้วยกันเองตาม
ความต้องการ

เราไดเ้ ห็นตวั อย่างของการใช้ pipe ไปบา้ งแลว้ เมอื่ พดู ถึงการใช้ more

thep@anubis:~$ ls -l /bin | more

total 2872

-rwxr-xr-x 1 root root 47464 2002-08-04 03:15 afio

-rwxr-xr-x 1 root root 2724 2002-01-27 14:05 arch

-rwxr-xr-x 1 root root 579816 2002-09-12 05:51 bash

-rwxr-xr-x 1 root root 13864 2002-08-04 16:10 cat

-rwxr-xr-x 1 root root 16232 2002-09-01 20:39 chgrp

-rwxr-xr-x 1 root root 16008 2002-09-01 20:39 chmod

-rwxr-xr-x 1 root root 18120 2002-09-01 20:39 chown

-rwxr-xr-x 1 root root 42664 2002-09-01 20:39 cp

-rwxr-xr-x 1 root root 47656 2002-06-23 03:09 cpio

-rwxr-xr-x 1 root root 82248 2002-09-14 19:32 dash

-rwxr-xr-x 1 root root 34408 2002-09-01 20:40 date

-rwxr-xr-x 1 root root 28808 2002-09-01 20:39 dd

-rwxr-xr-x 1 root root 26184 2002-09-01 20:39 df

-rwxr-xr-x 1 root root 59496 2002-09-01 20:39 dir

-rwxr-xr-x 1 root root 4076 2002-01-27 14:05 dmesg

-rwxr-xr-x 1 root root 11080 2002-09-01 20:40 echo

-rwxr-xr-x 1 root root 43292 2000-11-27 09:05 ed

--More--

และเราจะได้เหน็ ประโยชนข์ อง pipe มากข้นึ อกี เม่ือได้กล่าวถึงคำสง่ั ตัวกรองตา่ งๆ

4.3. ตวั กรอง 47

4.3 ตัวกรอง

ความสามารถเรอื่ งการเปล่ยี นทิศทางข้อมูลหรอื pipe จะไม่มีประโยชน์อะไรมากนกั ถ้าขาดโปรแกรมคำสัง่
สำหรบั งานต่างๆ มารองรับ เปรียบเสมือนโรงงานทมี่ ีแตส่ ายพาน แตข่ าดเครื่องจักรนัน่ เอง ในหวั ข้อน้เี รา
จะมาทำความรูจ้ ักกับโปรแกรมตวั กรอง (filter) ต่างๆ บางส่วนของท่ีมีในยูนิกซท์ ค่ี ุณสามารถหยิบมาใช้ได้

4.3.1 head

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

คำส่ัง head – แสดงสว่ นตน้ ของไฟล์

รปู แบบ head [ตัวเลอื ก] [file]

คำบรรยาย แสดงสว่ นตน้ ของไฟล์ file ถ้าไม่ระบุ file จะแสดงข้อมลู จาก standard input

ตัวเลอื ก -n แสดงผล n บรรทดั แรก (หากไม่ระบุ จะแสดง 10 บรรทัดแรก)
-c n แสดงผล n ไบต์แรก

ตัวอย่างเช่น เม่ือคุณจะหาไฟลท์ ใ่ี หญท่ ่สี ุด 10 ไฟลแ์ รกในไดเรกทอรีของคุณ:

thep@anubis:~$ ls -S /bin | head
bash
tcsh
tar
netstat
dash
mount
dir
ls
vdir
ps

4.3.2 tail

นอกจากจะดูเฉพาะตน้ ไฟล์ คณุ สามารถขอดเู ฉพาะท้ายไฟลก์ ็ไดเ้ ชน่ กนั ด้วยคำสั่ง tail

คำสั่ง tail – แสดงสว่ นทา้ ยของไฟล์
รูปแบบ tail [ตัวเลือก] [file]
คำบรรยาย แสดงสว่ นท้ายของไฟล์ file ถา้ ไมร่ ะบุ file จะแสดงขอ้ มลู จาก standard input

48 บทที่ 4. เคร่อื งมือประมวลผลไฟล์

ตัวเลอื ก -n แสดงผล n บรรทัดสุดท้าย (หากไมร่ ะบุ จะแสดง 10 บรรทดั สดุ ทา้ ย)
-c n แสดงผล n ไบต์สุดทา้ ย
-f รอแสดงผลแบบทันทเี มื่อไฟล์ถกู เขียนตอ่ ทา้ ย

ตวั อยา่ งเช่น ถ้าจะดู error log รายการล่าสุดจาก log file:

thep@anubis:~$ tail -6 /var/log/httpd/error log
[Fri Sep 20 19:57:15 2002] [error] [client 203.185.2.14] File
does not exist: /var/www/html/d/winnt/system32/cmd.exe
[Fri Sep 20 19:57:19 2002] [error] [client 203.185.2.14] File
does not exist: /var/www/html/scripts/..%5c../winnt/system32/c
md.exe
[Fri Sep 20 19:57:19 2002] [error] [client 203.185.2.14] File
does not exist: /var/www/html/_vti_bin/..%5c../..%5c../..%5c
../winnt/system32/cmd.exe
[Fri Sep 20 19:57:29 2002] [error] [client 203.185.2.14] File
does not exist: /var/www/html/_mem_bin/..%5c../..%5c../..%5c..
/winnt/system32/cmd.exe
[Fri Sep 20 19:57:30 2002] [error] [client 203.185.2.14] File
does not exist: /var/www/html/msadc/..%5c../..%5c../..%5c/..x.
./..x../..x../winnt/system32/cmd.exe
[Fri Sep 20 19:57:34 2002] [error] [client 203.185.2.14] File
does not exist: /var/www/html/scripts/..../winnt/system32/cmd
.exe

ตวั เลือก -f มีประโยชนม์ ากในการดู log file ท่ีมีการเพ่มิ ขอ้ มลู ตอ่ ทา้ ยอยู่ตลอดเวลา โดยจะตดิ ตาม
ขนาดของไฟล์และแสดงข้อความท่ีเพิม่ ท่ีท้ายไฟล์ทนั ทีทไี่ ฟล์เปลีย่ นขนาด ช่วยในการตดิ ตาม error log
ของเซิร์ฟเวอร์แบบทันเหตุการณไ์ ด้เปน็ อย่างดี

4.3.3 grep

คำสงั่ หนงึ่ ที่ใช้บอ่ ยมากในยนู กิ ซ์คอื คำสง่ั ค้นหาข้อความในไฟล์ ได้แก่คำสงั่ grep คณุ ไม่จำเปน็ ต้องเปดิ
พจนานกุ รมหาความหมายของมนั หรอก เพราะมนั คือตัวย่อของ Global Regular Expression Print
กลา่ วคอื เปน็ คำส่ังทีใ่ ช้พมิ พบ์ รรทัดท่มี ขี อ้ ความที่เข้ากับรูปแบบ regular expression ที่กำหนด3

3ทม่ี าของช่ือ grep กค็ ือ คำสั่งค้นคำใน line editor ของยูนิกซ์เชน่ ed, ex รวมทง้ั full screen editor ทส่ี ามารถใชค้ ำสง่ั
ของ ex ได้อย่าง vi ซ่ึงมรี ูปแบบเปน็

g/re/p

โดยที่ g คอื คำส่งั global สำหรับกระทำทง้ั เอกสาร re หมายถึง regular expression และ p (print) เปน็ คำส่ังท่ีให้กระทำกบั
บรรทดั ท่ี match ด้วยการพมิ พ์ออกทางจอภาพ

4.3. ตัวกรอง 49

คำส่ัง grep – แสดงบรรทดั ทมี่ ขี อ้ ความเขา้ กบั รปู แบบท่ีกำหนด

รปู แบบ grep [ตัวเลือก] {pattern|-e pattern} [file . . . ]

คำบรรยาย แสดงบรรทัดทมี่ ีขอ้ ความท่ีเขา้ กบั regular expression pattern

ตัวเลอื ก -e pattern ใช้เมื่อ pattern ข้ึนต้นดว้ ย ‘-’
-c นบั บรรทัดแตไ่ มแ่ สดงบรรทัด
-h ไม่แสดงช่อื ไฟล์
-H บงั คบั แสดงชอ่ื ไฟลเ์ สมอ
-i อกั ษรตัวใหญ่ตัวเลก็ ถือว่าไม่ต่างกนั
-l แสดงแต่ช่ือไฟล์ที่ match
-L แสดงแตช่ ื่อไฟลท์ ่ีไม่ match
-n แสดงหมายเลขบรรทัดด้วย
-o แสดงเฉพาะข้อความที่ match แทนการแสดงทั้งบรรทัด
-v หาบรรทดั ทไี่ ม่ตรงกบั pattern แทน

คำว่า “regular expression” หากพดู เป็นภาษาคณิตศาสตรก์ ็หมายถึงรปู แบบท่แี ทนเซ็ตของขอ้ ความ
เซต็ หนงึ่ ซ่งึ ขอ้ ความใดๆ ทีอ่ ยู่ในเซต็ นี้ถือว่า “เขา้ กนั ได้” (match) กบั regular expression นั้น รปู แบบ
การเขยี น regular expression จะแบ่งเป็นสว่ นกำหนดเซต็ ของอกั ขระท่ีจะ match กับโอเปอเรเตอร์

สว่ นของการกำหนดเซต็ ของอกั ขระท่ีจะ match ไดแ้ ก่
1. ตัวอักษร เป็นเซ็ตที่ง่ายท่ีสดุ อักษรทกุ ตัวและตัวเลขเปน็ regular expression ที่ match กบั ตวั
มนั เอง โดยถา้ อกั ขระนั้นๆ เปน็ เครือ่ งหมายพเิ ศษท่ีมีความหมายใน regular expression จะต้อง escape
ดว้ ยการเขียน backslash (\) นำหนา้
2. จดุ ‘.’ จะ match กับอักขระใดๆ กไ็ ด้หนึง่ ตวั
3. วงเล็บเหลย่ี ม กลุ่มของตวั อักษรท่ีครอบดว้ ยวงเลบ็ เหลี่ยม จะ match กับอักษรใดก็ได้ในชดุ นัน้
หนึง่ ตวั เชน่ [abc] จะ match กับ a หรอื b หรอื c ก็ได้

การลิสต์อักขระสามารถเขยี นเปน็ ช่วงได้โดยใช้ ‘-’ กไ็ ด้ เช่น เชน่ [a-z] จะ match กบั อกั ขระ
ใดก็ได้ต้ังแต่ a ถงึ z หน่ึงตัว [a-zA-Z0-9] จะ match กบั อักษรภาษาอังกฤษท้ังหมดและตวั เลขอา
รบิกทกุ ตัว

หากอักขระแรกของเซ็ตเป็น circumflex (^) จะเป็นเซต็ นเิ สธ คือจะ match กบั อกั ขระใดๆ ที่
ไม่อยูใ่ นเซ็ตที่กำหนด เช่น [^0-9] จะ match กับอกั ขระใดๆ ทไี่ ม่ใช่ตวั เลขอารบิก ถ้าคณุ ต้องการเขียน
เซ็ตท่มี ี ^ กส็ ามารถเขยี นไดโ้ ดยไม่ลิสต์มันเปน็ ตวั แรก และถ้าต้องการเขยี นเซ็ตท่มี ี ] กเ็ ขียนโดยลิสตม์ ัน
เปน็ ตวั แรกของเซ็ต

สว่ นของโอเปอเรเตอร์ ได้แก่
1. ดอกจนั ‘*’ เมือ่ เขียนต่อทา้ ยเซ็ตจะหมายถึงการซ้ำของเซต็ นน้ั ตง้ั แต่ 0 ครงั้ ข้นึ ไป เชน่
• a* จะ match กบั ขอ้ ความวา่ งเปลา่ หรือ a หรือ aa . . .
• a[0-9]* จะ match กับ a หรอื a ทต่ี ามดว้ ยเลขอารบิกกต่ี วั ก็ได้
2. circumflex ‘^’ เมอ่ื เขียนท่ีตน้ regular expression จะหมายถึงการ match กับข้อความที่ต้น
บรรทัด เช่น ^Richard จะ match กบั บรรทัดทขี่ ้นึ ตน้ ด้วย Richard
3. dollar ‘$’ เม่ือเขียนท่ที ้าย regular expression จะหมายถึงการ match กบั ข้อความทีท่ า้ ยบรรทดั
เชน่ Bazaar$ จะ match กับบรรทัดท่ลี งท้ายด้วย Bazaar

50 บทท่ี 4. เครื่องมือประมวลผลไฟล์

สมมติวา่ คุณต้องการหาช่อื ไดเรกทอรีย่อยทง้ั หมดในไดเรกทอรีปจั จบุ นั ก็สามารถทำได้โดยสงั่
“ls -l” แลว้ เลือกเอาเฉพาะบรรทัดทขี่ นึ้ ต้นด้วย ‘d’

thep@anubis:~$ ls -l | grep ^d 4096 2003-06-30 21:38 Download
drwxr-xr-x 8 thep users 4096 2003-06-30 14:58 Mail
drwxr-xr-x 2 thep users 4096 2003-07-01 22:19 Projects
drwxr-xr-x 2 thep users 4096 2003-07-01 22:19 tmp
drwxr-xr-x 2 thep users

หรอื จะหาบรรทัดท่ลี งทา้ ยดว้ ย slash (/) ในผลลพั ธข์ อง “ls -F” กไ็ ด้

thep@anubis:~$ ls -F | grep ’/$’
Download/
Mail/
Projects/
tmp/

กลับกัน ถา้ คณุ ตอ้ งการช่อื ไฟลป์ กติ ไมใ่ ชไ่ ดเรกทอรี คณุ กใ็ ชต้ วั เลือก -v กลบั ผลลัพธ์เสยี

thep@anubis:~$ ls -F | grep -v ’/$’
a.out*
bye.c
hello.c

4.3.4 wc

ไมใ่ ช่หอ้ งนำ้ แต่คือ word count เป็นคำสั่งนับจำนวนอกั ขระ จำนวนคำ และจำนวนบรรทัดในไฟล์

คำสั่ง wc – นบั จำนวนอกั ขระ จำนวนคำ และจำนวนบรรทดั

รูปแบบ wc [ตัวเลือก] [file . . . ]

คำบรรยาย แสดงจำนวนอกั ขระ จำนวนคำ และจำนวนบรรทัดใน file หรือถา้ ไม่กำหนด file
ก็จะนบั ขอ้ มลู ใน standard input

ตวั เลือก -l แสดงจำนวนบรรทัด
-w แสดงจำนวนคำ
-c แสดงจำนวนอกั ขระ

เช่น เมอื่ ใช้กับไฟลป์ กติ

thep@anubis:~$ cat hello.c
#include <stdio.h>


Click to View FlipBook Version