Permission denied ใน Linux: 10 กรณี รวมถึง /dev/null
Permission denied คือข้อผิดพลาดใน Linux ที่ขึ้นเมื่อบัญชีที่คุณใช้อยู่ไม่มีสิทธิ์ใช้ไฟล์ โฟลเดอร์ หรือคำสั่งนั้น ให้เลือกกรณีของคุณจากชื่อคำสั่งและพาธที่อยู่ต้นบรรทัดข้อผิดพลาด ตรวจสิทธิ์และเจ้าของด้วย ls -l แล้วรันใหม่ด้วยสิทธิ์หรือบัญชีที่เหมาะกับกรณีนั้นก็จะแก้ได้
ผลลัพธ์ด้านล่างได้จากการรันด้วยบัญชี root บนเซิร์ฟเวอร์ AlmaLinux 9.8 และบัญชีทั่วไปบนเซิร์ฟเวอร์ Debian 12 โดยชื่อบัญชี ชื่อโฮสต์ และเวลาในผลลัพธ์ของ /dev/null เป็นค่าตัวอย่าง
1️⃣ หาสาเหตุของ Permission denied
บรรทัดข้อผิดพลาดจะจบในรูป [คำสั่ง: เป้าหมาย: Permission denied] และดูได้จากชื่อคำสั่งกับพาธที่อยู่ข้างหน้าว่าถูกปฏิเสธที่ใด ในแผนภาพด้านล่าง ถ้าเลือกข้อความข้อผิดพลาดที่คล้ายกับบนหน้าจอของคุณ จะเห็นคำสั่งที่ควรตรวจก่อนและส่วนที่ควรอ่านในบทความนี้
2️⃣ Permission denied ที่พบบ่อย
🔲 สิทธิ์อ่านและเขียนไฟล์
การอ่านไฟล์ต้องมีสิทธิ์อ่าน (r) และการแก้หรือสร้างไฟล์ใหม่ต้องมีสิทธิ์เขียน (w) ในบัญชีนั้น secret.txt ที่ตั้งสิทธิ์เป็น 600 อ่านและเขียนได้เฉพาะ root ที่เป็นเจ้าของ
ls -l secret.txt-rw------- 1 root root 16 Oct 29 00:29 secret.txtrunuser -u daemon -- cat secret.txtcat: secret.txt: Permission deniedเมื่ออ่านไฟล์เดียวกันด้วยบัญชีอื่นคือ daemon ก็ถูกปฏิเสธทันที การสร้างไฟล์ในโฟลเดอร์ที่ไม่มีสิทธิ์เขียนก็ได้ข้อผิดพลาดเดียวกัน บนเซิร์ฟเวอร์ Debian 12 ด้วยบัญชีทั่วไป touch ถูกปฏิเสธในโฟลเดอร์ lock ที่ตั้งสิทธิ์เป็น 000
touch ~/touchtest/lock/x.txttouch: cannot touch '/home/user/touchtest/lock/x.txt': Permission deniedในช่องแรกของ ls -l ให้ดูตามลำดับเจ้าของ กลุ่ม และบัญชีอื่นว่ามี r และ w หรือไม่ แล้วเพิ่มสิทธิ์ด้วย chmod เฉพาะบัญชีที่ต้องใช้ หรือเปลี่ยนเจ้าของด้วย chown
🔲 สิทธิ์ผ่านโฟลเดอร์
แม้สิทธิ์ไฟล์จะถูกต้อง ถ้าโฟลเดอร์กลางพาธไม่มีสิทธิ์ x ก็จะเข้าไม่ถึงไฟล์ข้างใน สำหรับโฟลเดอร์ x คือสิทธิ์ผ่านโฟลเดอร์นั้นเข้าไปข้างใน และ r คือสิทธิ์อ่านรายชื่อข้างใน
ls -ld web web/cssdrw-r--r-- 3 root root 35 Oct 29 00:29 web
drw-r--r-- 2 root root 23 Oct 29 00:29 web/cssrunuser -u daemon -- ls -l webls: cannot access 'web/css': Permission denied
ls: cannot access 'web/index.html': Permission denied
total 0
d????????? ? ? ? ? ? css
-????????? ? ? ? ? ? index.htmlโฟลเดอร์ web มีแค่ r ทำให้ daemon อ่านชื่อข้างในได้ถึง css และ index.html แต่เพราะไม่มี x สิทธิ์และขนาดจึงเหลือเป็นเครื่องหมายคำถาม กลับกัน โฟลเดอร์ site ที่มีแค่ x ไม่มี r ถูกปฏิเสธการแสดงรายการ แต่ไฟล์ที่รู้ชื่ออยู่แล้วอ่านได้
ls -ld sitedrwx--x--x 2 root root 24 Oct 29 00:29 siterunuser -u daemon -- ls sitels: cannot open directory 'site': Permission deniedrunuser -u daemon -- cat site/index.html<h1>index</h1>ถ้าพาธยาว ให้ใช้ ls -ld ตรวจทีละโฟลเดอร์จากบนลงล่างว่ามี x หรือไม่ แล้วเพิ่มเฉพาะ x ที่บัญชีนั้นต้องใช้ผ่านให้กับโฟลเดอร์ที่ถูกปฏิเสธ
🔲 สิทธิ์รัน
การรันสคริปต์แบบ ./ชื่อไฟล์ ต้องมีสิทธิ์ x ในไฟล์นั้น deploy.sh ที่มีสิทธิ์ 644 ถูกปฏิเสธการรัน
ls -l deploy.sh-rw-r--r-- 1 root root 8 Oct 29 00:29 deploy.sh./deploy.shbash: line 1: ./deploy.sh: Permission deniedเมื่อเพิ่ม x ให้เจ้าของด้วย chmod u+x ช่องแรกก็เปลี่ยนเป็น [-rwxr--r--]
chmod u+x deploy.shls -l deploy.sh-rwxr--r-- 1 root root 8 Oct 29 00:29 deploy.shถ้ามีสิทธิ์ x แล้วแต่ยังรันไม่ได้ ให้ตรวจว่าระบบไฟล์ที่เก็บไฟล์นั้นเมานต์ด้วย noexec หรือไม่
🔲 การอ่านข้อมูลที่สงวนไว้ให้ root
บัญชีทั่วไปอ่านข้อมูลที่ระบบสงวนไว้ให้ root ไม่ได้ เช่น โปรเซสที่ root เปิด หรือข้อมูลรหัสผ่านของบัญชีอื่น บนเซิร์ฟเวอร์ Debian 12 การเปิดโฟลเดอร์ fd ของโปรเซสหมายเลข 1 ด้วยบัญชีทั่วไปทำให้เกิดข้อผิดพลาดด้านสิทธิ์
ls /proc/1/fdls: cannot open directory '/proc/1/fd': Permission deniedchage -l daemonchage: Permission denied.ข้อมูลวันหมดอายุรหัสผ่านของบัญชีอื่นก็ถูกปฏิเสธด้วยเหตุผลเดียวกัน และ /etc/shadow ที่เก็บข้อมูลนี้เป็นไฟล์ที่ตั้งไว้ไม่ให้ผู้ใช้ทั่วไปอ่าน ข้อผิดพลาดแบบนี้ไม่ต้องขยายสิทธิ์ ให้รันใหม่ด้วย sudo หรือบัญชี root
🔲 เมื่อ > ถูกปฏิเสธแม้ใส่ sudo แล้ว
sudo รันด้วย root เฉพาะคำสั่งที่เขียนตามหลัง ส่วนการเปิดไฟล์เพื่อเปลี่ยนทิศทาง (>) นั้นเชลล์ของบัญชีที่ใช้อยู่จัดการก่อนคำสั่งจะรัน ดังนั้นถ้าเปลี่ยนทิศทางผลลัพธ์ของ sudo echo ไปยังไฟล์ที่เขียนได้เฉพาะ root บรรทัดข้อผิดพลาดจะขึ้นต้นด้วยชื่อเชลล์ในรูป [bash: พาธไฟล์: Permission denied]
sudo echo x > /root/test.txtถ้าจะให้การเปลี่ยนทิศทางทำด้วย root ด้วย ให้ครอบทั้งบรรทัดด้วย sh -c เพื่อรันเชลล์ทั้งตัวด้วย sudo คู่มือทางการของ sudo ก็ยกตัวอย่างการรันภายใน sh -c เพื่อให้การเปลี่ยนทิศทางทำงาน
sudo sh -c 'echo x > /root/test.txt'tee รับอินพุตมาตรฐานแล้วเขียนลงไฟล์ที่ระบุโดยตรง ดังนั้นเมื่อรัน tee ด้วย sudo ไฟล์จะถูกเปิดโดย tee ที่มีสิทธิ์ root และ tee ยังแสดงสิ่งที่รับมาบนหน้าจออีกครั้งด้วย
echo x | sudo tee /root/test.txt🔲 การเข้าสู่ระบบ SSH ถูกปฏิเสธ
ถ้ามี [บัญชี@ที่อยู่เซิร์ฟเวอร์:] อยู่หน้า Permission denied และในวงเล็บมีวิธียืนยันตัวตนอย่าง publickey แปลว่าถูกปฏิเสธในขั้นยืนยันตัวตนเข้าสู่ระบบ และจุดที่ต้องตรวจต่างจากสิทธิ์ไฟล์ sshd บนเซิร์ฟเวอร์ตั้ง StrictModes เป็นค่าเริ่มต้น yes จึงตรวจสิทธิ์และเจ้าของของโฟลเดอร์โฮมและไฟล์ของบัญชีนั้นก่อนรับการเข้าสู่ระบบ ถ้าโฟลเดอร์โฮม โฟลเดอร์ ~/.ssh และ ~/.ssh/authorized_keys ที่ใดที่หนึ่งให้บัญชีอื่นเขียนได้ sshd จะไม่ใช้ไฟล์คีย์นั้น จึงต้องใช้ ls -ld ตรวจว่าทั้งสามที่ไม่มีสิทธิ์ w ของบัญชีอื่น
⌨️ ตัวจำลอง Permission denied
ตัวจำลองด้านล่างเริ่มด้วยบัญชี root และใช้ runuser สลับเป็นบัญชีอื่นคือ daemon เพื่อดูผลลัพธ์ที่ถูกปฏิเสธในการอ่านไฟล์ การผ่านโฟลเดอร์ และสิทธิ์รันได้ด้วยตัวเอง
3️⃣ Permission denied ที่พบไม่บ่อย
ถ้าช่องสิทธิ์ถูกต้องแต่ยังถูกปฏิเสธ แปลว่ามีสิ่งที่ปฏิเสธจากนอกบิตสิทธิ์ เช่น นโยบาย SELinux หรือการเมานต์แบบ noexec ถ้ารันด้วย root แล้วยังถูกปฏิเสธการรัน ให้ตรวจว่าไฟล์นั้นไม่มีบิต x เลยหรือไม่
บนเซิร์ฟเวอร์ที่เปิด SELinux แม้บิตสิทธิ์จะถูกต้อง ถ้านโยบาย SELinux ปฏิเสธก็จะขึ้น Permission denied กรณีนี้ให้ตรวจบันทึกการปฏิเสธของ SELinux ก่อน บนเซิร์ฟเวอร์ที่ daemon audit ทำงานอยู่ บันทึกการปฏิเสธจะอยู่ใน /var/log/audit/audit.log เป็น [avc: denied] พร้อมการกระทำที่ถูกปฏิเสธ ชื่อคำสั่ง (comm) และชื่อเป้าหมาย (name)
ดูด้วย getenforce ว่า SELinux เปิดอยู่หรือไม่ แล้วรัน ausearch ด้วย root เพื่อตรวจบันทึกที่ถูกปฏิเสธวันนี้
getenforceausearch -m AVC,USER_AVC,SELINUX_ERR,USER_SELINUX_ERR -ts todayrsync daemonที่ได้ [Permission denied (13)] ตอนรับไฟล์ ก็เป็นกรณีที่ SELinux ปฏิเสธการเข้าถึงพาธของโมดูลเช่นกัน
บนระบบไฟล์ที่เมานต์ด้วย noexec จะรันไฟล์โดยตรงไม่ได้ แม้ใน ls -l จะเห็น x ก็จะถูกปฏิเสธด้วย [bash: พาธสคริปต์: Permission denied] ถ้าส่งโฟลเดอร์นั้นให้ findmnt -T จะเห็นตำแหน่งที่เมานต์และออปชัน ถ้าในออปชันมี noexec ก็คือกรณีนี้
findmnt -T /tmp -o TARGET,OPTIONSroot ผ่านการตรวจสิทธิ์ได้เกือบทั้งหมด แต่การรันจะอนุญาตเฉพาะเมื่อเจ้าของ กลุ่ม หรือบัญชีอื่นอย่างน้อยหนึ่งแห่งมี x ดังนั้นสคริปต์ที่ไม่มี x เลยจะถูกปฏิเสธแม้ root จะรันด้วย ./
เมื่อรัน deploy.sh ที่ช่องแรกเป็น [-rw-r--r-- 1 root root] ด้วย ./ จากบัญชี root ก็ขึ้น [bash: line 1: ./deploy.sh: Permission denied]
🔲 เมื่อ /dev/null กลายเป็นไฟล์ธรรมดา
ถ้าเข้า SSH ด้วยบัญชีทั่วไปแล้วมีบรรทัดด้านล่างขึ้นต่อกันก่อนพรอมต์ของเชลล์ ให้ตรวจก่อนว่า /dev/null ซึ่งเป็นอุปกรณ์อักขระที่ทุกบัญชีใช้ทิ้งผลลัพธ์ ได้กลายเป็นไฟล์ธรรมดาที่ root เป็นเจ้าของหรือไม่ จำนวนบรรทัดต่างกันในแต่ละเซิร์ฟเวอร์ตามจำนวนสคริปต์ profile ที่อ่านตอนเข้าสู่ระบบ และบนเซิร์ฟเวอร์เดียวกันข้อผิดพลาดนี้ไม่ขึ้นหลังสลับเป็น root
-bash: /dev/null: Permission denied
-bash: /dev/null: Permission denied
-bash: /dev/null: Permission denied
...ls -l /dev/null-rw-r--r-- 1 root root 55 Jan 10 09:00 /dev/nullstat -c %F /dev/nullregular fileช่องแรกเป็น [-rw-r--r--] และตำแหน่งขนาดขึ้น 55 แปลว่าข้อความข้อผิดพลาดที่คำสั่งอื่นทิ้งไว้สะสมอยู่ในไฟล์ ถ้าบรรทัดคำสั่งเก็บกวาดมีรูปแบบด้านล่างปนอยู่แล้วรันด้วย root คำสั่ง rm จะลบไฟล์อุปกรณ์ แล้วการเปลี่ยนทิศทาง 2>/dev/null ของคำสั่งถัดไปจะสร้างไฟล์ธรรมดาใหม่ที่ root เป็นเจ้าของด้วยชื่อเดิม
rm -f /dev/null 2>/dev/nullให้รันบรรทัดด้านล่างด้วย root การสร้างอุปกรณ์ใหม่ด้วยชื่อข้าง ๆ แล้วเขียนทับด้วย mv ทำให้ไม่มีช่วงที่ชื่อว่างเลย จึงไม่เหลือช่องให้การเปลี่ยนทิศทางอื่นสร้างไฟล์ธรรมดาขึ้นมาอีกระหว่างการลบกับการสร้าง
mknod -m 666 /dev/null.new c 1 3 && mv -f /dev/null.new /dev/null && ls -l /dev/nullcrw-rw-rw- 1 root root 1, 3 Jan 10 09:05 /dev/nullstat -c %F /dev/nullcharacter special file[c 1 3] ของ mknod คือหมายเลขของ /dev/null ในรายการหมายเลขอุปกรณ์ของเคอร์เนล หลังกู้คืนแล้ว echo x > /dev/null ของบัญชีทั่วไปก็จบโดยไม่มีข้อผิดพลาด การรีบูตก็อาจทำให้กลับมาได้ แต่บรรทัดเดียวด้านบนที่ไม่ต้องหยุดเซิร์ฟเวอร์จะเร็วกว่า
| ยืนยัน | ก่อนแก้ | หลังแก้ |
|---|---|---|
| ช่องแรกของ ls -l | -rw-r--r-- | crw-rw-rw- |
| ตำแหน่งขนาดของ ls -l | 55 | 1, 3 |
| stat -c %F | regular file | character special file |
| เขียนด้วยบัญชีทั่วไป | Permission denied | ไม่มีข้อผิดพลาด |
ผลลัพธ์ที่จะทิ้งให้ส่งไปแค่ >/dev/null หรือ 2>/dev/null และถ้าไม่ใช่ตอนกู้คืน อย่าใส่ /dev/null เป็นเป้าหมายของ rm หรือ mv
🔢 FAQ & เนื้อหาแนะนำ
เว็บเซิร์ฟเวอร์ · 403
ข้อผิดพลาด 403 ของ Apache หลังติดตั้ง APM (403 Forbidden)
บทความเกี่ยวกับกรณีที่เว็บเซิร์ฟเวอร์อ่านโฟลเดอร์เว็บไม่ได้ จนมี Permission denied ใน error_log และขึ้น 403
เว็บเซิร์ฟเวอร์ · 503
ข้อผิดพลาด 503 หลังติดตั้ง APM
บทความที่ตรวจด้วย error.log ในกรณีที่ Apache เชื่อมต่อซ็อกเก็ตของ php-fpm ไม่ได้จนขึ้น 503
ℹ️ ประกาศเรื่องลิงก์แอฟฟิลิเอต
เนื้อหาของเว็บไซต์นี้มีลิงก์แอฟฟิลิเอต หากผู้เข้าชมซื้อสินค้าหรือบริการผ่านลิงก์เหล่านี้ เว็บไซต์นี้จะได้รับค่าคอมมิชชันจากผู้ขาย ในกระบวนการนี้ ราคาที่ผู้ซื้อจ่าย(ราคาจะลดลงเมื่อมีโปรโมชัน↓)จะไม่สูงขึ้นแต่อย่างใด ราคา ส่วนลด และข้อมูลสต็อกที่แสดงเป็นข้อมูล ณ เวลาที่เขียนและอาจต่างจากความเป็นจริง โปรดตรวจสอบกับผู้ขายอีกครั้งก่อนซื้อ การเลือกและการประเมินสินค้าเขียนตามเกณฑ์ของเราเอง และการได้รับค่าคอมมิชชันหรือไม่ไม่มีผลต่อลำดับการแนะนำหรือเนื้อหาการประเมิน