ใน mac และ linux นั้นไฟล์แต่ละไฟล์จะมีกำหนดสิทธิ์ในการใช้งานทำอะไรต่างๆอยู่ ใช้กำหนดว่าใครจะสามารถมาทำอะไรกับไฟล์นี้ได้บ้าง ซึ่งมีประโยชน์เวลาที่ใช้คอมพิวเตอร์ร่วมกันหลายคน
linux เครื่องนึงมักจะเปิดเป็นเซิร์ฟเวอร์ให้คนเชื่อมต่อเข้ามาใช้ได้หลายคน ดังนั้นเรื่องสิทธิ์จึงมีความสำคัญ เพราะไฟล์บางไฟล์ก็อาจไม่อยากให้ผู้ใช้คนอื่นมาเปิดดูหรือใช้งานได้
ดังนั้นเราจึงอาจจำเป็นต้องทำความเข้าใจเรื่องสิทธิ์ของไฟล์กันสักหน่อย
** บทความนี้เป็นส่วนหนึ่งของเรื่อง
การใช้ unix shell เบื้องต้น ใน linux และ mac
เนื้อหาเสริมต่อจาก
https://phyblas.hinaboshi.com/20190125 วิธีการดูสิทธิ์ของไฟล์ การดูสิทธิ์ของไฟล์ทำได้ง่ายผ่านทางหน้าต่างดูไฟล์โดยคลิกขวาที่ไฟล์แล้วเลือก "คุณสมบัติ" หรืออาจกด ctrl+i
เลื่อนมาดูตรง "สิทธิ์" จะเห็นว่ามีระบุว่าทำอะไรได้บ้างและสามารถปรับเปลี่ยนได้
และอีกวิธีคือดูผ่านคอมมานด์ไลน์โดยพิมพ์
ls -l
ลองสั่งดูแล้วจะขึ้นประมาณนี้
drwxr-xr-x 2 phyblas phyblas 4096 ม.ค. 21 20:46 เอกสาร
-rw-r--r-- 1 phyblas phyblas 0 ม.ค. 25 21:03 แฟ้มเปล่า.txt
(ฯลฯ)
ดูตรงอักษร ๑๐ ตัวทางซ้ายสุด ตัวแรกจะบอกชนิดไฟล์ ถ้าเป็น d คือโฟลเดอร์ ถ้าเป็น - คือไฟล์ธรรมดา
ตั้งแต่ตัวที่ ๒ เป็นส่วนที่บอกถึงสิทธิ์ สิทธิ์จะแบ่งออกเป็น ๓ ส่วนก็คือ
- ตัวที่ ๒-๔ สิทธิ์ของตัวเจ้าของไฟล์เอง
- ตัวที่ ๕-๗ สิทธิ์ของคนในกลุ่ม
- ตัวที่ ๘-๑๐ สิทธิ์ของคนอื่นๆ
ส่วนชื่อ phyblas ที่เห็นอยู่ถัดมานี้ตัวซ้ายเป็นชื่อเจ้าของไฟล์ ตัวขวาเป็นชื่อกลุ่ม โดยพื้นฐานแล้วโดยตั้งต้นผู้ใช้จะสังกัดอยู่ในกลุ่มที่มีชื่อเดียวกับตัวผู้ใช้เอง ไฟล์ที่ถูกผู้ใช้สร้างขึ้นจึงมีชื่อกลุ่มเป็นชื่อผู้ใช้เองด้วย
อย่างไรก็ตามสิทธิ์เหล่านี้แสดงถึงสิทธิ์ของผู้ใช้ธรรมดาเท่านั้น แต่สำหรับ root (superuser) จะเข้าไปทำอะไรกับไฟล์ก็ได้โดยไม่ต้อนสนเรื่องสิทธิ์ เพราะว่าเป็นผู้ดูแลระบบทั้งหมด
ความหมายของสิทธิ์สำหรับไฟล์ทั่วไป ตัวอักษรที่แสดงถึงสิทธิ์นั้นมีอยู่กลุ่มละ ๓ ตัว แสดงถึง ๓ สิ่งที่ต้องใช้สิทธิ์ ซึ่งความหมายจะต่างกันไปสำหรับไฟล์ทั่วไปและโฟลเดอร์
สำหรับไฟล์ทั่วไปแล้ว ๓ อย่างนั้นคือ
r = อ่านไฟล์
w = เขียนแก้ไขไฟล์ ลบไฟล์ หรือย้ายไฟล์
x = รันไฟล์
ถ้ามีตัวอักษรอยู่แสดงว่ามีสิทธิ์นั้น แต่ถ้าเป็น - จะแสดงว่าไม่มี
โดยพื้นฐานแล้วไฟล์ที่ถูกสร้างขึ้นมาใหม่จะมีค่าเป็น
-rw-r--r--
หมายความว่าเจ้าของไฟล์จะมีสิทธิ์อ่านและเขียนไฟล์ได้ แต่รันไม่ได้ ส่วนคนในกลุ่มและคนอื่นๆมีสิทธิ์แค่อ่านไฟล์เท่านั้น
การที่มี r อยู่คืออ่านไฟล์ได้ หมายถึงว่าสามารถสั่ง cat เพื่อดูเนื้อความข้างในได้ หรือใช้ gedit หรือ vi เปิดอ่านได้
เพียงแต่ถ้าไม่มี w ก็จะอยู่ในโหมด "อ่านอย่างเดียว" เท่านั้น
ถ้ามี w ก็จะแก้ไขไฟล์ได้ตามที่ต้องการ จะเปลี่ยนชื่อไฟล์หรือย้ายไฟล์ก็ได้ หรือจะลบไฟล์ทิ้งไปก็ได้
ส่วน x หมายถึงว่าสามารถรันไฟล์ได้ เพียงแต่ว่าการรันไฟล์ที่ว่านี้คือการสั่งรันโดยพิมพ์ชื่อไฟล์โดยตรง ไม่ใช่รันผ่านโปรแกรมอื่นอีกที
เช่นโปรแกรมภาษาไพธอนที่เขียนขึ้น ไม่จำเป็นจะต้องมี x ก็รันได้ เช่น
echo "print(555)" > 555.py
python 555.py
แบบนี้จะพบว่ารันได้ตามปกติ เพราะการรันไพธอนในที่นี้เป็นแค่การเปิดอ่านโค้ดจากไฟล์มาป้อนให้คำสั่ง python อีกที ไม่ใช่การรันตัวไฟล์นั้นโดยตรง
แต่ถ้าพยายามจะสั่งรันไฟล์นั้นโดยตรงโดยพิมพ์
./555.py
ก็จะขึ้นมาว่าเราไม่มีสิทธิ์รันไฟล์
เกี่ยวกับเรื่องการเขียนไพธอนให้รันโดยตรงได้นั้นได้มีเขียนอธิบายไว้ใน
https://phyblas.hinaboshi.com/20190108 ถ้าเข้าไปดูโฟลเดอร์ /bin ซึ่งเป็นที่เก็บคำสั่งหลักๆ จะเห็นว่าทุกไฟล์มีสถานะเป็น
-rwxr-xr-x
คือใครจะมาสั่งรันก็ได้ ไฟล์พวกนี้มีไว้เพื่อให้รันโดยตรง
อย่างไรก็ตาม ต่อให้มีแค่ x แต่ไม่มี r อยู่ก็ไม่สามารถรันไฟล์ได้จริงๆเหมือนกัน ดังนั้นการรันไฟล์ต้องมีทั้ง x และ r
ดังนั้นสิทธิ์ในการอ่านสำคัญกว่าสิทธิ์ในการรันมากนัก
ความหมายของสิทธิ์สำหรับโฟลเดอร์ ความหมายของสิทธิ์สำหรับโฟลเดอร์แล้วจะต่างจากไฟล์เล็กน้อย สำหรับโฟลเดอร์แล้วสิทธิ์ ๓ อย่างคือ
r = ดูว่าในโฟลเดอร์มีอะไรบ้าง
w = ใส่เพิ่มหรือแก้ไขหรือลบไฟล์ในโฟลเดอร์ หรือย้ายหรือลบโฟลเดอร์
x = เข้าไปในโฟลเดอร์ และใช้ไฟล์ในโฟลเดอร์นั้น
โดยพื้นฐานแล้วโฟลเดอร์ที่สร้างขึ้นมาใหม่จะมีสิทธิ์เป็น
drwxr-xr-x
ซึ่งหมายความว่าเจ้าของไฟล์ทำได้ทั้งดูเนื้อหาและเข้าไปหรือแก้ไขอะไรๆในโฟลเดอร์ได้ แต่คนในกลุ่มและคนอื่นจะดูข้างในหรือเข้าไปได้แต่จะแก้อะไรไม่ได้
สำหรับโฟลเดอร์แล้ว x สำคัญมาก เพราะถ้าไม่มี x ก็จะเข้าไปดูอะไรในโฟลเดอร์ไม่ได้ แม้จะมี r ก็ตาม
การที่มี r แต่ไม่มี x หมายความว่าเราสามารถรู้ว่าภายในโฟลเดอร์นั้นมีอะไรอยู่บ้างได้ โดยใช้ ls แต่จะไม่สามารถรู้รายละเอียดของของในนั้น
ยกตัวอย่างเช่น โฟลเดอร์ /etc/xdg ซึ่งเป็นของ root โดยปกติสิทธิ์จะถูกตั้งไว้เป็น drwxr-xr-x
หมายความว่าผู้ใช้ธรรมดาจะมีสิทธิ์เข้าไปได้ คือสามารถพิมพ์
cd /etc/xdg
และสามารถใช้
ls /etc/xdg
ซึ่งจะแสดงเนื้อหาไฟล์ข้างในได้แบบนี้
total 20
drwxr-xr-x 2 root root 4096 ม.ค. 21 18:49 autostart
drwxr-xr-x 2 root root 4096 ส.ค. 10 22:54 menus
drwxr-xr-x 2 root root 4096 ก.ค. 25 2018 systemd
-rw-r--r-- 1 root root 414 มี.ค. 23 2018 user-dirs.conf
-rw-r--r-- 1 root root 418 มี.ค. 23 2018 user-dirs.defaults
แต่ถ้ามีใครมาเปลี่ยนสิทธิ์เป็น drwxr-xr-- ทีนี้ก็จะใช้ cd เพื่อเข้าไปไม่ได้ และถ้าใช้ ls ก็จะขึ้นว่า
ls: ไม่สามารถเข้าถึง '/etc/xdg/menus': Permission denied
ls: ไม่สามารถเข้าถึง '/etc/xdg/systemd': Permission denied
ls: ไม่สามารถเข้าถึง '/etc/xdg/user-dirs.conf': Permission denied
ls: ไม่สามารถเข้าถึง '/etc/xdg/user-dirs.defaults': Permission denied
ls: ไม่สามารถเข้าถึง '/etc/xdg/autostart': Permission denied
total 0
d????????? ? ? ? ? ? autostart
d????????? ? ? ? ? ? menus
d????????? ? ? ? ? ? systemd
-????????? ? ? ? ? ? user-dirs.conf
-????????? ? ? ? ? ? user-dirs.defaults
นั่นคือเรามีสิทธิ์ที่จะดูว่าในนั้นมีไฟล์หรือโฟลเดอร์ย่อยชื่ออะไรบ้าง แต่จะไม่รู้ว่าไฟล์นั้นเป็นยังไง รู้แค่ชื่อเท่านั้น
แต่ถ้ามี x แต่ไม่มี r นั่นหมายความว่าเราสั่ง cd เพื่อเข้าไปในโฟลเดอร์นั้นได้ แต่หลังจากนั้นก็มองอะไรไม่เห็น เหมือนเข้าไปอยู่ในห้องที่ปิดไฟมืดมิด
เพียงแต่ถ้าเรารู้อยู่ก่อนแล้วว่าข้างในนั้นมีไฟล์อะไรก็สามารถใช้งานไฟล์นั้นได้ตามสิทธิ์ของไฟล์นั้นหากพิมพ์ชื่อไฟล์นั้นถูก เช่น
cat xdg/user-dirs.conf
แบบนี้ทำได้โดยที่โฟลเดอร์มีแค่สิทธิ์ x ไม่ต้องมี r
ส่วนความหมายของ w นั้นจะใกล้เคียงกับกรณีของไฟล์ธรรมดา
เพียงแต่ว่าผลของ w จะส่งผลไปถึงไฟล์ด้านในโฟลเดอร์นั้นด้วย กล่าวคือต่อให้ไฟล์นั้นมี w อยู่ แต่ถ้าอยู่ในโฟลเดอร์ที่ไม่มี w ก็ไม่สามารถไปแก้อะไรได้
หรือสมมุติว่าไฟล์ของ phyblas อยู่ในโฟลเดอร์ของ root ถ้าโฟลเดอร์นั้นเป็น drwxr-xr-x แบบนี้ phyblas ก็ไม่สามารถแก้ไขอะไรไฟล์นี้ได้ ไม่ว่าสิทธิ์ของไฟล์จะตั้งไว้ยังไงก็ตาม
การแก้ไขสิทธิ์ คำสั่งที่ใช้ในการแก้ไขสิทธิ์ของไฟล์คือ chmod
วิธีการเขียนมีหลายแบบ แบบหนึ่งคือให้ระบุค่าสิทธิ์ของแต่ละส่วนเขียนต่อกันไปโดยคั่นด้วยจุลภาค , โดยแต่ละส่วนใช้อักษรย่อคือ
u ผู้ใช้
g กลุ่ม
o คนอื่น
เขียนดังนี้
chmod u=สิทธิ์ผู้ใช้,g=สิทธิ์กลุ่ม,o=สิทธิ์คนอื่น ชื่อไฟล์
ตัวอย่างเช่น
chmod u=rwx,g=rx,o= แฟ้มA.txt
จะกลายเป็น
-rwxr-x---
u,g,o ไม่จำเป็นต้องใส่ทั้งหมด ถ้าอันไหนไม่ใส่อันไหนอันนั้นก็จะไม่เปลี่ยนแปลง
เช่นถ้าต้องการตัดสิทธิ์คนในกลุ่มทั้งหมด ส่วนอย่างอื่นคงเดิมก็
chmod g= แฟ้มA.txt
จะกลายเป็น
-rwx------
อีกวิธีนึงคือใช้ + หรือ - จะเป็นการเพิ่มหรือลบตัวที่ต้องการ
เช่นเพิ่ม rx ให้กลุ่มโดยใช้ +
chmod g+rx แฟ้มA.txt
จะกลายเป็น
-rwxr-x---
หรือลองเอาสิทธิ์ออกโดยใช้ - เช่น
chmod u-w,g-wx แฟ้มA.txt
จะกลายเป็น
-r-xr-----
อันไหนที่ไม่มีอยู่แต่แรกแล้วก็ไม่โดนลบแต่อย่างใด
นอกจากนี้ยังมีอีกวิธีนึงในการใช้ซึ่งเข้าใจยากหน่อยแต่หากเข้าใจแล้วจะใช้งานได้สะดวกมาก นั่นคือใช้ตัวเลข 0 ถึง 7 แทนสิทธิ์ของทั้ง ๓ ตัวในทีเดียว
เนื่องจากสิทธิ์มี ๓ ตัว เท่ากับว่าจะมี 2×2×2 = 8 แบบ ที่เป็นไปได้ จึงใช้เลข 0 ถึง 7 แทนได้ ดังนี้
เลข |
เท่ากับ |
เลขฐานสอง |
สิทธิ์ |
0 |
0+0+0 |
000 |
--- |
1 |
0+0+1 |
001 |
--x |
2 |
0+2+0 |
010 |
-w- |
3 |
0+2+1 |
011 |
-wx |
4 |
4+0+0 |
100 |
r-- |
5 |
4+0+1 |
101 |
r-x |
6 |
4+2+0 |
110 |
rw- |
7 |
4+2+1 |
111 |
rwx |
ที่มาของตัวเลขที่ใช้แทนแบบต่างๆนั้นมาจากการคิดเลขแบบฐานสอง โดยที่
มี r ให้บวก 4
มี w ให้บวก 2
มี x ให้บวก 1
วิธีเขียนให้เขียนเป็นเลข ๓ ตัวต่อกัน ซึ่งแทนค่าสิทธิ์ของผู้ใช้, กลุ่ม และ คนอื่น ตามลำดับ
ตัวอย่างการใช้งาน
chmod 777 แฟ้มA.txt # ได้ -rwxrwxrwx
chmod 754 แฟ้มB.txt # ได้ -rwxr-xr--
chmod 500 แฟ้มC.txt # ได้ -r-x------
chmod 000 แฟ้มD.txt # ได้ ----------
chmod 124 แฟ้มE.txt # ได้ ---x-w-r--
เมื่อเขียนแบบนี้แล้วจะเขียนสั้นสบายกว่ามาก วิธีนี้จึงค่อนข้างนิยม
chmod จะใช้แก้ไขสิทธิ์ได้แค่ไฟล์ของตัวเองเท่านั้น แก้ไฟล์ของคนอื่นไม่ได้
ถ้าเป็นไฟล์ของตัวเองเรามีสิทธิ์จะเปลี่ยนแปลงสิทธิ์ของไฟล์นั้น ต่อให้สิทธิ์ไม่มี rwx อยู่เลยก็ตาม เช่นต่อให้เปลี่ยนไฟล์นึงเป็น ---------- ไป ก็สามารถพิมพ์ chmod 700 เปลี่ยนกลับมาเป็น rwx------ เพื่อให้ตัวเองใช้ไฟล์ได้
ค่า rwx นี้ไม่ได้รวมถึงสิทธิ์ในการเปลี่ยนสิทธื์ ดังนั้นตราบใดที่เป็นไฟล์ของเราเองจะเปลี่ยนสิทธิ์ให้ตัวเองสามารถใช้แบบไหนยังไงก็ได้
การเปลี่ยนเจ้าของไฟล์หรือกลุ่ม คำสั่งที่ใช้ในการเปลี่ยนเจ้าของไฟล์คือ chown
เพียงแต่ว่าคนที่จะใช้คำสั่งนี้ได้คือ root เท่านั้น หรือไม่ก็ต้องใช้ sudo
วิธีการใช้คือ
chown ชื่อผู้ใช้:ชื่อกลุ่ม ชื่อไฟล์
และเวลาที่เปลี่ยนเจ้าของโฟลเดอร์หากต้องการเปลี่ยนเจ้าของของไฟล์หรือโฟลเดอร์ย่อยด้านในนั้นทั้งหมดไปด้วยให้เติมตัวเลือก -R เข้าไป
ตัวอย่าง
sudo chown -R root:root home/phyblas/ดาวน์โหลด
ถ้าจะเปลี่ยนแค่ผู้ใช้ ไม่เปลี่ยนกลุ่มก็แค่ไม่ใส่ชื่อกลุ่ม
sudo chown -R phyblas home/phyblas/ดาวน์โหลด
ถ้าจะเปลี่ยนแค่กลุ่มให้ไม่ใส่ชื่อผู้ใช้ แต่ใส่ชื่อกลุ่มไว้หลัง :
sudo chown -R :root home/phyblas/ดาวน์โหลด
สำหรับกรณีแค่เปลี่ยนกลุ่มอาจไม่จำเป็นต้องเป็น root ก็ได้หากผู้ใช้นั้นเป็นเจ้าของไฟล์ แต่ก็แค่สามารถเปลี่ยนมาเป็นกลุ่มที่ตัวเองอยู่เท่านั้น
สมมุติว่ามีไฟล์นึง สั่ง ls -l แล้วขึ้นแบบนี้
-rw-r--r-- 1 phyblas root 222 ม.ค. 25 21:48 xxx.txt
phyblas สามารถสั่ง
chown :phyblas xxx.txt
แล้วก็จะกลายเป็น
-rw-r--r-- 1 phyblas phyblas 222 ม.ค. 25 21:48 xxx.txt
นอกจากนี้การเปลี่ยนแค่ชื่อกลุ่มยังอาจใช้คำสั่ง chgrp ได้ด้วย
chgrp ชื่อกลุ่ม ชื่อไฟล์
เช่น
chgrp phyblas home/phyblas/ดาวน์โหลด
ปกติเวลาคัดลอกไฟล์ด้วยคำสั่ง cp สิทธิ์ของไฟล์ที่คัดลอกมาจะเป็นของผู้ใช้คนนั้น ดังนั้นปกติไม่จำเป็นที่จะต้องมาใช้ chown เพื่อเปลี่ยน
เพียงแต่ว่า แสดงว่าผู้ใช้คนนั้นจะต้องมีสิทธิ์ในการอ่านไฟล์นั้นอยู่แล้วตั้งแต่แรกจึงจะทำการคัดลอกไฟล์มาได้
ถ้าใช้ root หรือ sudo คัดลอกไฟล์ สิทธิ์ของไฟล์ก็จะเป็นของ root ถึงตอนนั้นก็จำเป็นต้องใช้ chown
ไฟล์ที่สร้างขึ้นจากคำสั่ง sudo เจ้าของไฟล์ก็จะเป็น root เช่นกัน
ทั้ง chmod, chown และ chgrp สามารถใส่ชื่อไฟล์หลายไฟล์ หรือเขียนในรูปแบบกล็อบ (เช่น *.txt) เพื่อจัดการไฟล์พร้อมกันหลายไฟล์ได้
เช่นเปลี่ยนไฟล์ในบ้านตัวเองให้ใครก็ได้มาใช้ได้ก็อาจเขียนเป็น
chmod 777 ~/*
และสามารถเติมตัวเลือกเสริม -v ลงไปเพื่อให้บอกว่ามีการเปลี่ยนแปลงยังไงกับแต่ละไฟล์ เช่น
chmod -v 777 เอกสาร
จะขึ้นมาว่า
mode of 'เอกสาร' changed from 0755 (rwxr-xr-x) to 0777 (rwxrwxrwx)
ถ้าลองสั่งอีกทีจะขึ้นว่า
mode of 'เอกสาร' retained as 0777 (rwxrwxrwx)
เพราะค่าเดิมเท่ากับค่าที่ต้องการเปลี่ยนอยู่แล้ว
อ้างอิง